スポンサーリンク
こんにちは、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のオートフィルタを利用して特定のキー列の値ごとにデータをフィルタリングし、それぞれのデータセットを印刷プレビューする目的で作成されました。以下は、このコードの主な機能と利点をまとめたものです。
コードの機能
- オートフィルタの有効性確認:
ActiveCell.Worksheet.AutoFilterMode
を使用して、アクティブなセルがオートフィルタを持っているかを確認します。 - オートフィルタのリセット:
rngAF.Worksheet.AutoFilter.ShowAllData
を使用して、オートフィルタのフィルタをリセットし、全データを表示します。 - キー列のデータ取得: 指定されたキー列のデータを取得します。重複を除いた一次元配列に変換するために、
GetSummary
関数を使用します。 - 各キーごとにフィルタリングと印刷プレビュー: 取得したキーごとにデータをフィルタリングし、
rngAF.AutoFilter KeyColumn, V
を使用して、印刷プレビューを表示します。実際の印刷は必要に応じて有効にできます。 - オートフィルタの最終リセット: 全ての処理が終了したら、再び
rngAF.Worksheet.AutoFilter.ShowAllData
を使用して、オートフィルタのフィルタをリセットします。
利点
- 柔軟性: オートフィルタを使用することで、異なるキーのデータセットを簡単に抽出できます。
- 効率的な印刷管理: キーごとにデータを印刷プレビューすることで、大量のデータの中から必要な情報を効率的に確認できます。
- 重複排除:
GetSummary
関数を使用して、キー列から重複を排除した一次元配列を取得できます。
このコードは、大量のデータを持つExcelシートで特定の条件に基づいてデータを抽出し、印刷する際に便利です。