とほほのVBA入門

目次

VBAとは

構文

コメント(')

シングルクォーテーション(')から行末まではコメントとみなされプログラム実行時に無視されます。

'C3セルに"Hello"を表示する
Range("C3").Value = "Hello"

あまり用いられませんが ' の代わりに Rem を使用することもできます。

Rem C3セルに"Hello"を表示する
Range("C3").Value = "Hello"

マルチステートメント(:)

コロン(:)を用いて複数の行を1行にまとめることができます。

a = 3 : b = 5

名前付けルール

VBA のプロシージャ名、定数、変数、引数などの名前には下記の規則があります。

暗黙のルールとして下記があるようです。

括弧のルール

関数やステートメントを呼び出す際、戻り値を使用する時は括弧をつけます。戻り値を使用しない時は括弧を省略しなくてはなりません。戻り値を参照する場合を関数、戻り値を参照しない場合をステートメントと読んだりしているようです。

ret = MsgBox("OK?", vbOKCancel)    '戻り値を使用するので括弧をつける
MsgBox "Done!", vbOKOnly           '戻り値を使用しないので括弧はつけない

配列やコレクションの要素を参照する際には括弧をつけます。

Worksheets("Sheet2").Activate

パラメータ指定のルール

下記のような関数やステートメントがあるとします。param1 は必須で param2param3 は省略可能です。

MyStatement param1, [param2], [param3]

この時、param2 を省略して param3 を指定するには、パラメータの順序を守って次の様に指定します。

MyStatement "ABC", , "XYZ"

多くのステートメントや関数は 名前付き引数 をサポートしていて、サポートしている場合は次のようにパラメータ指定することもできます。

MyStatement "ABC", param3:="XYZ"

ステートメント

変数

変数宣言(Dim)

Dim は変数を宣言します。型を省略すると Variant 型になります。

Dim myValue
Dim myValue As Integer

宣言と初期化を同時に行う場合はコロン(:)で宣言文と代入分を1行で記述します。

Dim myValue As Integer : myValue = 123

複数の変数を同時宣言する場合はそれぞれに型を指定する必要があります。

Dim x, y, z As Long                   'x, y は Variant、z は Long
Dim x As Long, y As Long, z As Long   'x, y, z は long

定数宣言(Const)

Const は定数を定義します。

Const MY_CONST_VALUE = 4096

列挙変数(Enum)

Enum は列挙型を定義します。= 初期値を省略すると 0, 1, 2, ... が割り当てられます。Enum 宣言はモジュールの先頭に記述する必要があります。

Enum Colors
  Red = 1
  Green = 2
  Blue = 3
End Enum

Sub EnumTest()
    Debug.Print Colors.Red
End Sub

ユーザ定義型(Type)

Type でユーザ定義の型を宣言することもできます。

Type UserRecord
  UserID As String
  UserName As String
End Type

Sub TypeTest()
    Dim user1 As UserRecord
    user1.UserID = "U123"
    user1.userName = "Yamada"
       :

プリミティブ値代入(Let)

Integer や String などプリミティブ型の代入は Let を用います。Let は省略することもできます。

Dim myString As String
Let myString = "ABCDEFG"	'プリミティブ型にはLetを使用
myString = "ABCDEFG"		'Letは省略可能

オブジェクト代入(Set)

Collection, Dictionary, Worksheet, Range などのオブジェクトやコレクションの代入は Set を用います。Set は省略できません。

Dim myRange
Set myRange = Range("C3")	'オブジェクト型はSetが必要

スコープ(Public, Private, Static)

パブリック(Public)

Public で宣言した変数は他のモジュールからも参照できます。

Public publicName As String

Sub Test()
    ...
End Sub

プライベート(Private)

Private で宣言した変数はそのモジュールの中でのみ参照できます。

Private privateName As String

Sub Test()
    ...
End Sub

スタティック(Static)

通常の変数はプロシージャを呼び出すたびに値が初期化されますが、Static で宣言した変数は再呼び出し時も値が保持されます。

Sub StaticTest()
    Static staticCount As Long
    staticCount = staticCount + 1
    Debug.Print staticCount
End Sub

制御構文

If文(If Then)

If, Then, Else は もし~ならば、さもなくば を表します。

If value = 0 Then
    Debug.Print "value is 0."
End If
If value = 0 Then
    Debug.Print "value is 0."
Else
    Debug.Print "value is not 0."
End If
If value = 0 Then
    Debug.Print "value is 0."
Else If value = 1 Then
    Debug.Print "value is 1."
Else
    Debug.Print "value is neither 0 nor 1."
End If

Do文(Do While)

Do While は ~の間、Do Until は ~になるまでの間ループします。

Do While x < 10
    ...
Loop
Do Until x = 10
    ...
Loop
Do
    ...
Loop While x < 10
Do
    ...
Loop Until x = 10

下記は Do While ... Loop と同じ動作となります。

While x < 10
    ...
Wend

For文(For To)

x の値を 1, 2, ... 10 と変えながらループします。

For x = 1 To 10
    ...
Next

For-Each文(For Each)

コレクションに対してループします。

For Each range In Range("A1:A10")
    ...
Next

Select文(Select Case)

exprvalue1 であれば statements1 を、value2 であれば statements2 を、どれでもなければ statements3 を実行します。

Select Case expr
    Case value1
        statements1
    Case value2
        statements2
    Case Else
        statements3
End Select

With文(With)

オブジェクトをターゲットにして statements を実行します。

With object
    statements
End With

例えば次のようなプログラムは

Worksheets("Sheet1").Range("A1").Value = "ABC"
Worksheets("Sheet1").Range("A1").Bold = True
Worksheets("Sheet1").Range("A1").Font.Color = vbRed

次のように記述できます。

With Worksheets("Sheet1").Range("A1")
    .Value = "ABC"
    .Bold = True
    .Font.Color = vbRed
End With

Goto文(Goto)

ラベル名: でラベルを定義しておき、そのラベルの位置にジャンプします。

Sub GotoTest()
    ...
    If ... Then
        Goto Label1
    End If
    ...

Label1:
    ...
End Sub

条件付きGoto文(On Goto)

On num GoTo ... は num の番号に対応したラベルにジャンプします。下記の例では Label2 にジャンプします。

Sub OnGoToTest()
    Dim num As Integer: num = 2
    On num GoSub Label1, Label2
    Exit Sub
Label1:
    Debug.Print "Label1"
    Exit Sub
Label2:
    Debug.Print "Label2"
    Exit Sub
End Sub

プロシージャ内のサブルーチン呼び出し(GoSub)

GoSub ... Return はプロシージャ内に定義したサブルーチンを呼び出して戻ります。

Sub GoSubTest()
    Debug.Print "Start GoSubTest"
    GoSub Sub1
    Debug.Print "End GoSubTest"
    Exit Sub
Sub1:
    Debug.Print "Sub1"
    Return
End Sub

条件付きサブルーチン呼び出し(On GoSub)

On num GoTo ... は num の番号に対応したサブルーチンを呼び出します。下記の例では Sub2 が呼ばれます。

Sub OnGoSubTest()
    Dim num As Integer: num = 2
    On num GoSub Sub1, Sub2
    Exit Sub
Sub1:
    Debug.Print "Sub1"
    Return
Sub2:
    Debug.Print "Sub2"
    Return
End Sub

エラー処理(On Error)

On Error を宣言しておくと 0割演算などのエラーが発生した時に指定したラベルに飛びます。Err.Description にはエラーメッセージが、Err.Number にはエラー番号が設定されています。

Sub ErrorTest()
    Dim x As Long
    On Error GoTo Err1
    x = 6 / 0
    Debug.Print x
    Exit Sub
Err1:
    Debug.Print "ERROR!"
    Debug.Print Err.Number
    Debug.Print Err.Description
End Sub

Resume Next を指定するとエラーが発生した次の行に処理を戻します。Next を忘れるとエラーが発生した行に戻ってしまい無限ループが発生してしまうので注意してください。

Sub ErrorTest()
    ...
Err1:
    Debug.Print "ERROR!"
    Resume Next
End Sub

エラーを発生させる(Error, Err.Raise)

Error や Err.Raise はエラーを発生させます。Error はエラー番号しか指定できませんが、Err.Raise はエラー番号(Number)、ソース(Source)、説明(Description) を指定することができます。エラー番号には「トラップ可能なエラー↗」に定義された番号、または1001番以降のユーザ定義領域の番号を指定します。

Sub ErrorTest()
    On Error GoTo Err1
    Error 1200
    Err.Raise 1200, "MySource", "Error message..."
    Exit Sub
Err1:
    Debug.Print Err.Number
    Debug.Print Err.Source
    Debug.Print Err.Description
    Resume Next
End Sub

プロシージャ

プロシージャには Subプロシージャ(Sub)とファンクション(Function)があります。似ていますが若干異なる点があります。

Subプロシージャ(Sub)

Subプロシージャを定義します。

Sub SubTest(msg As String)
    Debug.Print msg
End Sub

Subプロシージャは次のように呼び出します。

SubTest "ABC"

ファンクション(Function)

Functionプロシージャを定義します。プロシージャ名と同じ名前の変数に値を代入するとその値が戻り値となります。

Function FunctionTest(x As Long, y As Long)
    FunctionTest =  x + y
End Function

Functionプロシージャは次のように呼び出します。

z = FunctionTest(5, 3)

ファイル入出力

ファイルを開く・閉じる(Open, Close)

ファイル番号(#)には 1~511 の数字を指定します。モードには 読込みモード(Input)、書込みモード(Output)、追記モード(Append)、バイナリモード(Binary)、ランダムアクセスモード(Random)のいずれかを指定します。

Open "C:\Temp\data.txt" For Input As #1
    ...
Close #1

未使用のファイル番号を得る(FreeFile)

FreeFile は未使用のファイル番号を得ます。FreeFile(0) とすると 1~255、FreeFile(1) とすると 256~511 の間の番号を返します。

Dim fileNumber As Integer
fileNumber = FreeFile
Open "C:\Temp\data.txt" For Input As fileNumber
...

Print # は1行のデータを書き込みます。Line Input # は1行分のデータを読み込みます。

Open "C:\Temp\data.txt" For Output As #1
Print #1, "ABC"
Print #1, "XYZ"
Close #1

Open "C:\Temp\data.txt" For Input As #1
Do Until EOF(1)
    Line Input #1, lineTest
    Debug.Print lineText
Loop
Close #1

データを書込む・読込む(Write, Input)

Write # は String や Integer などのデータを書き込みます。Input # はデータを読み込みます。

Open "C:\Temp\data.txt" For Output As #1
Write #1, "ABC"
Write #1, 123
Close #1

Open "C:\Temp\data.txt" For Input As #1
Input #1, myString
Input #1, myInteger
Close #1

バイナリデータを読み書きする(Binary)

バイナリデータを読み書きするには Binary モードを用います。

Dim fLen As Long
Dim fData() As Byte
Open "C:\Temp\data.txt" For Binary As #1
fLen = LOF(1) 'Length of #1
ReDim fData(0 To fLen - 1)
Get #1, , fData
Put #1, , fData
Close #1

ランダムアクセスでレコードを読み書きする(Random)

Type で定義したユーザ定義型などをレコードとして読み書きすることができます。Put, Get の第二引数にはレコード位置を指定します。

Type UserRecord
    UserID As String * 10
    UserName As String * 30
End Type

Sub FileRandomTest()
    Dim user1 As UserRecord
    user1.UserID = "U123"
    user1.UserName = "Yamada"
    Open "C:\Temp\data.dat" For Random As #1
    Put #1, 1, user1
    Get #1, 1, user1
    Close #1
End Sub

1行の長さを制限する(Width)

1行の長さを制限します。Print 文の末尾にセミコロン(;)を記述すると改行せずに継続しますが、Width で1行の長さを制限しておくと制限に達した時点で自動改行されます。Print #1, "ABCDEFG" などのようにまとめて書き出す場合には適用されないようです。

Sub FileWidthTest()
    Open "C:\Home\xxx.txt" For Output As #1
    Width #1, 5
    For I = 1 To 14
        Print #1, "A";
    Next
    Close #1
End Sub

すべてのファイルを閉じる(Reset)

Reset は開いているファイルをすべて閉じます。

Open "C:\Temp\data1.txt" For Input As #1
Open "C:\Temp\data2.txt" For Input As #2
Reset

ファイルをロックする(Lock, Unlock)

Lock はファイルをロックして他からの書き込みを禁止します。Unlock はロックを解除します。

Lock #1
  ...
Unlock #1

読み書き位置を変更する(Seek)

Seek はファイルの読込位置・書き込み位置を変更します。Random モードの時はレコード数、その他の時は先頭からのバイト数で指定します。

Seek #1, 1024

ファイル・フォルダ操作

作業ドライブを変更する(ChDrive)

ChDrive "D"

作業フォルダを移動する(ChDir)

ChDir "C:\Home"

フォルダを作成する(MkDir)

MkDir "C:\Home\Work"

フォルダを削除する(RmDir)

RmDir "C:\Home\Work"

ファイルをコピーする(FileCopy)

FileCopy fromFile, toFile

ファイル名を変更する(Name)

Name oldName newName

ファイルを削除する(Kill)

Kill "C:\Home\xxx.txt"

ファイル属性を変更する(SetAttr)

属性には 標準(vbNormal:0)、読み取り専用(vbReadOnly:1)、非表示(vbHidden:2)、システムファイル(vbSystem:4:Windowsのみ)、バックアップ対象(vbArchive:32)、エイリアス(vbAlias:64:Macのみ) の合計値を指定します。

SetAttr "C:\Home\xxx.txt" vbReadOnly + bvHidden

文字列操作

右寄せ・左寄せ(RSet, LSet)

RSet は文字列を右寄せ、LSet は左寄せします。

Dim str As String * 10
RSet str = "ABC"    '[       ABC]
LSet str = "ABC"    '[ABC       ]

文字列置換(Mid)

文字列の開始位置から文字数分を置換します。

Dim str As String
str = "ABCDEFG"
Mid(str, 5, 3) = "XYZ"  'ABCDXYZ

オブジェクト

ユーザフォームを読み込む(Load, Unload)

Load はユーザーフォームを読み込みます。

Sub UserFormTest()
    Load UserForm1
    UserForm1.Show
End Sub

Unload はユーザーフォームを閉じて廃棄します。

Private Sub OKButton_Click()
    Unload UserForm1
End Sub

レジストリ操作

下記の構文で指定します。SaveSetting はレジストリを設定、DeleteSetting はレジストリを削除、GetSetting はレジストリの値を取得、GetAllSettings はセクション配下のキーと値のリストを取得します。

SaveSetting appname, section, key, setting
GetSetting(appname, section, key[, default])
GetAllSettings(appname, section)
DeleteSetting appname, section[, key]

設定したレジストリは下記に格納されます。

HKEY_CURRENT_USER\Software\VB and VBA Program Settings\appname\section key=setting
Sub RegistryTest()
    SaveSetting "MyApp", "MySection", "MyKey1", "MyValue1"
    SaveSetting "MyApp", "MySection", "MyKey2", "MyValue2"
    value = GetSetting("MyApp", "MySection", "MyKey1")
    Debug.Print value
    Values = GetAllSettings("MyApp", "MySection")
    For i = LBound(Values, 1) To UBound(Values, 1)
        Debug.Print Values(i, 0) & "=" & Values(i, 1)
    Next
    DeleteSetting "MyApp", "MySection"
End Sub

その他

日付・時刻(Date, Time)

日付や時刻を得ます。システム日付・時刻を設定することもできます。

Debug.Print Date        '2024/09/02
Debug.Print Time        '23:59:59

プロシージャ呼び出し(Call)

Subプロシージャや Functionプロシージャを呼び出します。Call は省略しても構いません。DLLモジュールを呼び出すこともできます。

Call MySubProcedure
Call MyFunction

ビープ音を鳴らす(Beep)

ビープ音を鳴らします。

Beep

中断(Stop)

処理を中断してデバッグモードに移行します。

Stop

乱数ジェネレータを初期化(Randomize)

乱数ジェネレータを初期化します。引数に数値を指定するとその値を、省略するとシステムタイマーを用いた値を使用します。初期化しない場合、Rnd は Excel を再起動する度(?)に、毎回決まったパターンの乱数を生成してしまいます。

Randomize
For i = 0 To 10
    Debug.Print Rnd
Next

アプリケーションウィンドウをアクティブ化(AppActivate)

すでに開いているアプリケーションのウィンドウタイトルを指定してそのアプリケーションをアクティブにします。最近の Windows ではアプリケーションタイトルが表示されないことが多くなりましたが、[Alt]-[Tab] でアプリケーション切り替えを行うと表示されます。

AppActivate "コマンド プロンプト"
AppActivate "ローカル ディスク (C:) - エクスプローラー"

下記の様に起動していないアプリケーションを指定することもできます。(Excel 2019 では何故か起動はできてもエラーとなりました。)

Dim app
app = Shell("C:\Windows\notepad.exe", 1)
AppActivate app

オプション設定(Option)

Option はモジュールの先頭でプロシージャよりも前に記述する必要があります。

Option Compare は文字列の比較方式を設定します。Binary は大文字・小文字を別の文字とみなして、A, B, C, ..., a, b, c, ... の順序と判断します。Option Compare Test は大文字・小文字を同じ文字とみなして、A=a, B=b, C=c, ... の順序と判断します。

Option Compare Binary
Option Compare Text

Option Explicit は明示的な宣言無しの変数利用を禁止します。

Option Explicit

Sub ExplicitTest()
    x = 5           '変数が定義されていません。エラー
End Sub

Option Private Module はモジュール自体をプライベートに設定します。プライベートなモジュールは、Excel の [開発]-[マクロ] で表示するマクロダイアログで一覧に表示されなくなります。

Option Private Module

Sub PrivateModuleTest()
    ...
End Sub

データタイプ

真偽値(Boolean)

True または False の値を持ちます。

Dim myValue As Boolean
myValue = True

バイト(Byte)

1バイト符号無し整数です。0~255 の値を持ちます。

Dim myValue As Byte
myValue = 255

整数(Integer)

2バイト符号付き整数です。-32,768~32,767 の値を持ちます。

Dim myValue As Integer
myValue = 32767

ロング整数(Long)

4バイト符号付き整数です。-2,147,483,648〜2,147,483,647 の値を持ちます。

Dim myValue As Long
myValue = 2147483647

ロングロング整数(LongLong)

8バイト符号付き整数です。-9,223,372,036,854,775,808~9,223,372,036,854,775,807 の値を持ちます。64ビット環境で使用できます。

Dim myValue As LongLong
myValue = 9223372036854775807

通貨整数(Currency)

8バイトの符号付き実数です。-922,337,203,685,477.5808~922,337,203,685,477.5807 の値を持ちます。〇ドル〇セント などの通貨を表すのに使用されます。

Dim myValue As Currency
myValue = 922337203685477.5807

10進数データ型(Decimal)

浮動小数点数は2進数で表すため、10進数の数値には丸め誤差が生じます。丸め誤差を生じさせない10進数演算用に Decimal が用意されています。12バイト(96ビット)を用いて、小数部が無い場合は +/-79,228,162,514,264,337,593,543,950,335 の整数を、小数部がある場合は +/-7.92281625142643375935439539539335 の数値を丸め誤差なして扱うことができます。Decimal は型として実装されている訳ではなく、Variant 型変数に CDec() を用いて代入するのが一般的です。

Dim myValue As Variant
myValue = CDec("79,228,162,514,264,337,593,543,950,335")

ロングポインタ(LongPtr)

ポインタを格納するサイズの整数で、32ビットOSでは Long、64ビットOS では LongLong と同じ型になります。

Dim myValue As LongPtr

単精度浮動小数点数(Single)

4バイトの浮動小数点数です。1.23 のような小数点を持つ数値や、1.23E4 (1.23×104) のような数値を格納できます。負の値は -3.402823E38~-1.401298E-45、正の値は 1.401298E-45~3.402823E38 の値を持ちます。

Dim myValue As Single
myValue = 3.402823E38

単精度浮動小数点数(Double)

8バイトの浮動小数点数です。負の値は -1.79769313486231E308~-4.94065645841247E-324、正の値は 4.94065645841247E-324~1.79769313486232E308 の値を持ちます。

Dim myValue As Double
myValue = 1.79769313486232E308

文字列(String)

文字列を表します。固定長と可変長があり、固定長は約 65,400文字、可変長は約20億文字格納できます。

Dim myString As String
myString = "ABCDEFG"

固定長の場合はアスタリスク(*)と文字列の長さを指定します。長さに4を指定した場合、4文字以上代入しても最初の4文字しか代入されません。また、2文字代入すると末尾の2文字はスペースになります。

Dim myString As String * 4
myString = "ABCD"

文字列は "..." で囲みます。

myString = "ABCDEFG"

文字列の中でダブルクォーテーション(")を使用する場合は "" のようにダブルクォーテーションを2個書きます。

myString = "ABC""XYZ"

日付型(Date)

日時の値を持ちます。日付を1900年1月1日を0日目とする日数で表し、時刻を24時間を1とする割合(1分は1/(24*60*60))で表します。日付リテラルは #日時# の形式で表します。Excel は過去との互換性の問題で 1900年をうるう年として扱いますが、VBA の Date 型はうるう年ではない(4で割り切れても100で割り切れる年はうるう年ではない)として扱うため、1900年1月1日~1900年3月1日の間は、Excel のセルの表と VBA の値で1日分ずれが生じます。

Dim myDate As Date
myDate = #12/31/2024 11:59:59 PM#

オブジェクト型(Object)

シートやセルなどのオブジェクトを格納できる型です。オブジェクト型の変数にオブジェクトを代入する際には Set を用います。

Dim myObject As Object
Set myObject = ActiveSheet.Range("A1:C3")

Variant型(Variant)

Variant は「変異」という意味を持ちます。数値、文字列、オブジェクトなどどんな型の値でも代入することができます。

Dim x, y, z As Variant
x = 123
y = "ABC"
Set z = ActiveSheet.Range("A1:C3")

配列

配列を定義する(Dim ...())

添字の最大値を指定して配列を定義します。下記の場合、data(0), data(1), data(2) の3つの配列が作成されます。

Dim data(2) As String
data(0) = "Zero"
data(1) = "One"
data(2) = "Two"

下記の様にすると data(1), data(2) の2個の配列を作成します。

Dim data(1 To 2) As String

配列の初期化(Array)

Array を用いて配列を初期化することができます。最大値は省略し、型は Variant にしておく必要があります。

Dim data() As Variant
data = Array("AAA", "BBB", "CCC")

高次元配列(n, m)

下記の様にして高次元の配列を扱うことができます。

Dim data(2, 2) As String
data(0, 0) = "A00"
data(2, 2) = "A22"

配列の大きさを動的に変更する(ReDim)

Dim で配列を定義する際には添字の最大値を変数で指定することはできませんが、ReDim を使用すると配列の下限値、上限値を動的に変更することができます。

Dim max As Long: max = 10
Dim data() As String
ReDim data(1 To max) As String

ReDim を用いると配列要素の値は初期化されてしまいますが、Preserve をつけると保持されます。

Dim data() As Variant
ReDim data(2)
data = Array("AAA", "BBB", "CCC")
ReDim Preserve data(3) '値を保持したまま配列個数を拡張
Debug.Print data(2)

配列をループ処理する(For...)

LBound() は配列の下限値を、UBound() は配列の上限値を得ます。

Dim data() As Variant
data = Array("AAA", "BBB", "CCC")
For i = LBoound(data) To UBound(data)
    Debug.Print data(i)
Next

For Each を用いる方法もあります。

For Each d In data
    Debug.Print d
Next

配列を削除する(Erase)

Erase は配列を削除します。

Dim data(10) As String
Erase data

配列の下限値を変更する(Option Base)

Option Base は配列のデフォルトの下限値を変更します。モジュールの先頭に記述する必要があります。下記の場合 data(1), data(2) の2個の配列が作成されます。

Option Base 1
Dim data(2) As String

辞書型(Dictionary)

連想配列とも呼ばれます。キー(key)と値(item)のペアを持ちます。辞書型の変数は Object 型の変数を定義し、CreateObject("Scripting.Dictionary") を用いて生成します。

Dim myDict As Object
Set myDict = CreateObject("Scripting.Dictionary")
myDict.Add "key1", "item1"
myDict.Add "key2", "item2"
Rance("C3").Value = myDict("key2")

下記などのメソッドがあります。

myDict.Add key, item	'辞書型にキー・アイテムを追加する
myDict.Remove key	'key で指定したアイテムを削除する
myDict.Exists key	'key で指定したアイテムが存在するか調べる
myDict.Keys		'キーの一覧を得る
myDict.Items		'アイテムの一覧を得る
myDict.RemoveAll	'すべてのキー・アイテムを削除する

コレクション型(Collection)

コレクションはオブジェクトの集合です。

Dim myCollection As New Collection
myCollection.Add "item1", "key1"
myCollection.Add "item2", "key2"
Debug.Print myCollection.Item(1)	'1番目のアイテムを表示
Debug.Print myCollection.Item("key1")	'key1に対するアイテムを表示

下記などのメソッドやプロパティがあります。

myCollection.Add item, [key]
myCollection.Item(key)
myCollection.Remove(key)
myCollection.Count

型宣言文字

リテラルの後に $ や % などの型宣言文字をつけることで、型を明示することができますが、あまり利用されていません。

Dim myValue
myValue = "ABC"$	'Stging
myValue = 123%		'Integer
myValue = 123&		'Long
myValue = 123^		'LongLong
myValue = 1.23!		'Single
myValue = 1.23#		'Double
myValue = 1.23@		'Currency

データ型変換関数(CXxx)

データ型を変換する関数群が用意されています。

myBool = CBool(A = 3)			'True or False (Boolean)
myByte = CByte(123.45)			'123 (Byte)
myInt = CInt(123.45)			'123 (Integer)
myLong = CLng(123.45)			'123 (Long)
myCurrency = CCur(123.45)		'123.45 (Currency)
myDecimal = CDev(123.45)		'123.45 (Decimal)
mySingle = CSng(123.45)			'123.45 (Single)
myDouble = CDbl(123.45)			'123.45 (Double)
myDate = CDate("2024/09/01 23:59:59")	'2024/09/01 23:59:59 (Date)
myString = CStr(123.45)			'"123.45" (String)
myVariant = CVar(123 & 456)		'"123456" (String)

演算子

下記の演算子が用意されています。

算術演算子(+, -, *, /, ...)

-expr			'負値
expr1 + expr2		'加算
expr1 - expr2		'減算
expr1 * expr2		'乗算
expr1 / expr2		'除算
expr1 \ expr2		'除算(整数部(小数部は切り捨て))
expr1 Mod expr2		'除算の余り
expr1 ^ expr2		'累乗(expr1expr2乗)

文字列演算子(&, Like)

str1 & str2		'文字列の連結
variable Like pattern	'パターンにマッチすればTrue

比較演算子(=, <>, >, <, ...)

expr1 = expr2		'expr1expr2が等しければTrue
expr1 <> expr2		'expr1expr2が異なっていればTrue
expr1 < expr2		'expr1expr2未満であればTrue
expr1 <= expr2		'expr1expr2以下であればTrue
expr1 > expr2		'expr1expr2より大きければTrue
expr1 >= expr2		'expr1expr2以上であればTrue
object1 Is object2	'オブジェクト比較(同じオブジェクトであればTrue)

論理演算子(And, Or, ...)

expr1 And expr2		'expr1 かつ expr2 が True であればTrue
expr1 Or expr2		'expr1 または expr2 が True であればTrue
expr1 Xor expr2		'expr1expr2どちらか一方のみがTrueであればTrue
expr1 Eqv expr2		'expr1expr2どちらか一方のみがTrueであればFalse
expr1 Imp expr2		'expr1expr2の論理包含(※)
Not expr		'expr が True でなければTrue

Imp の論理包含は下記の結果を返します。

expr1   expr2   result
True	True	True
True	False	False
True	Null	Null
False	True	True
False	False	True
False	Null	True
Null	True	True
Null	False	Null
Null	Null	Null

その他の演算子(AddressOf, ...)

AddressOf はプロシージャのアドレスを参照します。

AddressOf procedure

クラスモジュール

VBA 編集画面の [挿入]-[クラスモジュール] からクラスファイルを追加することができます。クラス名は Class1 などで作成されますが、ツリービュー下のプロパティウィンドウで MyClass などに変更することができます。作成したクラスは下記の様に利用することができます。

Dim object As New MyClass

クラスメソッド(Sub, Function)

クラスには Sub や Function でクラスメソッドを定義することができます。

Sub Hello()
    MsgBox "Hello!"
End Sub

メソッドは下記の様に呼び出します。

Dim obj As New MyClass
obj.Hello()

クラスプロパティ(Public, Private, ...)

Public Name As String
Dim obj As New MyClass
obj.Name = "Yamada"
Debug.Print obj.Name

コンストラクタ(Initialize)

Class_Initialize メソッドはクラスインスタンスが生成された時に自動的に呼び出されます。引数を受け取ることはできません。

Private Sub Class_Initialize()
    ...
End Sub

デストラクタ(Terminate)

Class_Terminate メソッドはクラスインスタンスが破棄される時に自動的に呼び出されます。

Private Sub Class_Terminate()
    ...
End Sub

ゲッター・セッター(Property Get/Set/Let)

クラスには下記の様にしてプロパティのゲッター・セッターを定義することができます。プロパティを参照・設定する際にチェックや変換などのロジックを追加することができます。

Private Count_ As Integer
Private TargetCell_ As Object

Property Get Count() As Integer
    Count = Count_
End Property

Property Let Count(Count As Integer)
    If Count > 100 Then
        Err.Raise 100, Description:="100以下の値を設定してください。"
    End If
    Count_ = Count
End Property

Property Set TargetCell(TargetCell As Object)
    Set TargetCell_ = TargetCell
End Property

Property Get TargetCell()
    Set TargetCell = TargetCell_
End Property
Dim obj As New MyClass
obj.Count = 200               '100以下の値を設定してください エラー
obj.TargetCell = Range("A1")

インタフェース

インタフェース(Interface)

インタフェースはクラスと似ていますが、SubプロシージャやFunctionプロシージャの名前と型のみを定義します。インタフェースを実装(Implement)するモジュールは、インタフェースが定義した名前や型に従って中身を実装します。

MyInstance1
Public Sub Hello()
End Sub
MyClass1
Implements MyInterface1

Public Sub MyInterface1_Hello()
    Debug.Print "Hello!"
End Sub
MyModule1
Sub InterfaceTest()
    Dim obj As MyClass1
    Set obj = New MyClass1
    obj.MyInterface1_Hello
End Sub

Excelオブジェクト

アプリケーション(Application)

Application は Excel アプリケーションに関する様々なメソッド、プロパティをサポートしています。詳細は Application () を参照してください。

Application

ScreenUpdating を False にしてセル操作を行い、操作が完了した時点で True に戻してやることで処理中の表示更新を抑制して性能を上げることができます。

Application.ScreenUpdating = False	'スクリーン描画を中断する
Application.ScreenUpdating = True	'スクリーン描画を再開する

DisplayAlerts を False にすることで警告メッセージを一時的に抑制することができます。

Application.DisplayAlerts = False	'警告メッセージの表示を抑制する
Application.DisplayAlerts = True	'警告メッセージの表示を再開する

デバッグ(Debug)

Print メソッドは開発画面の [イミディエイト] ウィンドウにデバッグログを出力します。

Debug.Print "myValue=" & myValue

Assert メソッドは式を評価して FLASE であればブレークポイントを設定してデバッグモードに移ります。

Debug.Assert resultStatus<>"OK"

ワークブック(Workbook)

Excel ワークブックを示すオブジェクトです。詳細は Workbook () を参照してください。

ThisWorkbook			'現在のワークブック
ActiveWorkbook			'アクティブなワークブック
Workbooks("sample.xlsx")	'sample.xlsxワークブック
workbook.Worksheets		'ワークシートのコレクション
Worksheets("Sheet1")		'Sheet1ワークシート

ワークシート(Worksheet)

Excel ワークシートを示すオブジェクトです。詳細は Worksheet () を参照してください。

ActiveSheet
workbook.Worksheets("Sheet1")
Worksheets("Sheet1").Activate

セル範囲(Range)

セルやセル範囲を示すオブジェクトです。詳細は Range () を参照してください。

Range("A1")     ' A1セル
Range("A1:C3")  ' A1:C3セル

セル範囲をループ処理するには次のようにします。

For Each Cell In Range("A1:C3")
    Cell.value = "AAA"
Next

セルの入力値やフォントや色などは下記の様に設定します。

With Worksheets("Sheet1").Range("A1")
    .value = "AAA"                         '入力値
    .Font.Color = vbRed                    'フォント色
    .Font.Name = "Times New Roman"         'フォント
    .Font.Size = 25                        'フォントサイズ
    .Font.Bold = True                      '太字
    .Font.Italic = True                    'イタリック
    .Font.Underline = True                 '下線
    .Interior.Color = vbYellow             '背景色
    .RowHeight = 50                        '高さ
    .ColumnWidth = 40                      '横幅
    .VerticalAlignment = xlTop             '垂直方向位置
    .HorizontalAlignment = xlCenter        '水平方向位置
End With

関数

数学関数

Round(expression, [numdecimalplaces]) : 四捨五入 ()
Abs(number) : 絶対値(2は2、-2は2) ()
Int(number) : 整数部(2.5は2、-2.5は-3) ()
Fit(number) : 整数部(2.5は2、-2.5は-2) ()
Exp(number) : 指数関数(eを底とするべき乗) ()
Log(number) : 自然対数(eを底とする対数) ()
Rnd(number) : 乱数(0.0~1.0) ()
Sgn(number) : 正か0か負かを調べる ()
Sqr(number) : 平方根 ()
Sin(number) : 正弦(サイン) ()
Cos(number) : 余弦(コサイン) ()
Tan(number) : 正接(タンジェント) ()
Atn(number) : 逆正接(アークタンジェント) ()
派生数学関数 : 上記を用いて表される数学関数 ()

配列関数

Array(arglist) : 配列作成 ()
Choose(index, choice-1, [choice-2, ...]) : 選択肢からひとつ得る ()
Join(sourcearray, [delimiter]) : 文字列配列を連結 ()
LBound(arrayname, [dimension]) : 配列添字の最小値 ()
UBound(arrayname, [dimension]) : 配列添字の最大値 ()

文字列関数

Len(string|varname) : 文字列長を得る ()
UCase(string) : 大文字に変換 ()
LCase(string) : 大文字に変換 ()
Right(string, length) : 大文字に変換 ()
Left(string, length) : 大文字に変換 ()
Mid(string, start, [length]) : 文字列を部分置換 ()
Replace(expression, find, replace, [start, [count, [compare]]]) : 文字列を部分置換 ()
InStr([start], string1, string2, [compare) : 文字列から文字列を検索 ()
InStrRev(stringcheck, stringmatch, [start, [compare]]) : 文字列から文字列を検索 ()
Split(expression, [delimiter, [limit, [compare]]]) : 文字列をデリミタで分割 ()
Filter(sourcearray, match, [include, [compare]]) : 文字列配列をパターンでフィルタリング ()
Format(expr, [format], [firstDayOfWeek], [firstWeekOfYear]) : フォーマット変換 ()
FormatNumber(expression, ...) : 数値のフォーマッティング ()
FormatCurrency(expression, ...) : 通貨のフォーマッティング ()
FormatPercent(expression, ...) : パーセント表記のフォーマッティング ()
FormatDateTime(date, [NamedFormat]) : 日時のフォーマッティング ()
LTrim(string) : 文字列の先頭のスペースを削除 ()
RTrim(string) : 文字列の末尾のスペースを削除 ()
Trim(string) : 文字列の先頭・末尾のスペースを削除 ()
String(number, character) : 文字・文字列の繰り返し ()
Space(number) : 指定文字数のスペース ()
Spc(n) : Print文中にn個のスペース ()
Tab[(n)] : Print文中にn個のタブ文字 ()
StrComp(string1, string2, [compare]) : 文字列比較 ()
StrConv(string, conversion, [LCID]) : 文字列変換(大文字・カナ変換など) ()
StrReverse(expression) : 文字列を反転 ()

日付関数

Date : システム日付を得る ()
Time : システム時刻を得る ()
Now : システム日時を得る ()
Timer : 午前0時からの経過秒数 ()
DateAdd(interval, number, date)) : 日付に加算する ()
DateDiff(interval, date1, date2, [firstdayofweek], [firstdayofyear]) : 日付の差分を得る ()
DatePart(interval, date, [firstdayofweek], [firstdayofyear]) : 日数などを得る ()
DateSerial(year, month, day) : 日付のシリアル値を得る ()
TimeSerial(hour, minute, second) : 時刻のシリアル値を得る ()
DateValue(date) : 文字列を日付に変換 ()
TimeValue(time) : 文字列を時刻に変換 ()
Year(date) : 年を得る ()
Month(date) : 月を得る ()
Day(date) : 日を得る ()
Hour(date) : 時を得る ()
Minute(date) : 分を得る ()
Second(date) : 秒を得る ()
Weekday(date, [firstdayofweek]) : 曜日を得る ()
MonthName(month, [abbreviate]) : 月名を得る ()
WeekdayName(weekday, abbreviate, firstdayofweek) : 曜日名を得る ()
IsDate(expression) : 文字列が日時形式かを判断 ()

変換関数

Asc(string) : 先頭文字の文字コードを返す ()
Chr(code) : 文字コードに対する文字を返す(~65535) ()
ChrB(code) : 文字コードに対する文字を返す(Byte範囲) ()
ChrW(code) : 文字コードに対する文字を返す(Unicode対応) ()
CVErr(errorCode) : ユーザ定義エラーを生成 ()
Hex(number) : 16進数に変換 ()
Oct(number) : 8進数に変換 ()
Str(number) : 文字列に変換 ()
Val(string) : 文字列の中から数字を取り出して数値に変換 ()

型判断

IsArray(varname) : 変数が配列か否かを判断 ()
IsEmpty(expression) : 変数が初期化状態かを判断 ()
IsError(expression) : エラー値か否かを判断 ()
IsMissing(argname) : 引数が省略されているか判断 ()
IsNull(expression) : 式がNull値か判断 ()
IsNumeric(expression) : 文字列が数値として解釈できるか ()
IsObject(identifier) : 変数がオブジェクトか判断 ()
TypeName(varname) : 型名(文字列)を得る ()
VarType(varname) : 型番号を得る ()

型変換

CBool(expression) : Booleanに変換 ()
CByte(expression) : Byteに変換 ()
CInt(expression) : Integerに変換 ()
CLng(expression) : Longに変換 ()
CLngLng(expression) : LongLongに変換 () (64 ビット環境のみ)
CLngPtr(expression) : LongPtrに変換 ()
CCur(expression) : Currencyに変換 ()
CDec(expression) : Decimalに変換 ()
CSng(expression) : Singleに変換 ()
CDbl(expression) : Doubleに変換 ()
CDate(expression) : Dateに変換 ()
CStr(expression) : Stringに変換 ()
CVar(expression) : Variantに変換 ()

ファイル・ディレクトリ操作

CurDir([drive]) : カレントディレクトリ(フォルダ)を得る ()
Dir(pathname, [attributes]) : パターンにマッチするファイルを得る ()
FileAttr(filenumber, returntype) : ファイル属性を得る ()
FileDateTime(pathname) : 作成日時・更新日時を得る ()
FileLen(pathname) : ファイルサイズを得る ()
GetAttr(pathname) : ファイルの属性を得る ()
MacID(constant) : Macでファイル種別をIDに変換 ()

ファイル入出力操作

EOF(filenumber) : ファイル末尾をチェックする ()
LOF(filenumber) : ファイルサイズ(Length Of File)を得る ()
FreeFile[(rangenumber)] : 未使用のファイル番号を得る ()
Input(number, [#]filenumber) : 指定文字数読み込む ()
Loc(filenumber) : ファイルの読み書き位置を返す ()
Seek(filenumber) : ファイルの読み書き位置を返す ()

エラー操作

Error(errornumber) : エラーメッセージを得る ()

オブジェクト操作

CreateObject(class, [servername]) : オブジェクトを生成 ()
CallByName(object, procname, calltype, [args()]) : オブジェクトのプロパティやメソッドを操作 ()

経理計算

Rate(nper, pmt, pv, [fv, [type, [guess]]]) : 投資の利率計算 ()
DDB(cost, salvage, life, period, [factor]) : 減価償却を計算 ()
SLN(cost, salvage, life) : 1期あたりの減価償却費計算 ()
SYD(cost, salvage, life, period) : 指定期間の減価償却費 ()
FV(rate, nper, pmt, [pv, [type]]) : 積み立て投資の将来価値計算 ()
IPmt(rate, per, nper, pv, [fv, [type]]) : 積み立て投資の将来金利計算 ()
NPer(rate, pmt, pv, [fv, [type]]) : 積み立て投資の支払回数計算 ()
Pmt(rate, nper, pv, [fv, [type]]) : 積み立て投資の年金支払額計算 ()
PPmt(rate, per, nper, pv, [fv, [type]]) : 積み立て投資の元金計算 ()
PV(rate, nper, pmt, [fv, [type]]) : 積み立て投資の現在価値計算 ()
IRR(values(), [guess]) : 定期キャッシュフローの内部収益率 ()
MIRR(values(), finance_rate, reinvest_rate) : 定期キャッシュフローの修正内部利益率 ()
NPV(rate, values()) : 定期キャッシュフローの正味現在価値 ()

カラー

QBColor(color) : カラーインデックスからカラーコードを得る ()
RGB(red, green, blue) : 三原色からカラーコードを得る ()

外部連携

Command() : コマンド引数を得る(Accessのみ) ()
Shell(pathname, [windowstyle]) : 外部プログラム実行 ()
GetObject([pathname], [class]) : ActiveX オブジェクトを参照 ()
MacScript(script) : AppleScriptを実行(廃止) ()

ダイアログ

MsgBox(prompt, [buttons,] [title,] [helpfile, context]) : メッセージボックス ()
InputBox(prompt, ...) : 入力ボックスを表示 ()

その他関数

IIf(expr, truepart, falsepart) : IF式 ()
Switch(expr1, value1, ...) : Switch式 ()
Environ(envstring|number) : 環境変数を参照 ()
DoEvents() : OSに制御を渡す ()
IMEStatus : IME状態を得る ()

その他

パターン

Like 演算子などでは下記のパターンを使用できます。

ABC?		'ABC と任意の1文字
ABC*		'ABC で始まる任意の文字列
ABC#		'ABC と任意の数字文字(0-9)
[ABC]		'A または B または C
[!ABC]		'A でも B でも C でもない1文字