LoginSignup
1
3

More than 5 years have passed since last update.

Excelでカレンダーを作ってみる

Last updated at Posted at 2018-05-30

出荷一覧をカレンダーに表示

【Excel】Excel でカレンダーを作ってみるを見たからではないのですが、
実は、カレンダーに年月指定で、出荷状況を表示する機能を作っていました。
最初のは余りにも力技で、そのままのコードは汚いので、少し見易く整理をしました。

カレンダー本体は、テーブル

カレンダー本体(名前はSKCAL_)とコントロールテーブル(名前はCAL_)はテーブルで作成します。

CAL.png

関数を2つに分けました

無理やり1つの関数にまとめると雑になりすぎるので、日付部分と出荷状況表示の2つに分けました。
CALAは、年月からカレンダー日付のシリアル値を求める関数です。
日付計算が何故IF文なのかですが、IFC で纏めると循環していると判断されるようです。
年月で発火すればいいので、参照先のテーブルは、文字列で定義しても問題ないようです。
DateSerialの結果を変数で受けるのは面倒なので、2回計算しています。

Function CALA(, , Optional T = "SKCAL_", Optional S = 0)
    Dim R: Set R = Range(T)
    Dim M: M = MM(R)
    Dim N: N = NN(R)

    If M = 1 And N = 1 Then
        S = DateSerial(, , 1) - Weekday(DateSerial(, , 1)) + 1
    Else
        S = DI(R, 1, 1) + 7 * Int(M / 2) + N - 1
    End If
    CALA = S
End Function

CALBは、出荷一覧(名前はSK_)から日付をキーにデータを持ってきて編集し表示します。
CALAで計算した日付シリアルを引数Dで受けて発火してくれるので、出荷一覧テーブルは文字列指定で問題ないようです。
調子にのって引数全部をOPTIONALにすると、再計算してくれなくなるようです。

Function CALB(D, C, Optional S = "")
    Dim , , 番号, W, O, 製品名, 発注, 依頼, 日付, 出庫, , 在庫, I, J, K
    J = MI(Range("SK_[日付]"), D)
    K = Range("SK_").Rows.Count

    For I = 1 To K
        If J = "" Then Exit For

        Call DR(Range("SK_"), J + I - 1, , , 番号, W, O, 製品名, 発注, 依頼, 日付, 出庫, , 在庫)

        If 日付 <> D Then Exit For

        If W > 0 Then 製品名 = CC(製品名, "(W", TF(W, "000"), ")")
        S = CC(S, Left(CC(製品名, SP(15)), 17), " ", TF(出庫, "###0"), IFC( = 1, "本", "個") _
                                                                     , IFC( = 0, "", C), vbNewLine)
    Next I
    CALB = S
End Function

Sub DR(R, I, ParamArray PA())               ' DATA READ
    Dim J: For J = 0 To UBound(PA)
        PA(J) = DI(R, I, J + 1)
    Next J
End Sub

使用法

1行1列(B3): =CALA(CAL_[年],CAL_[月])
2行1列(B4): =CALB(B3,CAL_[済])

と定義し、B3,B4を纏めてCOPYし、関数で全体にPASTEして下さい。

以上

1
3
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
1
3