シングルクォーテーション(')から行末まではコメントとみなされプログラム実行時に無視されます。
'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 は必須で param2 と param3 は省略可能です。
MyStatement param1, [param2], [param3]
この時、param2 を省略して param3 を指定するには、パラメータの順序を守って次の様に指定します。
MyStatement "ABC", , "XYZ"
多くのステートメントや関数は 名前付き引数 をサポートしていて、サポートしている場合は次のようにパラメータ指定することもできます。
MyStatement "ABC", param3:="XYZ"
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 MY_CONST_VALUE = 4096
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 UserRecord UserID As String UserName As String End Type Sub TypeTest() Dim user1 As UserRecord user1.UserID = "U123" user1.userName = "Yamada" :
Integer や String などプリミティブ型の代入は Let を用います。Let は省略することもできます。
Dim myString As String Let myString = "ABCDEFG" 'プリミティブ型にはLetを使用 myString = "ABCDEFG" 'Letは省略可能
Collection, Dictionary, Worksheet, Range などのオブジェクトやコレクションの代入は Set を用います。Set は省略できません。
Dim myRange
Set myRange = Range("C3") 'オブジェクト型はSetが必要
Public で宣言した変数は他のモジュールからも参照できます。
Public publicName As String Sub Test() ... End Sub
Private で宣言した変数はそのモジュールの中でのみ参照できます。
Private privateName As String Sub Test() ... End Sub
通常の変数はプロシージャを呼び出すたびに値が初期化されますが、Static で宣言した変数は再呼び出し時も値が保持されます。
Sub StaticTest() Static staticCount As Long staticCount = staticCount + 1 Debug.Print staticCount End Sub
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 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
x の値を 1, 2, ... 10 と変えながらループします。
For x = 1 To 10 ... Next
コレクションに対してループします。
For Each range In Range("A1:A10") ... Next
expr が value1 であれば statements1 を、value2 であれば statements2 を、どれでもなければ statements3 を実行します。
Select Case expr Case value1 statements1 Case value2 statements2 Case Else statements3 End Select
オブジェクトをターゲットにして 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
ラベル名: でラベルを定義しておき、そのラベルの位置にジャンプします。
Sub GotoTest() ... If ... Then Goto Label1 End If ... Label1: ... End Sub
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 ... Return はプロシージャ内に定義したサブルーチンを呼び出して戻ります。
Sub GoSubTest() Debug.Print "Start GoSubTest" GoSub Sub1 Debug.Print "End GoSubTest" Exit Sub Sub1: Debug.Print "Sub1" Return End Sub
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 を宣言しておくと 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 はエラー番号(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 SubTest(msg As String) Debug.Print msg End Sub
Subプロシージャは次のように呼び出します。
SubTest "ABC"
Functionプロシージャを定義します。プロシージャ名と同じ名前の変数に値を代入するとその値が戻り値となります。
Function FunctionTest(x As Long, y As Long) FunctionTest = x + y End Function
Functionプロシージャは次のように呼び出します。
z = FunctionTest(5, 3)
ファイル番号(#)には 1~511 の数字を指定します。モードには 読込みモード(Input)、書込みモード(Output)、追記モード(Append)、バイナリモード(Binary)、ランダムアクセスモード(Random)のいずれかを指定します。
Open "C:\Temp\data.txt" For Input As #1 ... Close #1
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 # は 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 モードを用います。
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
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行の長さを制限します。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 は開いているファイルをすべて閉じます。
Open "C:\Temp\data1.txt" For Input As #1 Open "C:\Temp\data2.txt" For Input As #2 Reset
Lock はファイルをロックして他からの書き込みを禁止します。Unlock はロックを解除します。
Lock #1 ... Unlock #1
Seek はファイルの読込位置・書き込み位置を変更します。Random モードの時はレコード数、その他の時は先頭からのバイト数で指定します。
Seek #1, 1024
ChDrive "D"
ChDir "C:\Home"
MkDir "C:\Home\Work"
RmDir "C:\Home\Work"
FileCopy fromFile, toFile
Name oldName newName
Kill "C:\Home\xxx.txt"
属性には 標準(vbNormal:0)、読み取り専用(vbReadOnly:1)、非表示(vbHidden:2)、システムファイル(vbSystem:4:Windowsのみ)、バックアップ対象(vbArchive:32)、エイリアス(vbAlias:64:Macのみ) の合計値を指定します。
SetAttr "C:\Home\xxx.txt" vbReadOnly + bvHidden
RSet は文字列を右寄せ、LSet は左寄せします。
Dim str As String * 10 RSet str = "ABC" '[ ABC] LSet str = "ABC" '[ABC ]
文字列の開始位置から文字数分を置換します。
Dim str As String
str = "ABCDEFG"
Mid(str, 5, 3) = "XYZ" 'ABCDXYZ
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
日付や時刻を得ます。システム日付・時刻を設定することもできます。
Debug.Print Date '2024/09/02 Debug.Print Time '23:59:59
Subプロシージャや Functionプロシージャを呼び出します。Call は省略しても構いません。DLLモジュールを呼び出すこともできます。
Call MySubProcedure Call MyFunction
ビープ音を鳴らします。
Beep
処理を中断してデバッグモードに移行します。
Stop
乱数ジェネレータを初期化します。引数に数値を指定するとその値を、省略するとシステムタイマーを用いた値を使用します。初期化しない場合、Rnd は Excel を再起動する度(?)に、毎回決まったパターンの乱数を生成してしまいます。
Randomize For i = 0 To 10 Debug.Print Rnd Next
すでに開いているアプリケーションのウィンドウタイトルを指定してそのアプリケーションをアクティブにします。最近の Windows ではアプリケーションタイトルが表示されないことが多くなりましたが、[Alt]-[Tab] でアプリケーション切り替えを行うと表示されます。
AppActivate "コマンド プロンプト" AppActivate "ローカル ディスク (C:) - エクスプローラー"
下記の様に起動していないアプリケーションを指定することもできます。(Excel 2019 では何故か起動はできてもエラーとなりました。)
Dim app app = Shell("C:\Windows\notepad.exe", 1) AppActivate app
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
True または False の値を持ちます。
Dim myValue As Boolean myValue = True
1バイト符号無し整数です。0~255 の値を持ちます。
Dim myValue As Byte myValue = 255
2バイト符号付き整数です。-32,768~32,767 の値を持ちます。
Dim myValue As Integer myValue = 32767
4バイト符号付き整数です。-2,147,483,648〜2,147,483,647 の値を持ちます。
Dim myValue As Long myValue = 2147483647
8バイト符号付き整数です。-9,223,372,036,854,775,808~9,223,372,036,854,775,807 の値を持ちます。64ビット環境で使用できます。
Dim myValue As LongLong myValue = 9223372036854775807
8バイトの符号付き実数です。-922,337,203,685,477.5808~922,337,203,685,477.5807 の値を持ちます。〇ドル〇セント などの通貨を表すのに使用されます。
Dim myValue As Currency myValue = 922337203685477.5807
浮動小数点数は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")
ポインタを格納するサイズの整数で、32ビットOSでは Long、64ビットOS では LongLong と同じ型になります。
Dim myValue As LongPtr
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
8バイトの浮動小数点数です。負の値は -1.79769313486231E308~-4.94065645841247E-324、正の値は 4.94065645841247E-324~1.79769313486232E308 の値を持ちます。
Dim myValue As Double myValue = 1.79769313486232E308
文字列を表します。固定長と可変長があり、固定長は約 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"
日時の値を持ちます。日付を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#
シートやセルなどのオブジェクトを格納できる型です。オブジェクト型の変数にオブジェクトを代入する際には Set を用います。
Dim myObject As Object Set myObject = ActiveSheet.Range("A1:C3")
Variant は「変異」という意味を持ちます。数値、文字列、オブジェクトなどどんな型の値でも代入することができます。
Dim x, y, z As Variant x = 123 y = "ABC" Set z = ActiveSheet.Range("A1:C3")
添字の最大値を指定して配列を定義します。下記の場合、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 を用いて配列を初期化することができます。最大値は省略し、型は Variant にしておく必要があります。
Dim data() As Variant data = Array("AAA", "BBB", "CCC")
下記の様にして高次元の配列を扱うことができます。
Dim data(2, 2) As String data(0, 0) = "A00" data(2, 2) = "A22"
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)
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 は配列を削除します。
Dim data(10) As String Erase data
Option Base は配列のデフォルトの下限値を変更します。モジュールの先頭に記述する必要があります。下記の場合 data(1), data(2) の2個の配列が作成されます。
Option Base 1 Dim data(2) As String
連想配列とも呼ばれます。キー(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 'すべてのキー・アイテムを削除する
コレクションはオブジェクトの集合です。
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
データ型を変換する関数群が用意されています。
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 '累乗(expr1のexpr2乗)
str1 & str2 '文字列の連結 variable Like pattern 'パターンにマッチすればTrue
expr1 = expr2 'expr1とexpr2が等しければTrue expr1 <> expr2 'expr1とexpr2が異なっていればTrue expr1 < expr2 'expr1がexpr2未満であればTrue expr1 <= expr2 'expr1がexpr2以下であればTrue expr1 > expr2 'expr1がexpr2より大きければTrue expr1 >= expr2 'expr1がexpr2以上であればTrue object1 Is object2 'オブジェクト比較(同じオブジェクトであればTrue)
expr1 And expr2 'expr1 かつ expr2 が True であればTrue expr1 Or expr2 'expr1 または expr2 が True であればTrue expr1 Xor expr2 'expr1とexpr2どちらか一方のみがTrueであればTrue expr1 Eqv expr2 'expr1とexpr2どちらか一方のみがTrueであればFalse expr1 Imp expr2 'expr1とexpr2の論理包含(※) 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 procedure
VBA 編集画面の [挿入]-[クラスモジュール] からクラスファイルを追加することができます。クラス名は Class1 などで作成されますが、ツリービュー下のプロパティウィンドウで MyClass などに変更することができます。作成したクラスは下記の様に利用することができます。
Dim object As New MyClass
クラスには Sub や Function でクラスメソッドを定義することができます。
Sub Hello() MsgBox "Hello!" End Sub
メソッドは下記の様に呼び出します。
Dim obj As New MyClass obj.Hello()
Public Name As String
Dim obj As New MyClass obj.Name = "Yamada" Debug.Print obj.Name
Class_Initialize メソッドはクラスインスタンスが生成された時に自動的に呼び出されます。引数を受け取ることはできません。
Private Sub Class_Initialize() ... End Sub
Class_Terminate メソッドはクラスインスタンスが破棄される時に自動的に呼び出されます。
Private Sub Class_Terminate() ... End Sub
クラスには下記の様にしてプロパティのゲッター・セッターを定義することができます。プロパティを参照・設定する際にチェックや変換などのロジックを追加することができます。
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")
インタフェースはクラスと似ていますが、SubプロシージャやFunctionプロシージャの名前と型のみを定義します。インタフェースを実装(Implement)するモジュールは、インタフェースが定義した名前や型に従って中身を実装します。
Public Sub Hello() End Sub
Implements MyInterface1 Public Sub MyInterface1_Hello() Debug.Print "Hello!" End Sub
Sub InterfaceTest() Dim obj As MyClass1 Set obj = New MyClass1 obj.MyInterface1_Hello End Sub
Application は Excel アプリケーションに関する様々なメソッド、プロパティをサポートしています。詳細は Application (↗) を参照してください。
Application
ScreenUpdating を False にしてセル操作を行い、操作が完了した時点で True に戻してやることで処理中の表示更新を抑制して性能を上げることができます。
Application.ScreenUpdating = False 'スクリーン描画を中断する Application.ScreenUpdating = True 'スクリーン描画を再開する
DisplayAlerts を False にすることで警告メッセージを一時的に抑制することができます。
Application.DisplayAlerts = False '警告メッセージの表示を抑制する Application.DisplayAlerts = True '警告メッセージの表示を再開する
Print メソッドは開発画面の [イミディエイト] ウィンドウにデバッグログを出力します。
Debug.Print "myValue=" & myValue
Assert メソッドは式を評価して FLASE であればブレークポイントを設定してデバッグモードに移ります。
Debug.Assert resultStatus<>"OK"
Excel ワークブックを示すオブジェクトです。詳細は Workbook (↗) を参照してください。
ThisWorkbook '現在のワークブック ActiveWorkbook 'アクティブなワークブック Workbooks("sample.xlsx") 'sample.xlsxワークブック workbook.Worksheets 'ワークシートのコレクション Worksheets("Sheet1") 'Sheet1ワークシート
Excel ワークシートを示すオブジェクトです。詳細は Worksheet (↗) を参照してください。
ActiveSheet workbook.Worksheets("Sheet1") Worksheets("Sheet1").Activate
セルやセル範囲を示すオブジェクトです。詳細は 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文字