[[20200322112452]] 『ガントチャートに時刻を追加』(テセウスの船) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ガントチャートに時刻を追加』(テセウスの船)

 ネットで見つけたのですがオートシェイプを使ってガントチャートを描画するマクロです。
開始日や日数を入力すると、色付きの四角形を自動的に表示します。
時刻を持たせて双方向の矢印を四角形上に表示出来たら最高なのですが・・・
教えていただきたい。宜しくお願いします。

' 「開始日」(3,4) セルD3

  ' 「DayStart」(4,10) セルJ4
  ' バーの開始セル  (6,10) セルJ6
  ' バーの書式参照先 B列 (0,2)

  'Public Const StartClm As Integer = 10   ' old「DayStart」(4,10) セルJ4
  'Public Const StartDayClm As Integer = 4 ' old
  'Public Const StartRow As Integer = 6

  Public StartClm As Integer     ' 「DayStart」(4,10) セルJ4
  Public StartDayClm As Integer
  Public StartRow As Integer

  Public Const DateDifClm As Integer = 5
  Public Const ColorClm As Integer = 2

  Public lngShapeStyle As Long  ' 図形スタイル
  Public lngLineColor As Long   ' 図形の枠線の色
  Public lngLineWeight As Long  ' 図形の枠線の太さ

  Public strItem As String      ' 項目名の表示

Sub 一括作成1()

  ' 初期設定
   With ActiveSheet
      StartClm = .Range("DayStart").Column   ' 10  old「DayStart」(4,10) セルJ4
      StartDayClm = 4 ' 4
      StartRow = .Range("DayStart").Row + 2 ' 6
   End With
   ' n日の場合のみ
   Dim lngIntervalDays As Long         ' 間隔がある場合の間隔日数

   Dim lngStartRow As Long
   Dim lngRowsCnt As Long
   Dim i As Long

   lngStartRow = ActiveSheet.ListObjects(1).HeaderRowRange.Row
   lngRowsCnt = ActiveSheet.ListObjects(1).DataBodyRange.Rows.Count

   Application.ScreenUpdating = False
   For i = lngStartRow + 1 To lngStartRow + lngRowsCnt

      Call 行図形クリア(i)

      Call 図形(i, 1)

   Next i
   Application.ScreenUpdating = True

End Sub

Sub 一括作成n()

  ' 初期設定
   With ActiveSheet
      StartClm = .Range("DayStart").Column   ' 10  old「DayStart」(4,10) セルJ4
      StartDayClm = 4 ' 4
      StartRow = .Range("DayStart").Row + 2 ' 6
   End With
   ' n日の場合のみ
   Dim lngIntervalDays As Long         ' 間隔がある場合の間隔日数
   lngIntervalDays = ActiveSheet.Range("間隔日数").Value

   Dim lngStartRow As Long
   Dim lngRowsCnt As Long
   Dim i As Long

   lngStartRow = ActiveSheet.ListObjects(1).HeaderRowRange.Row
   lngRowsCnt = ActiveSheet.ListObjects(1).DataBodyRange.Rows.Count

   Application.ScreenUpdating = False
   For i = lngStartRow + 1 To lngStartRow + lngRowsCnt

      Call 行図形クリア(i)

      Call 図形(i, lngIntervalDays)

   Next i
   Application.ScreenUpdating = True

End Sub

Sub 罫線1()

   Application.ScreenUpdating = False
   Call 罫線描画(1)
   Application.ScreenUpdating = True

End Sub

Sub 罫線n()

   ' n日の場合のみ
   Dim lngIntervalDays As Long         ' 間隔がある場合の間隔日数
   lngIntervalDays = ActiveSheet.Range("間隔日数").Value

   Application.ScreenUpdating = False
   Call 罫線描画(lngIntervalDays)
   Application.ScreenUpdating = True

End Sub

Sub クリア()

  'オートシェイプのみクリア
   Dim objShp As Shape

   Application.ScreenUpdating = False
    For Each objShp In ActiveSheet.Shapes
      If objShp.Type = msoAutoShape _
        Or objShp.Type = msoTextBox Then
        objShp.Delete
      End If
    Next objShp
 'Or objShp.Type = msoPicture
  Application.ScreenUpdating = True

End Sub

