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

プログラミングの勉強

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

For~Nextステートメント

 カウント変数が初期値から最終値に順番に代入されて処理を繰り返します。Stepを省略すると1づつカウント変数が変化し、ある数字を設定するとその数字毎に変化していきます。

  For カウンタ変数  初期値 To 最終値 Step 増減値
      処 理
  Next

 たとえば、For i=0 To 10 Step 2 とすると、0,2,4,6,8,10と i が変化します。
 sheet内のセルを探す場合は、たとえば、i を行番号、j を列番号として二重にForで変数を変化させることで、各セルの直 cells( i , j ) を使った処理が可能となります。

  For i  初期値 To 最終値 Step 増減値
      For j  初期値 To 最終値 Step 増減値
         セルの直 cells(i , j ) を使った処理
      Next
  Next

If~Thenステートメント

 If ~Thenステートメントでは条件が成立した場合に End If までに設定した処理を実施します。

  If 条件 Then
      条件が成立したときに実行する処理
  End If

 たとえば、i 行 j 列のセルの直 cells( i , j ) が文字列”a”である場合に処理を実行するのであれば、つぎのように記述します。

  If cell( i , j )=”a” Then
      セルの直が”a”であるときに実行する処理
  End If

検索プロシージャ例

 家計簿のExcelファイルから、ある指定した文字列に合致するセルを見つけ出して、日付と金額を抜き出すプロシージャを例として示します。実行例はつぎのようです。
 まず、プロシージャが書かれたExcelファイルの”B2:C2″に検索したい文字列を入力(この例では”京葉ガス”と入力)して、検索実行ボタンをクリックすると、

”ファイルを開く”ダイアログボックスが開きますので、検索したいExcelファイルを指定します。

 すると1月から12月までの12個のsheetを検索して、日付と金額が3行目から順に記入されて一番下の行に合計金額が表示されるというものです。

プロシージャの内容

 シート内での検索サブルーチンを示します。

Sub シート検索()
For i = 0 To 11
    Kakeibo.Activate                    '家計簿ファイルをアクティブにして
    Set Kwksht(i) = Worksheets(sht(i))  '1月から順にsheetをセット
    For j = 3 To 19 Step 2              '3列目から1つ飛びに列を
        For k = 5 To 35                 '5行目から35行まで1つづつ
        If Kwksht(i).Cells(k, j) = koumoku Then 'koumokuと同じセルであると
            ii = ii + 1                          '出力の行番号を設定
            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
    Next
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

 このプロシージャでは、セルC5から下方へ1行ずつ35行目まで読み取った後、2つ右の列の5行目(E5)へ移り、下方へ1行ずつという具合に、列は2列毎、行は1行毎読み込みます。そして、これがプロシージャファイルの項目セルから読み取った”koumoku”と同じであれば、同じ行の2列目の日付を”hizuke”に、ひとつ右隣の列の金額を”kingaku”に代入します。これらをプロシージャファイルのsheet(1)の3行目から順番に記入していきます。このときの行番号は同じ項目が見つかる毎に ii に1ずつ足していくことでカウントしています。合計額は順次”goukei”に加算していき、For~Nextでsheet”12月”のセルの検索が終了した時点でプロシージャファイルのsheet(1)に記入します。その後、記入セル範囲に罫線を引いて終了します。

 また、メインのプロシージャは以下のようです。

Option Explicit
Dim Thisbook As Workbook  'プロシージャを書いたExcelファイル
Dim Kakeibo As Workbook   'データを検索する家計簿を付けたExcelファイル
Dim wksht1 As Worksheet      'Thisbookのsheet
Dim Kwksht(11) As Worksheet 'Kakeiboの月毎のsheet
Dim fname As String       '家計簿のファイル名
Dim koumoku As String     '検索する文字
Dim hizuke As String            '検索した文字のある月日
Dim kingaku As Double, goukei As Double
Dim sht(11) As String          'Kwkshtのsheet名
Dim i As Long, j As Long, k As Long, ii As Long
Dim rng As Range

Sub 家計簿検索メイン()
sht(0) = "1月": sht(1) = "2月": sht(2) = "3月": sht(3) = "4月"
sht(4) = "5月": sht(5) = "6月": sht(6) = "7月": sht(7) = "8月"
sht(8) = "9月": sht(9) = "10月": sht(10) = "11月": sht(11) = "12月"
koumoku = Range("B2")        '検索する文字を読み込み
ii = 2
goukei = 0#
fname = Application.GetOpenFilename() '家計簿ファイルを指定する
If fname = "False" Then               'ファイルをキャンセルされると操作終了
    End
End If
Set Thisbook = ActiveWorkbook     'プロシージャを書いたファイルをThisbookにセット
Set wksht1 = Worksheets(1)        'sheet1をwkshtにセット
wksht1.Range("B3:C50").Clear      '1番目のsheetのデータをクリア
Workbooks.Open fname              '家計簿ファイルをオープン
Set Kakeibo = ActiveWorkbook      '家計簿ファイルをKakeiboにセット
Call シート検索
End Sub

なお、Workbookの設定やWorksheetの設定等については、以下の記事を参考にしてください。

 簡単な繰り返しのステートメントと、If ステートメントで合致するセルを探す簡単な方法ですが、何かと使い勝手が良いかと思います。
 なお、Findメソッドを用いた場合の検索方法を下記の記事に紹介しています。

 また、For Each~Nextステートメントを利用した場合を下記に紹介していますので、よろしければ併せてご確認ください。


以上、参考になれば幸いです。

コメント

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