未分類

一次元配列の各要素の変数型を変換する

この汎用プロシージャを研究した理由

自分が作成した「VA公用文」というWordマクロで一次元配列の変数型の変換を行っているが、この汎用プロシージャを使って各要素の変数型を変換した方が便利なのではないかと思ったから。

「VA公用文」のコード

配列自体をバリアント型からdouble型に変換している。

配列の作成(参考)

'見出しレベルごとの左インデントの値を定数に設定する
'1番目が見出し1、10番目が標準です。
Const strLeftIndents As String = "2,1,1,1,1,1,1,1,1,0"                                      

'左インデントの値を配列に入れる
'最初に空要素を追加して、1番目の要素以降に入力します。
varLeftIndents =Split("," & strLeftIndents, ",")

配列の変換

'配列の型を数値に変換する
'文字列のままではインデント調整のための計算に使用できません。
Dim x As Long                       '見出しレベル
Dim dblLeftIndents(11) As Double    '左インデント(文字数単位)の配列
For x = 0 To 10
   dblLeftIndents(x) = Val(varLeftIndents(x))
Next

「超効率化テクニック」の汎用プロシージャのコード

配列全体ではなく、配列の要素だけを引数で指定した変数型に変換している。

Enumの設定

引数の変数型をEnumで設定することにより、プロシージャを呼び出す際のインテリセンス候補数を少なくしている。

Public Enum EnumVarType '変数型のEnum
     vbString_ = 1
     vbLong_ = 2
     vbDouble_ = 3
     vbDate_ = 4
End Enum

配列の変換

変数型の引数にEnumで設定したEnumVarTypeを指定している。

Enumを使わない場合は、EnumVarTypeの代わりにVbVarTypeを用いる。その場合は、4つの変数型以外が引数で渡された場合の処理が必要となる。

Public Function ConvVarTypeArray1D(ByRef Array1D As Variant, _
                                  ByRef VarType_ As EnumVarType) _
                                                 As Variant
'一次元配列の各要素の変数型を変換する

'引数
'Array1D ・・・一次元配列
'VarType_・・・変換後の変数型

    '引数チェック
    Call CheckArray1D(Array1D)
    Call CheckArray1DStart1(Array1D)
    
    '処理
    Dim I      As Long
    Dim N      As Long: N = UBound(Array1D, 1)
    Dim Value  As Variant
    Dim Output As Variant: ReDim Output(1 To N)
    
    For I = 1 To N
        Value = Array1D(I)
        Select Case VarType_
            Case EnumVarType.vbString_
                'String型に変換
                Output(I) = CStr(Value)
                
            Case EnumVarType.vbLong_
                'Long型に変換
                Output(I) = CLng(Value)
                
            Case EnumVarType.vbDouble_
                'Doubleに変換
                Output(I) = CDbl(Value)
                
            Case EnumVarType.vbDate_
                'Date型に変換
                Output(I) = CDate(Value)

        End Select
    Next
    
    '出力
    ConvVarTypeArray1D = Output
    
End Function

結論

この汎用プロシージャ自体を使うことはなさそう。

理由:

複雑になる。

インテリセンスの候補を少なくすることに魅力を感じない。

変換後も配列の変数型をバリアント型に保つ必要性が感じられない。

コメント

タイトルとURLをコピーしました