Excel VBA

【Excel VBA】【マクロ】【Tips】Withとオブジェクト変数を使ってコードを見やすくシンプルに!

こんにちは!Lenocoです。本日も見てくださりありがとうございます。

今回はWithとオブジェクト変数についてのTips回です!!!

Withとオブジェクト変数を使ってコードをシンプルに

VBAに慣れてくると、もっときれいにコードを書けないかなぁ、もっとシンプルにならないかな、
という悩みが出てくるのではないでしょうか。私はそうでした。

Withとオブジェクト変数という2つの方法で下のコードをシンプルに書いてみましょう!
まずは元のコードです。

元のコード

Sub ChangeSheetAndCell()

    ThisWorkbook.Sheets("Sheet15").Tab.ColorIndex = 3
    ThisWorkbook.Sheets("Sheet15").Name = "作業用シート"
    
    ThisWorkbook.Sheets("作業用シート").Range("A1") = "AAA"
    ThisWorkbook.Sheets("作業用シート").Range("A1").Font.ThemeColor = xlThemeColorAccent1
    ThisWorkbook.Sheets("作業用シート").Range("A1").Font.Name = "Meiryo UI"
    ThisWorkbook.Sheets("作業用シート").Range("A1").Font.Size = 20

End Sub

コードの説明

「Sheet15」という名前のシートのシート見出しの色を赤に変更します。
そして、そのシートのシート名を「作業用シート」とします。
そのシートのA1セルに「AAA」と入れ、フォントカラーを青色、フォント名を「Meiryo UI」、フォントサイズを20とします。

Withバージョンのコード

Sub ChangeSheetAndCell1()

    With ThisWorkbook.Sheets("Sheet15")
        .Tab.ColorIndex = 3
        .Name = "作業用シート"
        .Range("A1") = "AAA"

        With .Range("A1").Font
            .ThemeColor = xlThemeColorAccent1
            .Name = "Meiryo UI"
            .Size = 20
        End With
    End With

End Sub

Withバージョンのコードの説明

WithとEnd Withの分、行は増えていますがかなりすっきりしたのではないでしょうか。
Withでなにをやっているかというと、主語を省略しています。
Withの横にアイテムを書くことで、End Withまでの間のコードはそのアイテムが主語となります。
たとえば最初のWithにはシートを指定しているのでシートが主語となり、以降でそのシートのシート見出しの色、そのシートのシート名を変更し、
そのシートのセルA1に文字を入れています。
さらにWithを入れ子にすることができ、2つ目のWithに一つ目のWithで指定したシートのセル1のフォントを指定しています。
するとセルA1のフォントが主語となり、以降でセルA1のフォントのフォントカラー、セルA1のフォントのフォント名、セルA1のフォントのフォントサイズを指定しています。
1点注意点は、Withの中のコードの先頭には必ず「.」(ドット)を付けることを忘れないようにしてください。
たとえば「.Name」のドットを忘れてしまった場合は、マクロ実行時にエラーとなるためすぐ気が付くのですが、
「.Range(“A1”)」のドットを忘れてしまうと、アクティブシートのセル1とみなされてしまう為です。

オブジェクト変数バージョンのコード

Sub ChangeSheetAndCell2()
    Dim ws As Worksheet
    Dim tCell As Range

    Set ws = ThisWorkbook.Sheets("Sheet15")

    ws.Tab.ColorIndex = 3
    ws.Name = "作業用シート"

    Set tCell = ws.Range("A1")

    tCell = "AAA"
    tCell.Font.ThemeColor = xlThemeColorAccent1
    tCell.Font.Name = "Meiryo UI"
    tCell.Font.Size = 20

End Sub

オブジェクト変数バージョンのコードの説明

Withと同じくらいの量で書くことができました。
オブジェクト変数を使うことで、長いアイテム名を短い名称で指定することができます。
まず、Worksheetオブジェクト変数wsと、Rangeオブジェクト変数tCell(target cellの意味)を作成し、
wsに「Sheet15」シート、tCellに「Sheet15」シートのA1セルを入れています。
1点注意点は、オブジェクト変数にアイテムを入れる場合は必ず先頭に「Set」を付ける必要があるということです。
※オブジェクト変数にアイテムを指定するときにSetを忘れるとマクロ実行時にエラーとなります。
Withとオブジェクト変数、両方組み合わせることもできます!

Withとオブジェクト変数を組み合わせたコード

Sub ChangeSheetAndCell3()
    Dim ws As Worksheet
    Dim tCell As Range

    Set ws = ThisWorkbook.Sheets("Sheet15")

    With ws
        .Tab.ColorIndex = 3
        .Name = "作業用シート"

        Set tCell = .Range("A1")
        tCell = "AAA"

        With tCell.Font
            .ThemeColor = xlThemeColorAccent1
            .Name = "Meiryo UI"
            .Size = 20
        End With
    End With

End Sub

説明

コードの行数は短くなっていませんが、
Withやオブジェクト変数を使うことで、可読性があがり、わかりやすいコードになるかと思います。
そして、修正箇所も少なくて済むと思います。
例えば編集するシートが変わったとき、
元のコードでは6カ所の修正が必要ですが、
最後のコードであれば1カ所のみ修正すれば大丈夫です。

さいごに

VBAのコードを書くことに慣れてきたら、是非Withやオブジェクト変数を使ってみてください!

Lenoco

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です