VBA(ガントチャート作成)

-- 設定値
シート名(E11)
開始行(E12)
終了行(E13)
開始時刻列(E14)
終了時刻列(E15)
チャート開始列(E16)
チャート終了列(E17)
チャート開始列時刻(E18)
1セルの時間(分)(E19)
着色する色(E20)


-- ロジック(時間間隔60分の場合)

開始時刻がX時以上X+1時未満ならX時のセルを開始セルとする
終了時刻がX時より大きくX+1時以下ならX時のセルを終了セルとする
開始セルと終了セルに挟まれたすべてのセルも着色する

 

-- 1. 開発タブの挿入でボタンを作成
ActiveXコントロールのものを使用する

-- 2. デザインモードONで作成したボタンをダブルクリックするとエディタが開くので下記コードを記載。デザインモードOFFで実行

Option Explicit

 

Private Sub CommandButton1_Click()


    '画面を更新しない
    Application.ScreenUpdating = False
    '確認メッセージを表示しない
    Application.DisplayAlerts = False
    

    
    Dim objFSO As Object
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    Dim strFolderPath As String
    strFolderPath = ThisWorkbook.Path & "\test"
    
    'testフォルダがない場合、作成
    If Dir(strFolderPath, vbDirectory) = "" Then
        MkDir strFolderPath
    End If
    
    
    'testファイルがある場合、削除
    If Dir(strFolderPath & "\test.xlsx") <> "" Then
         Kill strFolderPath & "\test.xlsx"
    End If
       
    '■テストファイル作成
    Call createFile(strFolderPath & "\test.xlsx")


    ChDir strFolderPath
    
    '■ファイル選択
    Dim file_mei As Variant
    file_mei = Application.GetOpenFilename( _
                            FileFilter:="Excelファイル, *.xls;*.xlsx", _
                            Title:="ファイルを選択してください", _
                            MultiSelect:=False)
                            
    If VarType(file_mei) = vbBoolean Then
        GoTo EE
    End If
    
    Debug.Print "file_mei", file_mei

    
    '■設定値の取得
    
    Dim i_sheet_mei As String
    Dim i_s_row As Long
    Dim i_e_row As Long
    Dim i_s_timecol As String
    Dim i_e_timecol As String
    
    Dim i_cha_s_col As String
    Dim i_cha_e_col As String
    
    Dim i_cha_s_time As String
    Dim i_interval As Long
    Dim i_color As Long
    
    
    'シート名 (E11) ガントチャート
    i_sheet_mei = Trim(Range("E11").Value)
    
    '開始行 (E12) 3
    i_s_row = Trim(Range("E12").Value)
    
    '終了行 (E13) 7
    i_e_row = Trim(Range("E13").Value)
    
    '開始時刻列 (E14) C
    i_s_timecol = Trim(Range("E14").Value)
    
    '終了時刻列 (E15) D
    i_e_timecol = Trim(Range("E15").Value)
    
    'チャート開始列 (E16) F
    i_cha_s_col = Trim(Range("E16").Value)
    
    'チャート終了列 (E17) L
    i_cha_e_col = Trim(Range("E17").Value)
    
    'チャート開始列時刻 (E18) 9:00
    i_cha_s_time = Trim(Range("E18").Value)
    
    '1セルの時間(分)(E19) 60
    i_interval = Trim(Range("E19").Value)
    
    '着色する色 (E20)
    i_color = Trim(Range("E20").Interior.Color)
    
    
    Debug.Print "i_color", i_color
    
    
    '■選択したファイルの処理対象シートを開く
    
    Dim wb As Workbook
    Dim sheet As Variant
    Dim sh As Worksheet
    
    Set wb = Workbooks.Open(file_mei)
    
    For Each sheet In wb.Worksheets
        If Trim(sheet.Name) = i_sheet_mei Then
            Set sh = sheet
            Exit For
        End If
        
    Next sheet
    
    If sh Is Nothing Then
        wb.Close
        MsgBox "シートが存在しません"
        
        GoTo EE
    End If
    
    
    '■チャート範囲の色クリア
    
    sh.Range(i_cha_s_col & i_s_row & ":" & i_cha_e_col & i_s_row).Interior.ColorIndex = 0


    '■開始時刻列,終了時刻列,チャート開始列,チャート終了列を文字→数値に変換する
    
    
    Dim s_timecol As Long
    Dim e_timecol As Long
    
    Dim cha_s_col As Long
    Dim cha_e_col As Long
    
    s_timecol = Columns(i_s_timecol).Column
    e_timecol = Columns(i_e_timecol).Column
    
    cha_s_col = Columns(i_cha_s_col).Column
    cha_e_col = Columns(i_cha_e_col).Column
    
    Debug.Print "s_timecol, e_timecol, cha_s_col, cha_e_col", s_timecol, e_timecol, cha_s_col, cha_e_col

    
    Dim i As Long
    Dim j As Long
    Dim k As Long
    
    '■ガントチャート作成
    For i = i_s_row To i_e_row
    
    
        '着色開始セル列番号
        Dim color_s_col As Long
        '着色終了セル列番号
        Dim color_e_col As Long
        
        '開始時刻、終了時刻の値
        Dim s_time As String
        Dim e_time As String
    
        color_s_col = 0
        color_e_col = 0
        
        s_time = sh.Cells(i, s_timecol).Value
        e_time = sh.Cells(i, e_timecol).Value
        
        Debug.Print "s_time, e_time", s_time, e_time
        
        
        
        For j = cha_s_col To cha_e_col
            
            ''開始時刻がX時以上X+1時未満ならX時のセルを開始セルとする
            ''終了時刻がX時より大きくX+1時以下ならX時のセルを終了セルとする
            ''開始セルと終了セルに挟まれたすべてのセルも着色する
            
            'セル時刻(対象セル)
            Dim c1_time As String
            c1_time = i_cha_s_time + i_interval / 24 / 60 * (j - cha_s_col)
            
            'セル時刻(対象セルの次のセル)
            Dim c2_time As String
            c2_time = i_cha_s_time + i_interval / 24 / 60 * (j - cha_s_col + 1)
            
            
            Debug.Print "j, c1_time, c2_time", j, c1_time, c2_time
            
            If s_time >= c1_time And s_time < c2_time Then
                color_s_col = j
            End If
            If e_time > c1_time And e_time <= c2_time Then
                color_e_col = j
            End If
            
        
        Next j
        
        If color_s_col <> 0 Or color_e_col <> 0 Then
            '開始セルのみの場合、終了セルはチャート範囲の終了列番号とする
            If color_e_col = 0 Then
                color_e_col = cha_e_col
            End If
            
            '終了セルのみの場合、開始セルはチャート範囲の開始列番号とする
            If color_s_col = 0 Then
                color_s_col = cha_s_col
            End If
            
            '着色実行
            For k = color_s_col To color_e_col
                sh.Cells(i, k).Interior.Color = i_color
            Next k
        End If
    
    Next i

    'ワークブック保存
    wb.Save
    wb.Close

 

    MsgBox "処理完了"

