マクロのコードは、繰り返し処理するFor と条件で分岐させるIFを覚えれば、あとはやりたい処理をそこにはめ込むだけです。今回はForを紹介していきます。
選択している複数のセルを順次処理、シートの各行を順次処理、開いているエクセルファイルの各シートを順次処理、特定のフォルダ内のファイルを順次処理、というよく使うFor~Next4選を紹介します。
選択している複数のセルを順次処理
まずは、選択中の複数のセルに順次処理をしていくFor~Nextです。
これは、以前の記事「選択したセルの参照元トレース、参照先トレースを一括で表示するマクロ」で使いました。
「 Each c 」の c に選択中のセル(Selection)のひとつを順番に入れていき処理していきます。
sub for_selection()
Dim c As Range 'セルを入れる変数の宣言
For Each c In Selection '選択中の各セルを順番に処理
'↓ここから各セルに行う処理を記載
'セルの参照元のトレースを表示
c.ShowPrecedents
'↑ここまでに各セルを行う処理を記載
Next
End Subシート内の行を順次処理
次は、シート内の行を順次処理していくFor~Nextです。
いろいろなやり方がありますが、ここでは、A列でデータが入っている最終行の値(last_row)をとって、[For r = 2 to Last_row 」で2行目から順次処理する方法のコードを挙げておきます。
下記はA列の値が偶数であればその行を水色に塗りつぶし、奇数であれば塗りつぶしなしにするマクロです。
Sub for_row()
Dim last_row As Long
Dim r As Long
'A列の一番下の行からxUpした行がデータの入っている最終行
last_row = Cells(Rows.Count, 1).End(xlUp).Row
For r = 2 To last_row 'rを処理する行数として使用する
'↓ここから処理を記載
'A列の値が偶数ならその行を水色に奇数なら塗りつぶしなしにする
If Cells(r, 1) Mod 2 = 0 Then
Rows(r).Interior.ColorIndex = 20
Else
Rows(r).Interior.ColorIndex = 0
End If
'↑ここまでに処理を記載
Next
End Sub6行目はデータがある最終列を取得するお決まりのパターンです。
Rows.Countでそのシートの行数(xlsx形式なら1048576行)の一番下を指定して、そこからxUpで手作業でいう「ctrl+↑」の操作と同様の処理をしてデータがある最後の行に移動しています。
そして、その行を.Rowで取得することで、変数のlast_rowにデータのある最終行を入れることができます。
(ただし、この方法はA列で判定するので、A列が空白でB列以降にデータがある場合は正しく判定できません。)
アクティブになっているエクセルファイルの各シートを順次処理
アクティブになっているExcelファイルの各シートを順次処理していくFor~Nextです。
「For Each ~ In Worksheets」で各シートを順次処理するループを回して、各シートのA1のセルにシート名を表示させる処理をさせています。
Sub for_ws()
Dim ws As Worksheet
For Each ws In Worksheets
'↓処理をここから記載
ws.Range("A1") = ws.Name
'↑ここまで処理を記載
Next
End Sub特定のフォルダ内のファイルを順次処理
最後に複数のファイルを順次処理するFor~Nextです。
マクロが保存されているxlsmファイルが保存されているフォルダに「print」というフォルダを用意してそこに印刷したいExcelファイルを保存しておき、マクロで一括で印刷するマクロです。
「Dim objFSO As Object」の行から4行は、変数の「dir_path」以外はお決まりのおまじないと思って使いましょう。
Sub for_file()
Dim dir_path As String
'フォルダの指定
dir_path = ThisWorkbook.Path & "\print\"
'ファイルシステムオブジェクト変数の準備
'4行セットでおまじないのような決まりごと
Dim objFSO As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim objFile As Object 'ファイルを格納するオブジェクト変数
For Each objFile In objFSO.GetFolder(dir_path).Files
'****↓↓ ここから各ファイルの処理 ↓↓*********
'ファイルを読み取り専用で開く
Workbooks.Open Filename:=dir_path & objFile.Name, ReadOnly:=True
'1枚目のシートを印刷
Sheets(1).PrintOut
'ファイルを閉じる
ActiveWorkbook.Close SaveChanges:=False
'********************** ここまで各ファイルの処理 *******************
Next objFile
End Sub今回は、For~Nextを4種類紹介しました。繰り返し処理するのはこれぐらいあれば、いろいろ組み合わせれば自動化できることが多くなります。
まずは簡単なFor~Nextからどんどん使ってみましょう。


コメント