myTemplate 配列=Range代入

配列数式で扱う2次元配列の処理は、For Eachで処理することが多いが初めから配列に入れて処理する方法もある。

'配列にRangeのデータを入れる
Function aa(r As Range)
    Dim ar()
    ar = r 'セルの値が入る
    Dim i As Integer, j As Integer
    For i = 1 To UBound(ar, 1) '2次元配列の1番目、行。1から始めるのはrがRangeだから
        For j = 1 To UBound(ar, 2) '2次元配列の2番目、列
            ar(i, j) = i & "," & j & "," & ar(i, j)
        Next
    Next
    aa = ar
End Function

For i=1から始まることに注意。配列の要素番号は0から始まるのが普通だが、動的配列ar()にRangeを入れると要素番号/インデックス番号は1から始まる。

データベースのような表からデータの取り出しは行単位になる。ある条件で取り出して別の配列arrに入れる。行単位に処理するのでFor文の列の処理の前にIf条件文を入れることになる。

'配列にRangeのデータを入れる
Function myTenplate(r As Range)
    Dim ar() 'Rangeの範囲のデータを入れる動的配列
    ar = r 'セルの値が入る
    Dim i As Integer, j As Integer
    j = 1 'For文の中で使い始めで0だと飛ぶため。
    Dim arr(1 To 100, 1 To 10) '関数値用。スタートを1にして列のjをそのまま使う。1000くらいにやると重く、飛ぶことも。
    Dim ii As Integer 'arrの行番号用、列はjを使う
    For i = 1 To UBound(ar, 1) '2次元配列の1番目、行。1から始めるのはrがRangeだから
        If i = 1 Or i = 3 Then '条件、1と3の行だけ
            ii = ii + 1 'スタートが1なので先に1にしておく
            For j = 1 To UBound(ar, 2) '2次元配列の2番目、列
               arr(ii, j) = i & "," & j & "," & ar(i, j)
            Next
        End If
    Next
    myTenplate = arr
End Function

2次元配列の処理は頭の中で処理できるほど簡単では無い。難しくしているのがi,jなどの変数とそれが位置を意味しており、ar(i,j)で一つのデータ。2次元配列の音からデータが2つあると勘違いしてはいけない。私だけかもしれないが。

時間はかかってもワークシート関数を駆使して「やっぱできない」ってことはプログラムの世界ではありませんし、使った時間はスキルアップになります。

(Visited 106 times, 1 visits today)
カテゴリー: 9 セルの中で使うユーザー定義関数の作成 <VBA> パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です