EE:

    
    
    '確認メッセージを表示する
    Application.DisplayAlerts = True
    '画面を更新する
    Application.ScreenUpdating = True
    

End Sub


'テストファイル作成関数
Private Sub createFile(filepath As String)
    'ワークブック作成
    Dim wb As Workbook
    Set wb = Workbooks.Add
    
    
    'シート追加
    Dim sh As Worksheet
    
    Set sh = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    
    'シート名変更
    Worksheets(Worksheets.Count).Name = "ガントチャート"
   
        
    'セル書き込み
    
    With Worksheets(Worksheets.Count)
    
        .Range("B2").Value = "項番"
        .Range("C2").Value = "開始時刻"
        .Range("D2").Value = "終了時刻"
        
        .Range("F2").Value = "9:00"
        .Range("G2").Value = "10:00"
        .Range("H2").Value = "11:00"
        .Range("I2").Value = "12:00"
        .Range("J2").Value = "13:00"
        .Range("K2").Value = "14:00"
        .Range("L2").Value = "15:00"
        
        .Range("B3").Value = "1"
        .Range("C3").Value = "9:00"
        .Range("D3").Value = "9:10"
        
        .Range("B4").Value = "2"
        .Range("C4").Value = "9:10"
        .Range("D4").Value = "11:00"
        
        .Range("B5").Value = "3"
        .Range("C5").Value = "11:00"
        .Range("D5").Value = "12:05"
        
        .Range("B6").Value = "4"
        .Range("C6").Value = "12:05"
        .Range("D6").Value = "12:55"
        
        .Range("B7").Value = "5"
        .Range("C7").Value = "12:55"
        .Range("D7").Value = "15:00"
        

    End With
    

    'ワークブックを保存して閉じる
    wb.Close True, filepath
    
 
    ThisWorkbook.Activate
 
End Sub