ゲームエフェクトデザイナーのブログ (新)

レポート記事とかUE4のマテリアルとか。C#とかも触ったり。

エクセルガントチャートで日付バーを動かす

エクセルでガントチャートを作る際に列を日単位にすると列数の制限に引っかかってしまうため、週単位にすることが多いのですが、ブックを開いたら今日を表すバーの位置を移動させたくでマクロを組んでみました。

こんなイメージです。
f:id:moko_03_25:20200711201256p:plain

ただし1つの列は平日5日分としてバーの移動量を計算させておき、土日は直前の金曜の位置でバーが止まって欲しいと思いました。
その際に下図のような表を作って脳内整理すると「あ、簡単にできそう!」と気付けて、ModとCase文だけのシンプルな処理で無事にやりたいことができました。

f:id:moko_03_25:20200711201312p:plain

変数も多くて冗長ですが‥備忘録として記載しておきたいと思います。

Private Sub Workbook_Open()
'エクセルと開くと自動で実行する関数

 Dim Col As Integer '列番号
 Dim StartDay As Long '開始日
 Dim ToDay As Long '本日の日付
 Dim CountDay As Long '経過日数
 Dim CountWeek As Long '経過した週
 Dim ColWidth As Double '列の幅
 Dim MoveStep As Double '列内での移動ステップ数
 Dim MoveWeek As Double '現在の週までの移動量
 Dim MoveValue As Double '総移動量

 '今日の日付を取得
 ToDay = CDbl(Date)
 '開始日
 StartDay = 44011
 '経過日数
 CountDay = ToDay - StartDay
 '経過した週
 CountWeek = Fix(CountDay / 7)
 '列の幅
 ColWidth = 93.75

 '現在の週の列までの移動量を求める
 MoveWeek = ColWidth * CountWeek

 '列内での移動ステップ数を求める
 MoveStep = CountDay Mod 7
 Select Case MoveStep
 Case Is = 5
  MoveStep = 4
 Case Is = 6
  MoveStep = 4
 End Select

 '総移動値を求める
 MoveValue = MoveWeek + ((ColWidth / 5) * MoveStep)

 With ActiveSheet.Shapes("日付バー")
  .Top = Cells(4, 3).Top
  .Left = Cells(4, 3).Left + MoveValue + (ColWidth / 10)
 End With '線を移動

End Sub