tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
MSFlexGridで工程表(ガントチャート)を表示(VB6.0) ( No.0 )  [親スレッドへ]
日時: 2008/08/05 09:14
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[チャート][グリッド関係][描画・画像]                                *
* キーワード:工程表,ガントチャート,進捗管理,スケジュール表示,                    *
***********************************************************************************
タイトル : ガントチャートをVB6で作りたい
記事No : 12662
投稿日 : 2008/07/01(Tue) 22:34
投稿者 : カズ  

今回仕事で、VB6でガントチャートを独自で作るようになったのですがなかなかうまく
できません。インターネットでもあまり載ってないのでかなり困っています。
VB6での作り方があるのでしたらお教え願えないでしょうか・・・

-----------------------------------------------------------------------------------
記事No : 12665
投稿日 : 2008/07/02(Wed) 09:23
回答者 : 花ちゃん  
-----------------------------------------------------------------------------------
最近同じような質問が結構多いのでサンプルを作り直しました。
但し、汎用ではないし、叩き台的なものなので、後はご自分で工夫して下さい。
ここのサンプルの セルに直接データーを入力する(エクセルのように)No.34 と
組み合わせれば、直接データを編集する事も簡単にできます。

MSHFlexGrid コントロールの詳しい使い方は下記をどうぞ。
http://hanatyan.sakura.ne.jp/vbhlp/MSFlexind.htm


Option Explicit

Private Sub Form_Load()
   Dim i   As Long
   Dim j   As Long
   '仮データの作成部分(CSVファイル 等を使っても OK )
   Dim KDat(3, 2) As String
   KDat(0, 0) = "タイトル": KDat(0, 1) = "開始日時": KDat(0, 2) = "終了日時"
   KDat(1, 0) = "工 程 1": KDat(1, 1) = "2008/08/01 08:00": KDat(1, 2) = "2008/08/02 8:00"
   KDat(2, 0) = "工 程 2": KDat(2, 1) = "2008/08/01 18:00": KDat(2, 2) = "2008/08/03 00:00"
   KDat(3, 0) = "工 程 3": KDat(3, 1) = "2008/08/02 04:00": KDat(3, 2) = "2008/08/04 12:00"
  
   Form1.Move 0, 0, 10400, 4000
   With MSFlexGrid1
      'MSFlexGrid の初期設定
      .Font.Name = "MS ゴシック"
      .Font.Size = 9
      .FocusRect = flexFocusNone          'フォーカスを示す四角形を描かない
      .HighLight = flexHighlightAlways    '選択されたセルを常に強調表示
      .Move 150, 150, 10000, 3000         '表示位置と大きさを設定
      .FixedRows = 1                      '固定行の数 Rowsより1以上少ない事
      .Cols = 34                          '列数の設定(31日分)
      .Rows = 10                          '行数の設定(必要分)
      .FixedCols = 0
      .RowHeightMin = 400                 '行の高さを設定
      .ColWidth(0) = 1000                 '列幅を設定
      .ColWidth(1) = 1700                 '列幅を設定
      .ColWidth(2) = 1700                 '列幅を設定
      For i = 0 To .Cols - 1
         .Col = i: .Row = 0
         .CellAlignment = flexAlignCenterCenter    '表示位置を中央揃えに設定
         If i > 2 Then
            .ColWidth(i) = 2250           '半角で24文字分
            '日付の表示
            .TextMatrix(0, i) = "8月" & CStr(i - 2) & "日"
         End If
      Next i
      '初期のカーソル位置
      .Col = 0: .Row = 1
      'データ部分の表示(CSVファイルから読み込んでも OK )
      For i = 0 To 3
         For j = 0 To 2
            If j = 0 Then
               .TextMatrix(i, j) = KDat(i, j)   'データの表示
            Else
               .TextMatrix(i, j) = CStr(Format$(KDat(i, j), "yyyy/mm/dd hh:nn"))
            End If
         Next j
      Next i
   End With
  
   'グラフ部分の表示
   Call SetData
End Sub

Private Sub SetData()
   Dim i     As Long
   Dim j     As Long
   Dim SD    As Integer    '開始日
   Dim ED    As Integer    '終了日
   Dim ST    As Integer    '開始時間
   Dim ET    As Integer    '終了時間
   Dim s1    As String     '開始日分のグラフのデータ
   Dim s2    As String     '期間日分のグラフのデータ
   Dim s3    As String     '終了日分のグラフのデータ
  
   With MSFlexGrid1
      For i = 1 To 3
         SD = Day(DateValue(.TextMatrix(i, 1)))    '開始日の取得
         ED = Day(DateValue(.TextMatrix(i, 2)))    '終了日の取得
         ST = Hour(TimeValue(.TextMatrix(i, 1)))   'スタート時間の取得
         ET = Hour(TimeValue(.TextMatrix(i, 2)))   '終了時間の取得
         If SD = ED Then      '開始日と終了日が同じ場合
            '開始時間までの時間数分スペースを付加し当日内の時間分 ">" (1個1時間) を表示
            s1 = String$(ST, " ") & String$(ET - ST, ">")
            .TextMatrix(i, SD) = s1
         Else
            s1 = String$(ST, " ") & String$(24 - ST, ">")
            '------------ 工程が何日にもまたぐ場合 ---------------------
            Dim Nisu As Integer
            Nisu = ED - SD
            If Nisu >= 2 Then
               s2 = String$(24, ">")
               For j = 1 To Nisu
                  .TextMatrix(i, SD + j + 2) = s2
               Next j
            End If
            s3 = String$(ET, ">") & String$(24 - ET, " ")
            .TextMatrix(i, SD + 2) = s1      '開始日の分
            .TextMatrix(i, ED + 2) = s3      '終了日の分
         End If
      Next i
   End With
End Sub

Private Sub Form_Resize()
   If Me.WindowState <> vbMinimized Then
      MSFlexGrid1.Move 150, 150, Me.Width - 550, Me.Height - 800
   End If
End Sub

Private Sub MSFlexGrid1_MouseMove(Button As Integer, _
                                    Shift As Integer, x As Single, y As Single)
   Dim R As Long
   R = MSFlexGrid1.MouseRow
   If R > 0 Then
      MSFlexGrid1.ToolTipText = MSFlexGrid1.TextMatrix(R, 0) & "  開始日時: " & _
         MSFlexGrid1.TextMatrix(R, 1) & "  終了日時: " & MSFlexGrid1.TextMatrix(R, 2)
   End If
End Sub


-------------------------------------------------------
上記実行結果の画像(画像をクリックすると元のサイズで見られます。)

右側は、VB2008 のDataGridViewで工程表(ガントチャート)を作成した結果です。
簡単にオーナードローで描画ができるので、セル内を6時間毎に区切り線等も引いてみました。
データを編集する度に再描画するようにし、ファイルの保存・印刷機能もつけてみました。



 [スレッド一覧へ] [親スレッドへ]