2012年6月24日日曜日

[ExcelVBA] 配列


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


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

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

┗要素数が不確定

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

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


まずは、サンプルコードから。
Option Explicit

Sub Sample()
    '■要素数が確定している
    '(1)要素数が少ない
    '  ・要素数 :宣言時に要素数を指定
    '  ・型の指定:任意の型を指定
    '    ・代入方法:要素別に一つ一つ代入する
    '
    ' -ポイント-
    '  ⇒配列の最初の要素は0から始まる
    '  ⇒宣言時に指定する要素の値は、最後のインデックス番号。
    Dim test1(2) As String '3個の要素を用意
    test1(0) = "あああ"
    test1(1) = "いいい"
    test1(2) = "ううう"
    
    '内容確認
    Dim val As Variant
    For Each val In test1
        Debug.Print val
    Next


'----------------------------------------------------------------
    '■要素数が確定している
    '(2)要素数が多い
    '  ・要素数 :宣言時に要素数を指定しない
    '  ・型の指定:Variant型のみ
    '    ・代入方法:Array関数を使ってまとめて代入
    '
    ' -ポイント-
    '  ⇒Array関数は、Variant型のみ
    Dim test2() As Variant
    test2 = Array("1月", "2月", "3月", "4月", "5月", "6月", _
                  "7月", "8月", "9月", "10月", "11月", "12月")
    
    '内容確認
    For Each val In test2
        Debug.Print val
    Next


'----------------------------------------------------------------
    '■要素数が不確定
    ' 初期に何か入力することがある
    '(3)入力要素数が少ない
    '  ・要素数 :宣言時に要素数を指定しない
    '  ・型の指定:Variant型のみ
    '    ・代入方法:要素別に一つ一つ代入する
    '
    ' -ポイント-
    '  ⇒ReDim 変数(最後の要素番号)で配列の要素数を変更
    '   ただし、既に代入している値はリセットされる
    '  ⇒ReDimと一緒にPreserveを使うと既に代入している値が引継がれます
    Dim test3() As Variant
    ReDim test3(2)
    test3(0) = "000"
    test3(1) = "111"
    test3(2) = "222"
    
    '追加代入
    Dim i As Integer
    For i = UBound(test3) + 1 To 9 'UBoundで一番最後の要素番号を調べる
        ReDim Preserve test3(i) 'Preserve…既に代入している値が引継がれます
        test3(i) = CStr(i & i & i)
    Next
    
    '内容確認
    For Each val In test3
        Debug.Print val
    Next
    
    
'----------------------------------------------------------------
    '■要素数が不確定
    ' 初期に何か入力することがある
    '(4)入力要素数が多い
    '  ・要素数 :宣言時に要素数を指定しない
    '  ・型の指定:Variant型のみ
    '    ・代入方法:Array関数を使ってまとめて代入
    '
    ' -ポイント-
    '  ⇒Array関数は、Variant型のみ
    '  ⇒ReDim 変数(最後の要素番号)で配列の要素数を変更
    '   ただし、既に代入している値はリセットされる
    '  ⇒ReDimと一緒にPreserveを使うと既に代入している値が引継がれます
    Dim test4() As Variant
    test4 = Array("あいうえお", True, Date, Time) 'Variantなので複数の型を格納できる
    
    '追加代入
    For i = UBound(test4) + 1 To 9 'UBoundで一番最後の要素番号を調べる
        ReDim Preserve test4(i) 'Preserve…既に代入している値が引継がれます
        test4(i) = i ^ i
    Next
    
    '内容確認
    For Each val In test4
        Debug.Print val
    Next
    
    
'----------------------------------------------------------------
    '■要素数が不確定
    '(5)初期に何か入力することがない
    '  ・要素数 :宣言時に要素数を指定しない
    '  ・型の指定:任意の型を指定
    '    ・代入方法:要素別に一つ一つ代入する
    '
    ' -ポイント-
    '  ⇒要素数を宣言する前にUBoundを使うとエラーになります
        
    'Case1
    Dim test5() As String
    For i = 0 To 9
        ReDim Preserve test5(i)
        test5(i) = i ^ 3
    Next
    
    '内容確認
    For Each val In test5
        Debug.Print val
    Next
    
    
    'Case2
    Dim test6() As String
    test6 = Split("あ,い,う,え,お", ",")

    '内容確認
    For Each val In test6
        Debug.Print val
    Next
End Sub


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


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



0 件のコメント: