前回の作図した図形情報を一覧にするプログラムを定義します。
QL_INITは、図形情報を収納する領域を確保し、"NAME"というタイトルを付けます。
RANGE関数をさらに拡張し組込むに伴って、QL_INIT()を書き換えて、関数M_()を廃止しました。
Function QL_SHAPES(Optional S = "")
On Error Resume Next
S = QL_INIT(ActiveSheet.Shapes.Count, "NAME")
For I = 1 To UBound(S)
S(I, 1) = ActiveSheet.Shapes(I).Name
Next I
QL_SHAPES = S
End Function
Function QL_INIT(M, N, Optional L1 = 1, Optional L2 = 1, Optional S = "")
On Error Resume Next
If TR_(M) Then
S = M
S = QL_INIT(S, N, L1, L2)
ElseIf TV_(M) Then
S = QL_INIT(UBound(M, 1), N, L1, L2)
For I = 1 To UBound(M, 1)
For J = 1 To UBound(M, 2)
S(I, J) = M(I, J)
Next J
Next I
ElseIf TS_(M) Then
S = QL_INIT(M_(M), N, L1, 1)
ElseIf TS_(N) Then
T = A_(N, ","): N = UBound(T) - LBound(T) + 1
S = QL_INIT(M, N, 0, 1)
For J = 1 To N: S(0, J) = T(J - 1): Next J
Else
ReDim S(L1 To M, L2 To N)
For J = L2 To N: For I = L1 To M: S(I, J) = "": Next I: Next J
End If
QL_INIT = S
End Function
QL_INITの説明
QL_INITは、関数M_(),A_()と自分自身を呼んでいます。
M_()は、文字列を2次元配列に、A_()は一次元配列に変換します。
引数の型を別の型に変換して、自分自身を呼びます。
そのさいに、引数に型宣言がされているとエラーに引っ掛かります。
VBAの引数型宣言は、有害無益のものだと思います。
VBAにかぎっては、型宣言不要のプログラミング作法で良いと思います。
Function M_(V, Optional S = "")
On Error Resume Next
T = SPLIT_(V, ",")
N = UBound(T) + 1
U = SPLIT_(T(0), " ")
M = UBound(U) + 1
S = QL_INIT(M, N)
For J = 0 To N
U = SPLIT_(T(J), " ")
For I = 0 To M
S(I + 1, J + 1) = U(I)
Next I
Next J
M_ = S
End Function
Function A_(V, Optional D = "")
A_ = SPLIT_(V, D)
End Function
Function SPLIT_(V, D)
SPLIT_ = Split(Trim_(V), D)
End Function
Function Trim_(V)
Trim_ = WorksheetFunction.Trim(V)
End Function
恒投射について
関数QL_SHAPES()は引数を持ちませんので、自動計算されません。
そこで関数I_()を挟みます。
Function I_(A, V) ' 恒投射
I_ = V
End Function
引数Aに適当なセルのアドレスを指定すると、指定したセルの内容の変化で、関数Vが呼ばれる仕組みです。
(AA1) =I_(A1,QL_SHAPES())