Sub Tbl2_Clear()

   'テーブルの2行目以降のデータをクリアする
   'テーブル内を選択して[Ctrl]+[t]
   Dim rngSelect As Range  '選択している範囲
   Dim strTlb As String    '選択しているテーブル名

   'エラーチェック---------------------------------------------------------
   If TypeName(Selection) = "Range" Then
      Set rngSelect = Selection
   Else
      MsgBox "テーブル内にあるセルを選択して、再実行してください。"
      Exit Sub
   End If
   Application.ScreenUpdating = False
   On Error GoTo errorPrc
      strTlb = rngSelect.ListObject.Name ' セル番地からテーブル名を取得する

   'テーブルの2行目以降をクリア--------------------------------------------
   With ActiveSheet.ListObjects(strTlb)
      If .ListRows.Count > 1 Then
              .DataBodyRange.Offset(1, 0).Resize(.ListRows.Count - 1, .ListColumns.Count).Clear '2行目以降をクリア
              .Resize Range:=.HeaderRowRange.Resize(2, .ListColumns.Count)  'データ1行
      End If
   End With

   Set rngSelect = Nothing
   Exit Sub
    'テーブル名を取得できない場合のエラー処理-----------------------------
errorPrc:
   MsgBox "テーブル内にあるセルを選択して、再実行してください。"
   Application.ScreenUpdating = True

End Sub
Sub 行図形クリア(lngRow As Long)

  With ActiveSheet
    'クリア------四角形 1 のみをクリアする
    On Error Resume Next
    If .Shapes(CStr(lngRow)).AutoShapeType = 1 Then .Shapes(CStr(lngRow)).Delete
    If .Shapes(CStr(lngRow) & "始点").AutoShapeType = 1 Then .Shapes(CStr(lngRow) & "始点").Delete
    If .Shapes(CStr(lngRow) & "終点").AutoShapeType = 1 Then .Shapes(CStr(lngRow) & "終点").Delete
    On Error GoTo 0
  End With

End Sub

