メモ

引数を省略可能にする

Public Function hoge(Optional ByVal Name As String = "none") As ClassName
	○○○
End Function
  • 省略可能な引数の前に「Optional」キーワードをつけます
  • 省略された場合の値は末尾に「= 省略値」という形で指定します
  • 引数に「Optional」キーワードを指定した場合、それ以降の引数も省略可能にしなければなりません

ThisWorkBookとActiveWorkBookの違い

ThisWorkBook

ThisWorkBookは、現在実行中のマクロコードが記述されているブック (Workbook オブジェクト) を返します。

ActiveWorkBook

ActiveWorkBookは、現在アクティブなブック (Workbook オブジェクト) を返します。

メモ

単一のファイルで処理している場合にはどちらを使用しても変わらないですが、複数のファイルでVBAを実行するときは注意が必要です。

条件付きコンパイル

コンパイルするかどうかを#If文で指定できます。

通常、スクリプトの変更等でコードを削除する場合、コードは消したくないがコンパイル時には除外したい時に「#if 0 Then」などと記述します。

#If *** then
	***
#Else
	***
#End If

コードを繋げて複数行を1行にまとめて記述する方法

基本的なこと

各コードを行単位で区切る代わりに「:(コロン)」で区切ることができます。

Sub sample(): MsgBox "hoge": End Sub

ただし、If...Then...Else ステートメントは必ず行頭に記述しなければいけません。

そのため、処理を分岐したい場合は、Select...Case ステートメントを代わりに用いる必要があります。

なお、下記の2つのSubプロシージャは同一の処理です。

Sub sample1()
   Dim str As String: str = "hoge"
   If str = "hoge" Then
       MsgBox "True"
   Else
       MsgBox "False"
   End If
End Sub
Sub sample2()
   Dim str As String: str = "hoge"
   Select Case (str = "hoge")
       Case True
           Msgbox "True"
       
       Case Else
           Msgbox "False"
   End Select
End Sub
  • 「(式)」で値を評価できます

また、「sample2 Sub プロシージャ」を1行にすると下記のとおりです。

Sub sample2_2(): Dim str As String: str = "hoge": Select Case (str = "hoge"): Case True: MsgBox "True": Case Else: MsgBox "False": End Select: End Sub

メモ

  • ifステートメントでは真となる条件式でもSelect...Caseステートメントではならないものに注意が必要です(独自に条件書式で判定する必要があります)
If InStr("あいうえお", "う") Then
   Msgbox "True"
Else If
   Msgbox "False"
End If
Select Case (InStr("あいうえお", "う") <> 0):
   Case True
       MsgBox "True"
   Case Else
       MsgBox "False"
End Select