2021年3月20日土曜日

EXCEL VBA で差し込み印刷

EXCELのテーブルをデータソースとし、同一ブック別シートの任意のセルに差し込む場合を想定します。

データテーブルができた時点で各項目がどのセルに挿入されるかは決まるので、差し込み先のセル番地を表した「セルテーブル」を別に作り、それをデータテーブルに順次当てはめていくイメージで設計します。





このようにするとコード上ではセル管理から完全に開放されます。





更に1ページに複数レコードを差し込むN-up印刷でもコードを変更する必要はありません。この場合、セルテーブルには一度に差し込むレコード数と同一の行数が必要です。所謂ハードコード的な部分はセルテーブルだけです。



Sub 差し込み印刷()

    Set wrksht = Worksheets("データ")
    Set outsht = Worksheets("ラベル")    '出力先シート
    '1行目(項目名)を除いた全範囲をセット
    Set celrng = wrksht.Range("セルテーブル").ListObject.DataBodyRange
    Set datarng = wrksht.Range("データテーブル").ListObject.DataBodyRange
    
    Dim idx As Integer
    idx = 1
    
    Do Until idx > datarng.Count
        For Each cel In celrng      'セルテーブル全行スキャン
            outsht.Range(cel.Value).Value = datarng(idx).Value
            idx = idx + 1           '最後まで通し番号
        Next cel
        
        Select Case MsgBox("続行", vbOKCancel)  '一時停止
            Case vbOK:      outsht.PrintOut
            Case vbCancel:  Exit Do
        End Select
    Loop
End Sub