Sub 図形(lngRow As Long, lngIntervalDays As Long)

  Dim StartDay As Long
  Dim lngDateDif As Long
  Dim intClm As Integer
  Dim Square As Shape
  Dim SqrLeft As Long, SqrTop As Long
  Dim SqrWidth As Long, SqrHeight As Long
  Dim lngFontClr As Long                  ' フォントの色
  Dim strItemNave As String
  Dim strBar As String ' バー内の表示文字列

  strItem = Worksheets("環境設定").Range("項目名").Value

  With ActiveSheet

    ' 開始日のデータ型エラー処理
    If Not IsDate(Range("開始日").Value) Then
      MsgBox Prompt:="開始日が日付ではありません。", _
                    Buttons:=vbCritical, _
                    Title:="開始日エラー"
      End
    End If

    StartDay = CLng(.Cells(lngRow, StartDayClm).Value) - CLng(Range("開始日").Value)

    ' 開始日の日付エラー処理
    If StartDay < 0 Then
      MsgBox Prompt:="チャートの開始日より前の日付になっています。", _
                    Buttons:=vbCritical, _
                    Title:="開始日エラー"
      End

    '※ n日のみ
    ElseIf lngIntervalDays > 1 And StartDay > Range("期間") * lngIntervalDays Then
      MsgBox Prompt:="チャートの最終日より後の日付になっています。", _
                    Buttons:=vbCritical, _
                    Title:="開始日エラー"
      End
    End If

     ' バー内の表示の設定      なし,バー内側-左,バー内側-右,終了日-右
   lngDateDif = .Cells(lngRow, DateDifClm).Value
   strItemNave = .Cells(lngRow, DateDifClm - 2).Value
   Select Case strItem
         Case "なし", "終了日-右"
            strBar = lngDateDif
         Case "バー内側-左"
            strBar = strItemNave & " " & lngDateDif
         Case "バー内側-右"
            strBar = lngDateDif & " " & strItemNave
         Case Else
            MsgBox "項目名の表示の設定がされていません。"
   End Select

    '四角形の表示-----------------
    '※ n日のみ
    'MsgBox StartDay & " " & StartClm '※ n日のみ
    If lngIntervalDays > 1 Then
      StartDay = Int(StartDay / lngIntervalDays) '※ n日のみ
    End If

    With .Cells(lngRow, StartDay + StartClm)

      SqrLeft = .Left + 0.5
      SqrTop = .Top + 3
      SqrHeight = .Height - 6

    End With

    With .Range(.Cells(lngRow, StartDay + StartClm) _
        , .Cells(lngRow, StartDay + StartClm + lngDateDif - 1))
     SqrWidth = .Width - 1

    End With

    Set Square = .Shapes.AddShape _
        (msoShapeRectangle, SqrLeft, SqrTop, SqrWidth, SqrHeight)
     '図形の名前の設定
      Square.Name = lngRow
     '図形の色の設定
      Square.Fill.ForeColor.RGB = .Cells(lngRow, ColorClm).Interior.Color

     '図形の文字の設定
     lngFontClr = .Cells(lngRow, ColorClm).Font.Color
      With Square.TextFrame
        .Characters.Text = strBar
        .Characters.Font.Color = lngFontClr
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
      End With

      ' バーの枠線の色などの設定
      If lngShapeStyle <> 0 Then
         Square.ShapeStyle = lngShapeStyle
      Else
         Square.Line.ForeColor.RGB = lngLineColor
         Square.Line.Weight = lngLineWeight / 100
      End If

  Set Square = Nothing

  '始点テキストボックスの表示-----------------
    With .Cells(lngRow, StartDay + StartClm - 3)

      SqrLeft = .Left + 1
      SqrTop = .Top + 3.5
      SqrHeight = .Height - 6

    End With

    With .Range(.Cells(lngRow, StartDay + StartClm - 3) _
        , .Cells(lngRow, StartDay + StartClm - 1))
     SqrWidth = .Width - 3

    End With

    Set Square = .Shapes.AddTextbox _
        (msoTextOrientationHorizontal, SqrLeft, SqrTop, SqrWidth, SqrHeight)
     '図形の名前の設定
      Square.Name = lngRow & "始点"
      Square.Line.Visible = msoFalse
      With Square.TextFrame
        .Characters.Text _
          = Format(ActiveSheet.Cells(lngRow, StartDayClm), "m/d")
        .Characters.Font.Size = 10
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter

      End With

   Set Square = Nothing

   '終点テキストボックスの表示-----------------
    With .Cells(lngRow, StartDay + StartClm + lngDateDif + 0)

      SqrLeft = .Left + 1
      SqrTop = .Top + 3.5
      SqrHeight = .Height - 6

    End With

    With .Range(.Cells(lngRow, StartDay + StartClm + lngDateDif + 0) _
        , .Cells(lngRow, StartDay + StartClm + lngDateDif + 2))
         If strItem = "終了日-右" Then
            SqrWidth = .Width + Len(strItemNave) * 8
         Else
            SqrWidth = .Width - 3
         End If

    End With

    Set Square = .Shapes.AddTextbox _
        (msoTextOrientationHorizontal, SqrLeft, SqrTop, SqrWidth, SqrHeight)
     '図形の名前の設定
      Square.Name = lngRow & "終点"
      Square.Line.Visible = msoFalse
      With Square.TextFrame
        If strItem = "終了日-右" Then
            .Characters.Text _
               = Format(ActiveSheet.Cells(lngRow, StartDayClm + 2), "m/d") & " " & strItemNave
        Else
            .Characters.Text _
               = Format(ActiveSheet.Cells(lngRow, StartDayClm + 2), "m/d")
        End If
        .Characters.Font.Size = 10
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlCenter

      End With

   Set Square = Nothing

  End With

End Sub
Sub 罫線描画(lngIntervalDays As Long)

   ' 罫線を引く

  ' 初期設定
   With ActiveSheet
      StartClm = .Range("DayStart").Column   ' 10  old「DayStart」(4,10) セルJ4
      StartDayClm = 4 ' 4
      StartRow = .Range("DayStart").Row + 2 ' 6
   End With

   Dim lngRowsCnt As Long

   lngRowsCnt = ActiveSheet.ListObjects(1).DataBodyRange.Rows.Count

     ' 罫線を引く

      If IsDate(Range("開始日")) And Range("期間").Value >= 1 Then

         Call 日付クリア
         Call 日付(lngIntervalDays)

        '※ 月の罫線 ver2.04
         If Range("月表示") = "表示する" Then
            Call 罫線(Range(Range("DayStart").Offset(-1, 0), Range("DayStart").End(xlToRight).Offset(0, 0)))
         End If

        '日付の罫線 ver2  余分な領域に線を引かないように、currentregionからの変更した
        Call 罫線(Range(Range("DayStart"), Range("DayStart").End(xlToRight).Offset(1, 0)))

         'G列の罫線
        Call 罫線(Range(Range("DayStart").Offset(1, -3) _
          , Cells(StartRow + lngRowsCnt - 1, StartClm - 1)))

         'バーをプロットする範囲の罫線
        Call 罫線(Range(Cells(StartRow, StartClm) _
          , Cells(StartRow + lngRowsCnt - 1, StartClm + Range("期間").Value - 1)))

            '※ ver2 「-1」 ver1  「-6」は非表示の行 6〜10 の分だけ引く
      End If

