膨大な行数のテーブルに対して,ある条件でフィルタをかけて抽出したデータについて一括処理をしたい場合のコードです。
簡単な例として,上のテーブルで,建設年次が不明な橋梁を絞り込んで抽出し,それらの橋梁の建設後経過年数を高度経済成長期に建設されたと仮定してランダムに設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Option Explicit Sub 絞り込んだ行に対して処理を行うテスト() [crayon-607c8f72c2010392675841 ]<code>Dim C As Range With Sheets("Sheet1").ListObjects(1) '対象テーブルに対して '建設年次の列を「不明」で抽出する .Range.AutoFilter Field:=.ListColumns("建設年次").Index, _ Criteria1:="不明" '経過年数の列のデータの中から見えているセルを順次処理する For Each C In .ListColumns("経過年数").DataBodyRange.SpecialCells(xlCellTypeVisible) '高度経済成長期(1955〜1974)に建設された 'と仮定した橋梁の経過年数(2012年時点) C.Value = 2012 - (Int(Rnd() * 19) + 1955) Next C End With 'シートのフィルタを解除する With Sheets("Sheet1") If .FilterMode Then .ShowAllData End With |
End Sub
[/crayon]
〔10〜11行目〕
10 11 |
.Range.AutoFilter Field:=.ListColumns("建設年次").Index, _ Criteria1:="不明" |
建設年次の列の番号を指定して,1つめの条件が「不明」に一致するものをフィルタの条件としています。
〔14行目 For Each C In の後〕
14 |
.ListColumns("経過年数").DataBodyRange.SpecialCells(xlCellTypeVisible) |
経過年数の列(ListColumns)内のデータ(DataBodyRange)のうち,見えているセル(SpecialCells(xlCellTypeVisible))だけを対象に,その範囲のセルをひとつづつループの対象にします。
このループの中で,18行目のようにセルに対する処理を行います。
なお,このページの画像キャプチャはMac OSX版のExcel2011を用いて作成しています。Mac Excel 2011のVBA機能はWindows版との互換性がかなり低いですが,この程度であれば十分動くようです。