Excel VBA事始め その2

勉強会
©いらすとや.

Excel VBA その2 1
前回の記事で「Sheet1」に書いたコードは消して、今回は左のツリーから「標準モジュール」の中の「Module1」にコードを書くことにします。

1
2
3
Sub test()
    ThisWorkbook.Sheets(2).Cells(3, 2).Value = 1 + 2
End Sub

testという名前のサブルーチンプロシージャを作成し、「ThisWorkbook (このワークブック)」の「2番めのシート」の「Cells(3,2) "B3"セル」の「値」は「1 + 2」であるという内容です。なお、1 + 2は引用符で括っていないため「計算」になります。

Excel VBA その2 2
ワークブックを確認します。コードでは「Sheets(2)」 (2番めのシート) を指定したのでこの例では「Sheet2」のワークシートになります。なお、2番めのシートが必ず「Sheet2」という名前のワークシートになるというわけではないのでご注意ください。
Cells(3, 2)は「3行目,2列目のセル」なのでワークシートでは"B3"セルになります。そして、その値が1 + 2を計算したものになるため 3 がセルに入っているのが正解です。なお、VBAのコードで1 + 2が計算された結果である3という数値が直接セルの値として入っています。「=1+2」 のようなワークシート関数がB3セルに入っているわけではありません。

ここからは次の例です。

Excel VBA その2 3
今回は先に「テスト」という名前のワークシートを(手動で)作成します。もちろんワークシートはVBAでも作成できますが、それはまた次の記事以降で。

Excel VBA その2 4
今回もコードはModule1に書きます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Sub test()
    Dim wsTest as Worksheet
    Set wsTest = ThisWorkbook.Worksheets("テスト")

    With wsTest.Cells(3, 2)
        .Value = 1 + 2
        .Interior.ColorIndex = 37        '暗めの水色
        With .Font
            .ColorIndex = 6        '黄色
            .Size = 20
        End With
    End With
End Sub
今回は変数が出てきます。wsTestは、ワークシート型というオブジェクト変数です。(2行目)
wsTest に ThisWorkbook.Worksheets("テスト")「このワークブック」の「テスト(という名前の)」ワークシートを格納します。(3行目) With ○○ から End Withの間は「○○について」です。5行目の場合は「wsTest.Cells(3,2)について」なので変数部分を仮に展開すると「このワークブックの"テスト"ワークシートの"B3"セルについて」です。(5行目)
「.」から始まっている場合は「With ○○」の対象です。つまり「.Value = △△」であれば ○○.Value = △△ になります。(6〜11行目)
なお、With ○○ 〜 End Withの中に書かれていても 「.」で始まっていない場合はWith ○○の対象外です。
.Interior.ColorIndex は セルの装飾(セルの塗りつぶし)の色番号を指定するものです。ここでは色番号37番を指定しています。(7行目)
With ○○ 〜 End Withの中に再びWithで始まるものが出てきました。(8行目)
ここでは「With .Font」 ということで「.」で始まるので5行目のWith ○○の対象です。つまり With wsTest.Cells(3, 2).Font です。これは「"テスト"ワークシートの"B3"セルの『フォント』について」ということになります。(8行目)
.ColorIndex = 6 と書かれているということは「.」で始まっているのでWith .Fontの対象です。そのColorIndex(色番号)の指定なので「フォントの色の指定」ということになります。先の7行目はセルの装飾についての色番号の指定でしたが、今回はセルのフォントの色指定です。(9行目)
.Size = 20も「.」で始まっているのでWith .Fontの対象です。"B3"セルに使用するフォントのサイズを(ポイント)指定しています。これはフォントなのでSizeというプロパティが使用できますが、例えば先の7行目のような.Interior(セルの装飾)では.Sizeプロパティはありません。「セル(の装飾)のサイズ」だと意味がわからないですしね。(10行目)
11行目のEnd Withは8行目のWith .Fontと対応します。
12行目のEnd Withは5行目のWith .wsTest.Cells(3, 2)と対応します。

このようにWith ○○ 〜 End Withを使うとスッキリ書けて見通しが良くなります。

Excel VBA その2 5
ワークブックに戻り、「テスト」という名前のワークシートを開きます。
そのワークシートの「B3」セルに3という値が入り、通常より大きい文字になっていて、文字の色が黄色、「B3」セルが水色に塗りつぶされていれば、VBAで書いたとおりになったということです。画像では3行目全体の高さが他の行より大きくなっていますが、今回VBAでは行の高さは指定していないのでExcelが自動調整して表示がこうなったものです。

注意

1
2
3
4
5
Sub test()
    With ThisWorkbook.Worksheets("テスト")
        .Cells(3, 2).Value = 1 + 2
    End With
End Sub

このように書いた場合、3行目は「.」で始まっているので2行目の対象です。つまりThisWorkbook.Worksheets("テスト").Cells(3, 2).Value = 1 + 2 と なるので、「このワークブック」の「テスト」という名前のワークシートの"B3"セルに3という値が入ります。(期待通りの動作)

1
2
3
4
5
Sub test()
    With ThisWorkbook.Worksheets("テスト")
        Cells(3, 2).Value = 1 + 2
    End With
End Sub

この例では3行目が「.」で始まっていません。この場合は2行目のWith ThisWorkbook.Worksheets("テスト")とは関係ない指定となります。 ワークブックやワークシートの指定無しの「"B3"セルの値は1+2である」と書いたのと同じ状態なので好ましくありません。
「テスト」ワークシートが選択(アクティブに)された状態でこのコードを動作させてみると「テスト」ワークシートの"B3"セルに3という値が入るかもしれませんが、他のワークシートが選択(アクティブに)された状態で動作させてみるとそのアクティブなワークシートの"B3"セルに3という値が入ります。(期待していない動作)。
なお、ワークシートのコード窓に書いた場合はアクティブなワークシートではなく、そのコード窓のワークシートのB3セルになります。また、コード内でワークシートをアクティブ(.Activate)にする指定を行った後であればそのアクティブなワークシートになります。

今回のような僅か数行のコードであればおそらく間違えることもないでしょうし、仮に間違って書いたとしてもすぐに気付けるでしょう。しかし、コードが増えると気付きにくくなるので記述の際は十分にご注意ください。