【いちからExcel VBA】For EachとIfを使って指定した文字があるセルを検索

プログラミングの勉強


 For Eachを使ってsheet内のでセル位置を移動させながら、セルの内容が指定した文字と同じであるセル位置を検索します。例題として、他の家計簿を付けたWorkbookから指定した項目の日付と金額を抜き出し、合計金額を計算します。

For Each~Nextステートメント

 For Each~Nextステートメントを使用すると、コレクション(セル範囲)内の全てのオブジェクト(セル)を順番にオブジェクト変数に代入して処理を実行します。オブジェクト変数への代入は自動的に行われますが、代入されるオブジェクト変数は用意する必要があります。

構 文

For Each オブジェクト変数 In コレクション
     処  理
Next [オブジェクト変数]

家計簿検索のプロシージャ

 プロシージャは下記関連記事で利用したプロシージャを書き直したものです。

 関連記事では行をFor k~Nextで、列を For j~Nextでセルを指定しましたが、その部分をFor Eachで置き換えています。オブジェクト変数はRangeオブジェクトのrngを別途定義しています。また、項目が検索された場合のセル位置を知るために、それぞれ .Row.Columnで行番号および列番号を取得しています。その他は関連記事の内容と同じです。

Sub シート検索()
For i = 0 To 11
    Kakeibo.Activate                       '家計簿ファイルをアクティブにして
    Set Kwksht(i) = Worksheets(sht(i))
'-----C3:S35の範囲のセル(Rangeオブジェクト)に対して処理を繰り返す------
    For Each rng In Kwksht(i).Range("C3:S35") 
        If rng = koumoku Then
            ii = ii + 1
            k = rng.Row                    'セル(Rangeオブジェクト)の行番号取得
            j = rng.Column                 'セル(Rangeオブジェクト)の列番号取得
            hizuke = Kwksht(i).Cells(k, 2)      '日付を取得
            kingaku = Kwksht(i).Cells(k, j + 1) '金額を取得
            Thisbook.Activate                   'プロシージャファイルをアクティブにして
            wksht1.Cells(ii, 2).NumberFormat = "m月d日"
            wksht1.Cells(ii, 2) = hizuke        'hizukeを書き込む
            wksht1.Cells(ii, 3).NumberFormat = "#,000"
            wksht1.Cells(ii, 3) = kingaku       'kingakuを書き込む
            goukei = goukei + kingaku            '合計金額を計算
            Kakeibo.Activate            'Kakeiboをアクティブにしてつぎのセルへ
        End If
    Next rng
Next
Thisbook.Activate                         'プロシージャファイルをアクティブにして
wksht1.Cells(ii + 1, 2).HorizontalAlignment = xlCenter
wksht1.Cells(ii + 1, 2) = "合 計"
wksht1.Cells(ii + 1, 3).NumberFormat = "0,000"
wksht1.Cells(ii + 1, 3) = goukei                    'goukeiを書き込む
Set rng = Range(Cells(3, 2), Cells(ii + 1, 3))      '格子を引くセルを指定
rng.Borders.LineStyle = xlContinuous                '格子状に罫線を描く
End Sub

検索結果

 B2:C2に検索項目を指定して”検索実行”をクリック→ 検索する家計簿を選定→ 下図のように結果が出力されます。関連記事での結果と同じ結果が得られています。

 ここで示したようにFor Each を使用する場合は、代入されるオブジェクト変数を用意する必要がありますが、オブジェクト変数への代入は自動的に行われます。でその範囲のセルをRangeオブジェクトで受けて、それぞれ処理を実行する方法もありかと思います。For ~Nextでセルを設定するのが煩わしい場合には、For Eachをご活用されてはいかがでしょうか。
 以上、参考になれば幸いです。

コメント

タイトルとURLをコピーしました