エクセルVBA備忘録(配列)variant・integer等違い

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