Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
ループの終わり方が・・・
投稿日時: 20/03/03 11:54:43
投稿者: rinahana

いつもお世話になっております。
会員データは
@500件ほど
A担当係ごとに番号がつけてある(便宜上クラスと呼ぶ)
B会員データは担当係順に(担当係は50人くらいあり)ソート済み
Cクラスごとの会員数は決まっていない(奇数・偶数あり)
D会員カードを印刷する。(カードはA4用紙縦で2枚ずつ印刷)
以上の条件で印刷するコードを作り初めたのですが、クラスごとに印刷したところ
奇数の会員のクラスは最後のページの下のカードに次のクラスの会員が印刷されてしまいます。
これを会員数が奇数の場合は最後のページの下のカードは空白にするにはどんな制御がありますか?
正直なところ、forループや doループで考えて作成していますがどのように終わればいいのかが
わかっていません。
 
以下は考えたコードのループ部分です。
Sub 会員カード作成()
 〜〜
 〜〜
n = 1 'nは会員データの処理カウント
' スタートは各出力クラスのトップ行
' 件数は各クラスの会員数
For M = スタート - 1 To スタート + 件数 - 1 Step 2
n = M
For i = 1 To 2 ’上の段のカード と 下の段のカードを分ける
 If i = 1 Then
        j = 1  ’上の段の行位置
    Else
        j = 24 ’下の段の行位置
  End If
  
 Sheets("カード印刷用").Select
 
 位置T1(j, 1) = hyo(n, 5)
 位置T2(j, 1) = hyo(n, 8)
 位置T3(j, 1) = hyo(n, 11)
 〜〜
 〜〜
 位置T3(j, 30) = hyo(n, 13)
 位置T4(j, 1) = hyo(n, 17)
 位置T5(j, 1) = hyo(n, 18)
 位置T6(j, 1) = hyo(n, 20)
n = n + 1:
 
Next i
 
  Worksheets("カード印刷用").PrintPreview
 
Next M
    Application.ScreenUpdating = True
End Sub
 
宜しくお願いします。終了の仕方を教えて下さい。
 

回答
投稿日時: 20/03/03 12:55:45
投稿者: mattuwan44

Sub 会員カード作成2()
    Dim rngHyou As Range
    Dim rngPTemplate As Range
    Dim ixRow As Long
    Const o As Long = 24

    Set rngHyou = ActiveSheet.Range("A1").CurrentRegion
    Set rngPTemplate = Sheets("カード印刷用").Range("C5,E5,D10,F11")
    
    For ixRow = 2 To rngHyou.Rows.Count Step 2
        With rngPTemplate
            .Item(1).Value = rngHyou(ixRow, 5).Value
            .Item(2).Value = rngHyou(ixRow, 8).Value
            .Item(3).Value = rngHyou(ixRow, 11).Value
            .Item(4).Value = rngHyou(ixRow, 13).Value
        End If

        If rngHyou(ixRow, 1).Value = rngHyou(ixRow + 1, 1).Value Then
            With rngPTemplate.Offset(o)
                .Item(1).Value = rngHyou(ixRow, 5).Value
                .Item(2).Value = rngHyou(ixRow, 8).Value
                .Item(3).Value = rngHyou(ixRow, 11).Value
                .Item(4).Value = rngHyou(ixRow, 13).Value
            End With
        Else
            ixRow = ixRow - 1
        End If

        Worksheets("カード印刷用").PrintPreview
        
        With rngHyou
            Union(.Cells, .Offset(o)).ClearContents
        End With
    Next
End Sub

 
ぱっと思いついたのはこんな感じ。
うまくセルを指定できているかは不明。
作業(というか考え方)の流れの参考になれば。。。

投稿日時: 20/03/03 18:09:22
投稿者: rinahana

 mattuwan44さん ありがとうございました。
昔々 習った”コントロール・ブレイク”の手法を使うというのは 気が付きませんでした。
ありがとうございました。