VBAには繰り返しの命令(ステートメント)が3つ(本当は4つ)あります。ひとつは回数による繰り返すのFor Nextステートメント。次に、条件による繰り返しのDo Loopステートメント。そして3つめがこのFor Eachステートメントです。これが分からないという方がとても多いです。なぜ分からないのか。その理由はさまざまですが、中でも「オブジェクト変数を使わなければならない」というのがネックになっているようです。今回の動画では、そのオブジェクト変数についても解説しています。ちなみに、4つめの繰り返し命令というのは、While Wendステートメントですが、使っている人はほとんどいませんし、そもそも知っている人が少ないです。While Wendは、Do Loopと同じ条件による繰り返しですが、Do Loopと同じことしかできず、さらに、Do Loopに比べてデメリットもあります。なので誰も使いませんし、知らなくていいやつです。
↓左上にある
をクリックすると、チャンネル登録できます。ぜひ、チャンネル登録をお願いします。あなたのチャンネル登録が、私のやる気を維持向上してくれます(笑)
【補足】
オブジェクト変数の解説、ちょっと分かりにくかったかもしれません。
6:26 で、セルをオブジェクト変数Cに入れていますが、
これは「セルA1とセルB2」という"2つのセル"を入れているのではありません。
まず「セルA1」ひとつだけを変数Cに入れると、変数Cを使ってセルA1を操作できますよと。
続いて、今度は変数Cに「セルB2」をひとつだけ入れると、同じ書き方(C.アドレスなど)で
「セルB2」を操作できるという意味です。
また、8:30 あたりで次の解説をしています。
Dim C As Range
Set C = Range("A1")
これは、オブジェクト変数を宣言するときは、オブジェクトの名前を型に指定する
ということがポイントです。ちなみに
セルを入れる → As Range
ワークシートを入れる → As Worksheet
ブックを入れる → As Workbook
などのように宣言します。今回はセルですから「As Range」です。
そして次の
Set C = Range("A1")
ですが、これは、オブジェクト変数を、For Each"ではない"ところで
単体で使用する場合の書き方です。変数CにセルA1を入れるときは、こう書きます。
その後、For Eachの解説では、この「Set」が出てきません。
本来、オブジェクト変数に何かを入れるときは、必ずSetをつけなければいけませんが、
For Eachは、それを内部でやってくれますので、For Each内でSetは書きません。
このへんも、多くの方が悩むポイントだと思います。
「For Eachの解説」には、その前に「オブジェクト変数の解説」が必要なので、
今回は2つのことを解説しましたが、オブジェクト変数に関しては、
今回の動画では触れていない、もう一つの使い方があります。それが実務でよく出てきます。
そのへんの話は、いずれ違う動画で解説するつもりです。
解説では「セルを1つずつ操作する」例を示していますが、最後の実例では
セル操作のコードをお見せしていません。
なので、下記リンクからダウンロードできるサンプルブックに、
「選択した複数のセルをひとつずつ操作する例」を書いておきます。
それを実行して、イメージしてください。
ちょっと、この動画に関しては悔いが残ります。
せっかく投稿したので、このまま残しておきますが、スッキリしなかった方、すみませんでした。
''すべてのシート操作(For Each)
Sub Macro1()
Dim A As Worksheet
For Each A In Sheets
A.Tab.Color = RGB(0, 0, 255)
Next A
End Sub
''すべてのシート操作(For Next)
Sub Macro2()
Dim i As Long
For i = 1 To Sheets.Count
Sheets(i).Tab.Color = RGB(255, 0, 0)
Next i
End Sub
''すべてのシェイプ(For Each)
Sub Macro3()
Dim A As Shape, cnt As Long
For Each A In ActiveSheet.Shapes
cnt = cnt + 1
A.Left = ActiveSheet.Shapes(1).Left
A.TextFrame2.TextRange.Characters.Text = cnt
A.Fill.ForeColor.RGB = RGB(255, 0, 0)
Next A
End Sub
''すべてのシェイプ(For Next)
Sub Macro4()
Dim i As Long, cnt As Long
For i = 1 To ActiveSheet.Shapes.Count
cnt = cnt + 1
ActiveSheet.Shapes(i).Left = ActiveSheet.Shapes(1).Left
ActiveSheet.Shapes(i).TextFrame2.TextRange.Characters.Text = cnt
ActiveSheet.Shapes(i).Fill.ForeColor.RGB = RGB(255, 0, 0)
Next i
End Sub
''すべてのシェイプ(For Next + With)
Sub Macro5()
Dim i As Long, cnt As Long
With ActiveSheet
For i = 1 To .Shapes.Count
cnt = cnt + 1
.Shapes(i).Left = .Shapes(1).Left
.Shapes(i).TextFrame2.TextRange.Characters.Text = cnt
.Shapes(i).Fill.ForeColor.RGB = RGB(255, 0, 0)
Next i
End With
End Sub
''1つ変数を使えば、もう少し短くなるか
Sub Macro6()
Dim i As Long, cnt As Long, N As Single
N = ActiveSheet.Shapes(1).Left
With ActiveSheet.Shapes(i)
For i = 1 To .Shapes.Count
cnt = cnt + 1
.Left = N
.TextFrame2.TextRange.Characters.Text = cnt
.Fill.ForeColor.RGB = RGB(255, 0, 0)
Next i
End With
End Sub
''すべてのブック-すべてのシート(For Each)
Sub Macro6()
Dim WB As Workbook, WS As Worksheet
For Each WB In Workbooks
For Each WS In WB.Sheets
WS.PrintOut
Next WS
Next WB
End Sub
''すべてのブック-すべてのシート(For Next)
Sub Macro7()
Dim i As Long, j As Long
For i = 1 To Workbooks.Count
For j = 1 To Workbooks(i).Sheets.Count
Workbooks(i).Sheets(j).PrintOut
Next j
Next i
End Sub
''オブジェクト変数によるコードの短縮化
Sub Macro8()
Dim i As Long
For i = 1 To 100
Workbooks("2020年度営業企画").Sheets("東京支店").Cells(i, 1).Copy Workbooks("2020年度営業企画").Sheets("東京支店").Cells(i, 2)
Next i
End Sub
Sub Macro9()
Dim i As Long, A As Worksheet
Set A = Workbooks("2020年度営業企画").Sheets("東京支店")
For i = 1 To 100
A.Cells(i, 1).Copy A.Cells(i, 2)
Next i
End Sub
''動画の「オブジェクト変数の解説」で、セルをひとつずつ操作を例にしましたが
''実際のコードでは示していなかったので、ここに追記します
''複数のセルを選択して、次のコードを試してください
Sub Macro1()
''選択したセルに、そのセルをアドレスを代入し、背景色を赤にします
Dim C As Range
For Each C In Selection
C.Value = C.Address(False, False)
C.Interior.Color = RGB(255, 0, 0)
Next C
End Sub
Sub Macro2()
''選択したセルに、そのセルをアドレスを代入し、背景色を赤にします
''確認のため、1セル処理したところで画面を止めます
Dim C As Range
For Each C In Selection
C.Value = C.Address(False, False)
C.Interior.Color = RGB(255, 0, 0)
MsgBox C.Address(False, False) & "を処理しました"
Next C
End Sub
動画で使用したブックのダウンロード(20200722.xlsm)
Office TANAKAのYouTubeチャンネルはこちら(動画一覧ページ)