0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

EXCELで5ミリ方眼旋盤CAD(図形情報)

Last updated at Posted at 2020-02-14

前回の作図した図形情報を一覧にするプログラムを定義します。
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())

image.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?