End Sub
Sub 日付クリア()

  With ActiveSheet.UsedRange
    Range(Range("DayStart").Offset(-1, -3), .Cells(.Count)).Clear
  End With

End Sub

Sub 日付(lngInterval As Long)

  Dim lngDayCnt As Long
  Dim i As Long
  Dim lngColumnCnt As Long
  Dim strYoubi As String
  Dim intMonth As Integer
  lngDayCnt = Range("期間").Value - 1

  lngColumnCnt = 0
  intMonth = Month(Range("開始日").Value)

  For i = 0 To lngDayCnt * lngInterval Step lngInterval

    If Range("月表示") = "表示する" And _
         (intMonth <> Month(Range("開始日").Value + i) Or i = 0) Then
      Range("DayStart").Offset(-1, lngColumnCnt).Value _
      = Month(Range("開始日").Value + i)
      intMonth = Month(Range("開始日").Value + i)
    End If

    Range("DayStart").Offset(0, lngColumnCnt).Value _
      = Day(Range("開始日").Value + i)

    strYoubi = WeekdayName(Weekday(Range("開始日").Value + i), True)
    'strYoubi = Format(Range("開始日").Value + i, "aaa")

    Range("DayStart").Offset(1, lngColumnCnt).Value _
      = strYoubi
    Select Case strYoubi
      Case "土"
         Call 土日表示(Range("DayStart").Offset(0, lngColumnCnt).Cells(1.1), 5)
      Case "日"
         Call 土日表示(Range("DayStart").Offset(0, lngColumnCnt).Cells(1.1), 3)
    End Select

      lngColumnCnt = lngColumnCnt + 1

  Next i

  With Range(Range("DayStart").Offset(-1, 0), Range("DayStart").Offset(1, lngDayCnt))
    With .Font
      .Size = 10
        .Name = "Arial"
   End With
   .ShrinkToFit = True
   .HorizontalAlignment = xlCenter
   .VerticalAlignment = xlCenter
  End With

End Sub

Sub 土日表示(upCell As Range, lngColor As Long)

  With upCell.Resize(2, 1)

    .Font.ColorIndex = lngColor

  End With

End Sub

Sub 罫線(BordRng As Range)

    With BordRng

      With .Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .Weight = xlHairline
        .ColorIndex = 1
      End With

      With .Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = 1        '.ColorIndex = 4
      End With

      .BorderAround LineStyle:=xlContinuous, Weight:=xlThin, ColorIndex:=1
              ', ColorIndex:=9

    End With

End Sub

Sub セル高変更(StartRow As Integer, intRowCnt As Integer, lngHeight As Long)

  With ActiveSheet

      .Rows(StartRow + intRowCnt).RowHeight = lngHeight

  End With

End Sub

Sub セル幅変更(StartClm As Integer, intClmCnt As Integer, lngWidth As Long)

  With ActiveSheet

      .Columns(StartClm + intClmCnt).ColumnWidth = _
        lngWidth / .Columns(StartClm + intClmCnt).Width _
          * .Columns(StartClm + intClmCnt).ColumnWidth

  End With

End Sub

< 使用 Excel:Excel2013、使用 OS:Windows8 >


>ネットで見つけた
そのURLを示してもらえますか?
 
作者との関係においてもそのほうが適切だと思いますし、
そこにはなんらかの仕様の説明が(たぶんレイアウト等も)あるはずで、
回答者や閲覧者にとって有益な情報があると思います。
そのほうがコメントも付きやすいと思います。
(γ) 2020/03/22(日) 13:18

http://excelcharts.biz/?post_type=news&order&orderby
宜しくお願いします。
(テセウスの船) 2020/03/22(日) 17:00

ありがとうございました。
拝見して内容の概要がよく分かりましたが、
入出力がすべて日にちベースのものであって、
時刻ベースのものにするなら、入出力すべてにわたっての
抜本的な修正が必要になる、新規作成に近いものになると思います。
少なくとも私の手には負えませんし、
こうした場でリクエストして、ハイと提示するようなものではないと
いう印象です。
ところで、作者の方のサイトに問い合わせコーナーがあるようですので、
相談してみてはいかがでしょうか。
(γ) 2020/03/22(日) 18:10

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.