VBA

VBA – オートフィルタで楽々データ印刷

こんにちは、Excel愛好者の皆さん!

今日は、ExcelのオートフィルタとVBAを駆使して、データの印刷をもっと便利に行える方法をご紹介します。大量のデータの中から特定の条件に基づいてデータを抽出し、それぞれのセットを簡単に印刷する手法を紹介します。

さぁ、Excelの新しい可能性を広げていきましょう!

実装

Sub PrintAutoFilter()
    Dim rngAF As Range
    Dim RR As Range
    Dim R As Range
    Dim VV As Variant
    Dim V As Variant
    Const KeyColumn As Long = 4 'キー列
    
    If Not ActiveCell.Worksheet.AutoFilterMode Then Exit Sub
    Set rngAF = ActiveCell.Worksheet.AutoFilter.Range
    
    'オートフィルタのフィルタリセット
    rngAF.Worksheet.AutoFilter.ShowAllData
    
    'キー列データ
    Set RR = rngAF.Columns(KeyColumn)
    Set RR = Intersect(RR, RR.Offset(1))
    VV = GetSummary(RR)
    
    '印刷ループ
    For Each V In VV
        rngAF.AutoFilter KeyColumn, V
        rngAF.PrintPreview
        'rngAF.PrintOut     '実際の印刷時にはこちらを有効にする
    Next
    
    'オートフィルタのフィルタリセット
    rngAF.Worksheet.AutoFilter.ShowAllData
End Sub

'Rangeを受け、重複の無い一次元配列(添え字0ベース)を返す
Private Function GetSummary(RR As Range) As Variant
    '返す配列の添え字下限は0
    Dim R As Range
    Dim Dic As Object
    Dim K As Variant
    Dim V As Variant
    
    Set Dic = CreateObject("Scripting.Dictionary")
    For Each R In RR.Cells
        K = R.Value
        If K <> "" Then
            Dic(K) = Empty
        End If
    Next
    V = Dic.keys
    Set Dic = Nothing
    
    GetSummary = V
End Function

解説

Sub PrintAutoFilter()
    Dim rngAF As Range
    Dim RR As Range
    Dim R As Range
    Dim VV As Variant
    Dim V As Variant
    Const KeyColumn As Long = 4 ' キー列
    
    ' オートフィルタが有効でない場合、処理を終了
    If Not ActiveCell.Worksheet.AutoFilterMode Then Exit Sub
    
    ' オートフィルタの範囲を取得
    Set rngAF = ActiveCell.Worksheet.AutoFilter.Range
    
    ' オートフィルタのフィルタをリセット
    rngAF.Worksheet.AutoFilter.ShowAllData
    
    ' キー列のデータを取得
    Set RR = rngAF.Columns(KeyColumn)
    Set RR = Intersect(RR, RR.Offset(1))
    VV = GetSummary(RR)
    
    ' 各キー毎にフィルタして印刷プレビュー
    For Each V In VV
        rngAF.AutoFilter KeyColumn, V
        rngAF.PrintPreview
        ' 実際に印刷する場合は以下のコードを有効にする
        ' rngAF.PrintOut
    Next
    
    ' オートフィルタのフィルタをリセット
    rngAF.Worksheet.AutoFilter.ShowAllData
End Sub
  • ActiveCell.Worksheet.AutoFilterMode: 現在のアクティブなセルがオートフィルタを持っているかを確認します。
  • rngAF.Worksheet.AutoFilter.ShowAllData: オートフィルタのフィルタをリセットして、全データを表示します。
  • rngAF.AutoFilter KeyColumn, V: キー列を使用して指定した値でフィルタリングします。
  • rngAF.PrintPreview: フィルタされたデータの印刷プレビューを表示します。実際の印刷はコメントアウトされていますが、必要に応じて有効にできます。
Private Function GetSummary(RR As Range) As Variant
    Dim R As Range
    Dim Dic As Object
    Dim K As Variant
    Dim V As Variant
    
    ' スクリプティング.Dictionaryオブジェクトを作成
    Set Dic = CreateObject("Scripting.Dictionary")
    
    ' キー列からデータを取得し、重複を除いた一次元配列を作成
    For Each R In RR.Cells
        K = R.Value
        If K <> "" Then
            Dic(K) = Empty
        End If
    Next
    
    ' 配列にスクリプティング.Dictionaryのキーを格納
    V = Dic.keys
    
    ' スクリプティング.Dictionaryオブジェクトを解放
    Set Dic = Nothing
    
    ' 重複のない一次元配列を返す
    GetSummary = V
End Function
  • CreateObject("Scripting.Dictionary"): スクリプティング.Dictionaryオブジェクトを作成します。これを使用して一時的に重複を除いたキーの一覧を取得します。
  • Dic(K) = Empty: スクリプティング.Dictionaryにキーを追加します。同じキーが既に存在する場合、追加されません。
  • V = Dic.keys: スクリプティング.Dictionaryのキーを配列に取得します。これがキー列の重複を取り除いた一次元配列になります。

このコードを使用すると、指定したキー列の値ごとにデータをフィルタリングして印刷プレビューすることができます。

まとめ


このVBAコードは、Excelのオートフィルタを利用して特定のキー列の値ごとにデータをフィルタリングし、それぞれのデータセットを印刷プレビューする目的で作成されました。以下は、このコードの主な機能と利点をまとめたものです。

コードの機能

  1. オートフィルタの有効性確認: ActiveCell.Worksheet.AutoFilterModeを使用して、アクティブなセルがオートフィルタを持っているかを確認します。
  2. オートフィルタのリセット: rngAF.Worksheet.AutoFilter.ShowAllDataを使用して、オートフィルタのフィルタをリセットし、全データを表示します。
  3. キー列のデータ取得: 指定されたキー列のデータを取得します。重複を除いた一次元配列に変換するために、GetSummary関数を使用します。
  4. 各キーごとにフィルタリングと印刷プレビュー: 取得したキーごとにデータをフィルタリングし、rngAF.AutoFilter KeyColumn, Vを使用して、印刷プレビューを表示します。実際の印刷は必要に応じて有効にできます。
  5. オートフィルタの最終リセット: 全ての処理が終了したら、再びrngAF.Worksheet.AutoFilter.ShowAllDataを使用して、オートフィルタのフィルタをリセットします。

利点

  • 柔軟性: オートフィルタを使用することで、異なるキーのデータセットを簡単に抽出できます。
  • 効率的な印刷管理: キーごとにデータを印刷プレビューすることで、大量のデータの中から必要な情報を効率的に確認できます。
  • 重複排除: GetSummary関数を使用して、キー列から重複を排除した一次元配列を取得できます。

このコードは、大量のデータを持つExcelシートで特定の条件に基づいてデータを抽出し、印刷する際に便利です。