For Eachを使ってsheet内のでセル位置を移動させながら、セルの内容が指定した文字と同じであるセル位置を検索します。例題として、他の家計簿を付けたWorkbookから指定した項目の日付と金額を抜き出し、合計金額を計算します。
For Each~Nextステートメント
For Each~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をご活用されてはいかがでしょうか。
以上、参考になれば幸いです。
コメント