2012年6月24日日曜日

[ExcelVBA] 配列


配列についていろいろメモしときます。
Optin Baseのように使わない情報はすっとばしますよっと。


配列といえば複数の値を格納できる変数ですね。
宣言の仕方や、要素の入力方法に違いがあるので選ぶ基準からメモっていきます。
頭の中で考えてく流れを現してみました。

◆配列作成の流れ
┳要素数が確定している
┃ ┃
┃ ┣(1)要素数が少ない
┃ ┃  ・要素数 :宣言時に要素数を指定
┃ ┃  ・型の指定:任意の型を指定
┃ ┃  ・代入方法:要素別に一つ一つ代入する
┃ ┃
┃ ┗(2)要素数が多い
┃    ・要素数 :宣言時に要素数を指定しない
┃    ・型の指定:Variant型のみ
┃    ・代入方法:Array関数を使ってまとめて代入

┗要素数が不確定

┣初期に何か入力することがある
┃  ┃
┃  ┣(3)入力要素数が少ない
┃  ┃  ・要素数 :宣言時に要素数を指定しない
┃  ┃  ・型の指定:Variant型のみ
┃  ┃  ・初期代入:要素別に一つ一つ代入する
┃  ┃
┃  ┗(4)入力要素数が多い
┃     ・要素数 :宣言時に要素数を指定しない 
┃     ・型の指定:任意の型を指定
┃     ・初期代入:Array関数を使ってまとめて代入

┗(5)初期に何か入力することがない
・要素数 :宣言時に要素数を指定しない
・型の指定:任意の型を指定
・代入方法:要素別に一つ一つ代入する


