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.

SPILL関数でカレンダーを作成してみる。

Last updated at Posted at 2020-01-09

以前投稿した Excelでカレンダーを作ってみるをSPILLで書き直してみました。

今回は、下記の2か所に関数を埋め込むだけですので、簡単です。
(B1) =CC(CAL_[年],"年",CAL_[月],"月")
(B2) =CAL(CAL_[年],CAL_[月],CAL_[済],CAL_[U])

image.png

関数CALは、配列を初期化する QL_INIT()と、日付がマッチしたデータを編集して返すCALD()を呼んでいます。
日付がマッチするデータ位置の配列を返す関数 COMP_()と、
それから得られた抽出条件からデータを絞り込む関数FILTER_()を使用しています。

Function CAL(, , C, U, Optional S = "")
    Dim I, J
    
    S = QL_INIT(12, "日,月,火,水,木,金,土")
    
    S(1, 1) = DateSerial(, , 1) - Weekday(DateSerial(, , 1)) + 1
    
    For I = 3 To 11 Step 2
        S(I, 1) = S(I - 2, 1) + 7
    Next I
    For I = 1 To 11 Step 2
        For J = 2 To 7
            S(I, J) = S(I, J - 1) + 1
        Next J
    Next I
    For I = 2 To 12 Step 2
        For J = 1 To 7
            S(I, J) = CALD(S(I - 1, J), C)
        Next J
    Next I

    CAL = 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 = QL_INIT(M.Rows.Count, N, L1, L2)

    ElseIf TV_(M) Then
        S = QL_INIT(UBound(M, 1), N, L1, L2)

    ElseIf TS_(M, N) Then
        L = Split(M, " "): M = UBound(L) - LBound(L) + 1
        T = Split(N, ","): N = UBound(T) - LBound(T) + 1
        S = QL_INIT(M, N, 0, 1)
        For I = 1 To M: S(I, 1) = L(I - 1): Next I
        For J = 1 To N: S(0, J) = T(J - 1): Next J

    ElseIf TS_(N) Then
        T = Split(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
        
    ElseIf TS_(L1) Then
        T = Split(L1, ",")
        N = UBound(T, 1) + 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

Function CALD(D, Optional C = "*", Optional M01 = "", Optional M02 = "", Optional S = "")
    On Error Resume Next
    
    抽出条件 = COMP_("M01N_[日付]", D)
    
    If WorksheetFunction.Sum(抽出条件) > 0 Then

        M01A = FILTER_("M01N_[製品名]", 抽出条件)
        M01B = FILTER_("M01N_[[出庫]:[済]]", 抽出条件)
        M01W = FILTER_("M01N_[W]", 抽出条件)
    
        For I = 1 To UBound(M01A, 1)
            Call DR(M01A, I, 製品名)
            Call DR(M01B, I, 出庫, )
            Call DR(M01W, I, W)
         
            WS = IFC(InStr(製品名, "共通") = 0, 17, 15)
         
            If W > 0 Then 製品名 = CC(製品名, "(W", TF(W, "#00"), ")")
            S = CC(S, Left(CC(製品名, SP(WS)), WS), " ", TF(出庫, "###0"), "本", IFC( = 1, C, ""), vbNewLine)
        Next I
    End If
    
    抽出条件 = COMP_("M02N_[日付]", D)

    If WorksheetFunction.Sum(抽出条件) > 0 Then
        
        M01A = FILTER_("M02N_[製品名]", 抽出条件)
        M01B = FILTER_("M02N_[[出庫]:[済]]", 抽出条件)
    
        For I = 1 To UBound(M01A, 1)
            Call DR(M01A, I, 製品名)
            Call DR(M01B, I, 出庫, )
                     
            S = CC(S, Left(CC(製品名, SP(15)), 15), " ", TF(出庫, "###0"), "個", IFC( = 1, C, ""), vbNewLine)
        Next I
    End If
    CALD = S
End Function

Function COMP_(R, D, Optional S = "") ' COMPARE
    On Error Resume Next
    If TS_(R) Then Set R = Range(R)

    S = R
    
    Dim I: For I = 1 To UBound(S, 1)
        If S(I, 1) = D Then S(I, 1) = 1 Else S(I, 1) = 0
    Next I
    
    COMP_ = S
End Function

Function FILTER_(R, F)
    If TS_(R) Then Set R = Range(R)
    
    FILTER_ = WorksheetFunction.Filter(R, F, "")
End Function

関数CAL()の引数に、CAL_[U]が入っていますが、シートに下記の関数を定義して、アクティブになったら再計算させています。

Private Sub Worksheet_Activate()
    U = Range("CAL_[U]")
    
    Range("CAL_[U]") = (U + 1) Mod 2
End Sub
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?