[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ガントチャートに時刻を追加』(テセウスの船)
ネットで見つけたのですがオートシェイプを使ってガントチャートを描画するマクロです。 開始日や日数を入力すると、色付きの四角形を自動的に表示します。 時刻を持たせて双方向の矢印を四角形上に表示出来たら最高なのですが・・・ 教えていただきたい。宜しくお願いします。
' 「開始日」(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 >
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.