こんにちは!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