20230107エクセルVBA備忘録(配列)variant
久々にVBAを使ってみて、自分の中で整理されていなかった点の備忘録。
恥ずかしい。
配列の宣言について
よく、
(1)dim hairetu as variant
または、
(2)dim hairetu() as integer
等記載することがある。
(実際に使う場合は、
dim hairetu(5) as integer
とか書いたり
redim hairetu(5)とか要素数を追加する。特に(2)の場合必須。)
この使い分け。
間違うと「型が違う」とか、「インデックスが違う」とかのエラーメッセージ出る。
variantは何でもありの変数の型なので、
dim hairetu as variant
hairetu(1) = 100
で入りそうだが、 「型が一致しません」のエラー。
この場合、
Sub tamesi()
Dim hairetu As Variant ' (型が一致しません)
ReDim hairetu(3) 'これをいれるか
hairetu(1) = 100
MsgBox hairetu(1)
End Sub
Sub tamesi2()
Dim hairetu(3) As Variant ' (型が一致しません)こう直す
hairetu(1) = 100
MsgBox hairetu(1)
End Sub
でも、下のbufように、配列を配列で受ける場合、bufは、元のhairetuと同じ要素数の配列と判断されて、
エラーが出ない。
Sub tamesi3()
Dim hairetu(3) As Variant ' 配列を受ける場合
hairetu(1) = 100
Dim buf As Variant
buf = hairetu
MsgBox buf(1)
End Sub
またfor文の場合も
Sub tamesi4()
Dim hairetu(3) As Variant ' 配列の要素をbufにfor文で入れる場合(型が一致しません)
hairetu(1) = 100
Dim buf As Variant
Dim i As Long
For i = 0 To 2
buf(i) = hairetu(1)
Next i
MsgBox buf(1)
End Sub
ではダメで、
Sub tamesi5()
Dim hairetu(3) As Variant ' 配列の要素をbufにfor文で入れる場合(こう直す)
hairetu(1) = 100
Dim buf(3) As Variant
Dim i As Long
For i = 0 To 2
buf(i) = hairetu(i)
Next i
MsgBox buf(1)
Stop
End Sub
bufの要素数を宣言する必要がある。
つまり、配列を()なしのvariantで宣言する場合、中にいれるのは配列だと分かる場合(元から配列渡し)は、
要素数は不要だが、1個1個入れる(for文も)場合は、配列の要素数を入れないとエラーになる。
結構、エラーが嫌でvariantで受けるが、配列になるとvariantでもエラーが頻発する理由はこれです。
(すみません。汗。)
なお、(2)dim hairetu() as integerだが、数字のintegerをよく使うが、文字ならstringとかでいい。
Sub tamesi6()
Dim hairetu(3) As String '100を文字と見ている
hairetu(0) = "100"
hairetu(1) = 100
MsgBox hairetu(0)
MsgBox hairetu(1)
End Sub
この場合、hairetu(0) = "100"もhairetu(1) = 100も文字として認識している。
でも下記でも通ります。(エクセルならではかな。)
Sub tamesi7()
Dim hairetu(3) As Integer '100を数字と見ている
hairetu(0) = "100"
hairetu(1) = 100
MsgBox hairetu(0)
MsgBox hairetu(1)
End Sub
でも、当然下記はエラーになります。
Sub tamesi8()
Dim hairetu(3) As Integer '型が一致しません
hairetu(0) = "100kkk"
hairetu(1) = 100
MsgBox hairetu(0)
MsgBox hairetu(1)
End Sub
基本ですみません。
追記
きちんと試していないが、
配列をコピーするには、variantが簡単みたい。(別の変数に丸々コピーとか?)
integerだと、for文で回してコピーとか?
またエクセルシートだと、セル範囲も使えるので、この辺の扱いはまたいつか備忘録しようかな。
追記疑問
VBAの配列は、pythonのようなリストの切り出し[:mid]とかできないのかもしれない。
さらに追記
「array」を使うのもメモ。
Sub tamesi_array()
Dim hairetu() As Variant
hairetu = Array(1, 2, 3)
MsgBox hairetu(2)
End Sub