マクロのコードは、繰り返し処理する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 Sub
6行目はデータがある最終列を取得するお決まりのパターンです。
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からどんどん使ってみましょう。
コメント