2018年6月5日火曜日

【VBA】配列の結合


VBAとかってさ、いろいろ甘く作ってくれてるから、
簡単に配列を結合できるコマンドがあったりしないかな?思ったんだけど…
…どうやら無いらしいorz

そんなわけで、ぐぐってたら、配列の要素をつなげてString型にするJoin()と、
逆に、Stringをセパレータで切り分けて配列にするSplit()を組み合わせてできるらしい。

  1. Dim Arr_A As Variant
  2. Dim Arr_B As Variant
  3. Dim Arr_C As Variant
  4. Arr_A = Array("あ", "い")
  5. Arr_B = Array("う", "え", "お")
  6. Arr_C = Split(Join(Arr_A) & " " & Join(Arr_B))

要点だけ書くとこう。

ここで、やっとVariant型ってのがどーゆーモノか、わかった気がする。
…ボク、いままで、Arrayつかって配列要素書くとき、
Dim Arr_A() As Variant
って書いてたのだ。
Array()を調べたとき、Exampleがこー書かれていて、
しかも、Variant型にしか入れられませんよ。と、注釈されていたのだ。
わかった気がすると、コレで動くのもわかった気がするけど、
まず、釈然としないながらも丸写ししてたボクがゆるせず、
あの説明を書いたヤツを(2048MB省略)

つまりはVariantの変数は、アドレスが格納されている。
ArrayやSplitの返り値は、配列の先頭メモリアドレスだってーコトがやっと理解できた。
恐らくは、BooleanでもObjectでも叩き込めるのは、
Variant型に指定した変数のサイズが変わるんではなく、
参照先がかわるだけなんじゃないかな( ゚-゚)~゚(わかった気分

そんなわけでテスト

  1. Public Sub JoinAndSplit()
  2. Dim Arr_A As Variant
  3. Dim Arr_B As Variant
  4. Dim Arr_C As Variant
  5. Dim i As Integer
  6. Arr_A = Array("あ", "い")
  7. Arr_B = Array("う", "え", "お")
  8. VerTypeCheck (Arr_C) 'Empty:Empty値 (未初期化)
  9. Debug.Print Join(Arr_A)
  10. Debug.Print Join(Arr_B)
  11. Arr_C = Split(Join(Arr_A) & " " & Join(Arr_B))
  12.  
  13. For i = 0 To UBound(Arr_C)
  14. Debug.Print Arr_C(i)
  15. Next
  16.  
  17. VerTypeCheck (Join(Arr_B)) 'String:文字列型
  18. VerTypeCheck (Arr_A(0)) 'String:文字列型
  19. VerTypeCheck (Arr_C) '配列:Variant:バリアント型 (バリアント型配列にのみ使用)
  20.  
  21. End Sub

納得の結果(*゚-゚) ちなみに、VerTypeCheck は、変数がナニモノかを知るボク作関数
てゆか返り値はStringの方が使いやすいか。なにげによく使うのでそのうち変えよう。

…はて、文字列型はコレでいいとしてIntegerだったらどーすんだろ…
と、思い、ぺぺいっと…

  1. Public Sub JoinAndSplit2()
  2. Dim Arr_A As Variant
  3. Dim Arr_B As Variant
  4. Dim Arr_C As Variant
  5. Dim i As Integer
  6. Arr_A = Array(1, 2)
  7. Arr_B = Array(3, 4, 5)
  8. VerTypeCheck (Arr_C) 'Empty:Empty値 (未初期化)
  9. Debug.Print Join(Arr_A)
  10. Debug.Print Join(Arr_B)
  11. Arr_C = Split(Join(Arr_A) & " " & Join(Arr_B))
  12.  
  13. For i = 0 To UBound(Arr_C)
  14. Debug.Print Arr_C(i)
  15. Next
  16.  
  17. VerTypeCheck (Join(Arr_B)) 'String:文字列型
  18. VerTypeCheck (Arr_A(0)) 'Integer:整数型
  19. VerTypeCheck (Arr_C) '配列:Variant:バリアント型 (バリアント型配列にのみ使用)
  20.  
  21. End Sub

おおお、Arr_A(0)がちゃんとIntegerになってる!!
すげーぜBASIC!!

って…ホントはLongにしたかったらどーすんだよ( ゚-゚)~゚
Array()で仕込むときにcastとかで明示的にできるんだろうか。
要素の一つを明示的に宣言した変数を入れりゃいいかも…?

…疑問は尽きないが、ねむいしめんどちいので、この件はココまで(ぉぃ


0 件のコメント:

コメントを投稿