まずは、サンプルコードから。
  1. Option Explicit  
  2.   
  3. Sub Sample()  
  4.     '■要素数が確定している  
  5.     '(1)要素数が少ない  
  6.     '  ・要素数 :宣言時に要素数を指定  
  7.     '  ・型の指定:任意の型を指定  
  8.     '    ・代入方法:要素別に一つ一つ代入する  
  9.     '  
  10.     ' -ポイント-  
  11.     '  ⇒配列の最初の要素は0から始まる  
  12.     '  ⇒宣言時に指定する要素の値は、最後のインデックス番号。  
  13.     Dim test1(2) As String '3個の要素を用意  
  14.     test1(0) = "あああ"  
  15.     test1(1) = "いいい"  
  16.     test1(2) = "ううう"  
  17.       
  18.     '内容確認  
  19.     Dim val As Variant  
  20.     For Each val In test1  
  21.         Debug.Print val  
  22.     Next  
  23.   
  24.   
  25. '----------------------------------------------------------------  
  26.     '■要素数が確定している  
  27.     '(2)要素数が多い  
  28.     '  ・要素数 :宣言時に要素数を指定しない  
  29.     '  ・型の指定:Variant型のみ  
  30.     '    ・代入方法:Array関数を使ってまとめて代入  
  31.     '  
  32.     ' -ポイント-  
  33.     '  ⇒Array関数は、Variant型のみ  
  34.     Dim test2() As Variant  
  35.     test2 = Array("1月""2月""3月""4月""5月""6月", _  
  36.                   "7月""8月""9月""10月""11月""12月")  
  37.       
  38.     '内容確認  
  39.     For Each val In test2  
  40.         Debug.Print val  
  41.     Next  
  42.   
  43.   
  44. '----------------------------------------------------------------  
  45.     '■要素数が不確定  
  46.     ' 初期に何か入力することがある  
  47.     '(3)入力要素数が少ない  
  48.     '  ・要素数 :宣言時に要素数を指定しない  
  49.     '  ・型の指定:Variant型のみ  
  50.     '    ・代入方法:要素別に一つ一つ代入する  
  51.     '  
  52.     ' -ポイント-  
  53.     '  ⇒ReDim 変数(最後の要素番号)で配列の要素数を変更  
  54.     '   ただし、既に代入している値はリセットされる  
  55.     '  ⇒ReDimと一緒にPreserveを使うと既に代入している値が引継がれます  
  56.     Dim test3() As Variant  
  57.     ReDim test3(2)  
  58.     test3(0) = "000"  
  59.     test3(1) = "111"  
  60.     test3(2) = "222"  
  61.       
  62.     '追加代入  
  63.     Dim i As Integer  
  64.     For i = UBound(test3) + 1 To 9 'UBoundで一番最後の要素番号を調べる  
  65.         ReDim Preserve test3(i) 'Preserve…既に代入している値が引継がれます  
  66.         test3(i) = CStr(i & i & i)  
  67.     Next  
  68.       
  69.     '内容確認  
  70.     For Each val In test3  
  71.         Debug.Print val  
  72.     Next  
  73.       
  74.       
  75. '----------------------------------------------------------------  
  76.     '■要素数が不確定  
  77.     ' 初期に何か入力することがある  
  78.     '(4)入力要素数が多い  
  79.     '  ・要素数 :宣言時に要素数を指定しない  
  80.     '  ・型の指定:Variant型のみ  
  81.     '    ・代入方法:Array関数を使ってまとめて代入  
  82.     '  
  83.     ' -ポイント-  
  84.     '  ⇒Array関数は、Variant型のみ  
  85.     '  ⇒ReDim 変数(最後の要素番号)で配列の要素数を変更  
  86.     '   ただし、既に代入している値はリセットされる  
  87.     '  ⇒ReDimと一緒にPreserveを使うと既に代入している値が引継がれます  
  88.     Dim test4() As Variant  
  89.     test4 = Array("あいうえお"TrueDate, Time) 'Variantなので複数の型を格納できる  
  90.       
  91.     '追加代入  
  92.     For i = UBound(test4) + 1 To 9 'UBoundで一番最後の要素番号を調べる  
  93.         ReDim Preserve test4(i) 'Preserve…既に代入している値が引継がれます  
  94.         test4(i) = i ^ i  
  95.     Next  
  96.       
  97.     '内容確認  
  98.     For Each val In test4  
  99.         Debug.Print val  
  100.     Next  
  101.       
  102.       
  103. '----------------------------------------------------------------  
  104.     '■要素数が不確定  
  105.     '(5)初期に何か入力することがない  
  106.     '  ・要素数 :宣言時に要素数を指定しない  
  107.     '  ・型の指定:任意の型を指定  
  108.     '    ・代入方法:要素別に一つ一つ代入する  
  109.     '  
  110.     ' -ポイント-  
  111.     '  ⇒要素数を宣言する前にUBoundを使うとエラーになります  
  112.           
  113.     'Case1  
  114.     Dim test5() As String  
  115.     For i = 0 To 9  
  116.         ReDim Preserve test5(i)  
  117.         test5(i) = i ^ 3  
  118.     Next  
  119.       
  120.     '内容確認  
  121.     For Each val In test5  
  122.         Debug.Print val  
  123.     Next  
  124.       
  125.       
  126.     'Case2  
  127.     Dim test6() As String  
  128.     test6 = Split("あ,い,う,え,お"",")  
  129.   
  130.     '内容確認  
  131.     For Each val In test6  
  132.         Debug.Print val  
  133.     Next  
  134. End Sub  


◆注意点のまとめ。
・配列の最初の要素は0から始まる
・Dim or ReDimで要素数を指定する場合最後の要素番号を書く
・Array関数を使う時は、Variantのみ
・ReDimだけだと既に入力した値は消えるのでPreserveも指定することで
既に入力してある値を引き継いでつかう。
・UBoundで一番最後の要素番号を調べれる。
ただし、要素数の宣言をしていない配列を引数に渡すとエラーとなる。
・Splite関数の値を受け取る場合、変数の要素数を指定しておくとエラーとなる。


◆配列の初期化
  1. Erase 変数  
静的宣言の場合…Dimで要素数を宣言している場合、各要素が各要素がクリアされる。
動的宣言の場合…Dimで要素数を宣言していない場合、要素数自体クリアされる。



0 件のコメント: