今回は型の種類と配列の使い方について。型は何でも代入できる Variant 型が存在するのがポイント。配列は要素数の指定方法に若干クセがあるので注意。
変数と定数の宣言
変数と定数を宣言する方法について。型は変数名の後ろに As を付けて指定する。1. 変数の宣言
'グローバル変数
Public num_a As Long
'モジュールレベル変数
Dim num_b As Long
Sub Macro1()
'ローカル変数
Dim num_c As Long
・・・・
End Sub
2. 定数の宣言
'グローバル定数
Public Const num_a As Long = 100
'モジュールレベル定数
Const num_b As Long = 100
Sub Macro1()
'ローカル定数
Const num_c As Long = 100
・・・・
End Sub
また、信号を複数宣言する場合は型をまとめる事ができないので注意。(地味にツライ...)
型が省略された場合は Variant 型となる。
'var1: Long型, var2: Long型
Dim var1 As Long, var2 As Long
'var3: Variant型, var4: Long型
Dim var3, var4 As Long
型の種類
型 | 用途 |
---|---|
String | 文字列型 |
Boolean | 真偽値型 True, False |
Byte | バイト型 0~255 |
Integer | 整数型 -32,767 ~ 32,767の範囲の整数。 |
Long | 長整数型 -2,147,483,647 ~ 2,147,483,647 |
Currency | 通貨型 -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 |
Single | 単精度浮動小数点型 正の値: 3.402823E+38 ~ 1.401298E-45 負の値: -3.402823E+38 ~ -1.401298E-45 |
Double | 倍精度浮動小数手型 正の値: 4.94065645841247E-324 ~ 1.79769313486232E+308 負の値: -4.94065645841247E-324 ~ -1.79769313486232E+308 |
Date | 日付型 西暦100年1月1日~西暦9999年12月31日 0:00:00~23:59:59 |
Object | オブジェクト型 |
Variant | バリアント型 (どんな値やオブジェクトでも代入可能) |
上記の他に Range や Worksheet 等、特定の種類のオブジェクトがある。
文字列型として代入する場合は " で文字列を括る。
日付型として代入する場合は # で日時を括る。(" で括る方法や CDate 関数もあるけど割愛)
Dim S As String
Dim D As Date
S = "moji"
D = #1/1/2020 1:02:03 AM# '月/日/年 時:分:秒
型を取得
変数の型を取得したい場合は VarType 関数を使用する。型ごとに決まった整数を返す。(Debug.Print 文中にあるセミコロン(;)は「改行無し」を示す。)Dim stVar As String
Dim boVar As Boolean
Dim byVar As Byte
Dim inVar As Integer
Dim loVar As Long
Dim cuVar As Currency
Dim siVar As Single
Dim doVar As Double
Dim daVar As Date
Dim obVar As Object
Dim vaVar As Variant
Debug.Print "String : "; VarType(stVar)
Debug.Print "Boolean : "; VarType(boVar)
Debug.Print "Byte : "; VarType(byVar)
Debug.Print "Integer : "; VarType(inVar)
Debug.Print "Long : "; VarType(loVar)
Debug.Print "Currency : "; VarType(cuVar)
Debug.Print "Single : "; VarType(siVar)
Debug.Print "Double : "; VarType(doVar)
Debug.Print "Date : "; VarType(daVar)
Debug.Print "Object : "; VarType(obVar)
Debug.Print "Variant : "; VarType(vaVar)
実行結果String : 8
Boolean : 11
Byte : 17
Integer : 2
Long : 3
Currency : 6
Single : 4
Double : 5
Date : 7
Object : 9
Variant : 0
配列
配列の使い方としていくつか例を記載する。Sub - End Sub は省略します。また、連想配列については別の記事で書くこととします。
配列 : 要素数を指定
要素数を予め宣言しておく。以下の例のように arrList(2) とした場合、(0)~(2) の3要素を宣言したことになる。C言語に慣れていると記述ミスが起こりやすい。
また、arrList(0 To 2) のように範囲を指定して記述する事もできる。個人的にはこちらの方が分かりやすい。
'変数と要素数を宣言
Dim arrList(2) As Variant
'各要素に値を代入
arrList(0) = "aaa"
arrList(1) = "bbb"
arrList(2) = "ccc"
'イミディエイトに出力
Debug.Print arrList(0)
Debug.Print arrList(1)
Debug.Print arrList(2)
実行結果aaa
bbb
ccc
上で arrList(2) は3要素を宣言と書いたが、宣言セクション(最初のプロシージャより上の部分)に Option Base 1 と記述されていると配列の(0)は無効になる。今回の例だと(1)~(2)の2要素のみを宣言した事になってしまう。たまに苦しめられる。
配列 : Array 関数を用いて配列化
'変数を宣言
Dim arrList As Variant
'Array 関数を使って代入
arrList = Array("aaa", "bbb", "ccc")
'イミディエイトに出力
Debug.Print arrList(0)
Debug.Print arrList(1)
Debug.Print arrList(2)
実行結果aaa
bbb
ccc
配列 : Sprit 関数を用いて配列化
前述した Option Base は Split 関数使用時は無効なので注意。((0)から挿入される)'変数を宣言
Dim arrList As Variant
'Split 関数を使って代入
arrList = Split("aaa,bbb,ccc", ",")
'イミディエイトに出力
Debug.Print arrList(0)
Debug.Print arrList(1)
Debug.Print arrList(2)
実行結果aaa
bbb
ccc
配列 : 多次元配列
次元毎に要素数を指定する。'変数と要素数を宣言
Dim arrList(2, 1) As Variant
'各要素に値を代入
arrList(0, 0) = "aaa"
arrList(0, 1) = 1
arrList(1, 0) = "bbb"
arrList(1, 1) = 2
arrList(2, 0) = "ccc"
arrList(2, 1) = 3
'イミディエイトに出力
For i = 0 To 2
For j = 0 To 1
Debug.Print arrList(i, j);
Next j
Debug.Print
Next i
実行結果aaa 1
bbb 2
ccc 3
配列 : 要素数の取得
要素数を取得したい場合は UBound 関数を使う。(場合によっては LBound 関数も)'変数と要素数を宣言
Dim arrList(2, 1) As Variant
'要素数を取得
Debug.Print UBound(arrList) + 1 '次元を省略 -> 1次元目の要素数が返る
Debug.Print UBound(arrList, 1) + 1 '1次元
Debug.Print UBound(arrList, 2) + 1 '2次元
実行結果 3
3
2
インデックス番号が0始まりでない場合は以下のようになる。
'変数と要素数を宣言
Dim arrList(2 To 5) As Variant
'UBound と LBound を確認
Debug.Print UBound(arrList)
Debug.Print LBound(arrList)
'要素数を取得
Debug.Print UBound(arrList) - LBound(arrList) + 1
実行結果 5
2
4
配列 : 動的配列
ReDim で要素数を動的に指定する事ができる。多次元配列の場合も同様に指定可能。'変数を宣言 (要素数は空)
Dim arrList() As Variant
'要素数を指定
ReDim arrList(2)
'各要素に値を代入
arrList(0) = "aaa"
arrList(1) = "bbb"
arrList(2) = "ccc"
'イミディエイトに出力
Debug.Print arrList(0)
Debug.Print arrList(1)
Debug.Print arrList(2)
実行結果aaa
bbb
ccc
配列 : 要素数の拡張
要素数を拡張する場合は ReDim Preserve を使う。Preserve が無いと既存の配列データが削除される。尚、多次元配列の要素数の拡張も可能だが、Preserve を使う場合は一次元目の要素は拡張できないという謎仕様なので注意。地味に不便。二次元配列の場合なんかは一次元目と二次元目を入れ替えて使えば何とかなると思われる。分かりにくいけど。
'要素数を指定
ReDim arrList(1)
'各要素に値を代入
arrList(0) = "aaa"
arrList(1) = "bbb"
'イミディエイトに出力
For Each temp In arrList
Debug.Print temp;
Next
Debug.Print
'要素数を確認 -> 拡張 -> 要素を追加
ReDim Preserve arrList(UBound(arrList) + 1)
arrList(2) = "ccc"
'イミディエイトに出力
For Each temp In arrList
Debug.Print temp;
Next
Debug.Print
実行結果aaabbb
aaabbbccc
前述した要素数の取得と組み合わせると汎用性があっていいかもしれない。
Dim num As Long
'要素数を拡張 -> 要素を追加
num = UBound(arrList)
ReDim Preserve arrList(num + 1)
arrList(num + 1) = "ccc"
0 件のコメント:
コメントを投稿