とほほのVBA入門
浮動小数点数は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×10 4 ) のような数値を格納できます。負の値は -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) Dim myString As String myString = "ABCDEFG" Dim myString As String * 4 myString = "ABCD" myString = "ABCDEFG" myString "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) 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 StringReDim を用いると配列要素の値は初期化されてしまいますが、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) NextFor Each を用いる方法もあります。
For Each d In data Debug.Print d Next 配列を削除する(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 '累乗(expr1のexpr2乗) 文字列演算子(&, Like) 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) 論理演算子(And, Or, . ) 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 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 や 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) Private Sub Class_Initialize() . End Sub デストラクタ(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) MyInstance1 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 SubExcelオブジェクト
アプリケーション(Application)Application は Excel アプリケーションに関する様々なメソッド、プロパティをサポートしています。詳細は Application を参照してください。
ApplicationScreenUpdating を False にしてセル操作を行い、操作が完了した時点で True に戻してやることで処理中の表示更新を抑制して性能を上げることができます。
Application.ScreenUpdating = False 'スクリーン描画を中断する Application.ScreenUpdating = True 'スクリーン描画を再開するDisplayAlerts を False にすることで警告メッセージを一時的に抑制することができます。
Application.DisplayAlerts = False '警告メッセージの表示を抑制する Application.DisplayAlerts = True '警告メッセージの表示を再開する デバッグ(Debug)Print メソッドは開発画面の [イミディエイト] ウィンドウにデバッグログを出力します。
Debug.Print "myValue c"> 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("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) : ファイルの読み書き位置を返す (参照) エラー操作 オブジェクト操作 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状態を得る (参照)その他
パターン ABC? 'ABC と任意の1文字 ABC* 'ABC で始まる任意の文字列 ABC# 'ABC と任意の数字文字(0-9) [ABC] 'A または B または C [!ABC] 'A でも B でも C でもない1文字リンク
- リファレンス https://learn.microsoft.com/ja-jp/office/vba/api/overview/
- ステートメント https://learn.microsoft.com/ja-jp/office/vba/language/reference/statements
- 関数 https://learn.microsoft.com/ja-jp/office/vba/language/reference/functions-visual-basic-for-applications
- VBAオブジェクト https://learn.microsoft.com/ja-jp/office/vba/language/reference/objects-visual-basic-for-applications
- Excelオブジェクト https://learn.microsoft.com/ja-jp/office/vba/api/overview/excel