|
今、ガントチャートをエクセルで作成しているのですが、
図形の直線の位置がうまくいかなくて悩んでいます
X軸の取得方法がうまくいってないようなんですが、
チャートの開始日付から、どんどん後ろの日付にいく度に、すこしづつ
X軸の位置がずれていっているようです
どうか、どこがいけないのか?アドバイスお願いします
シート【項目】
A列;No.
B列;分類
C列;品目
D列;個数
E列;開始予定
F列;終了予定
G列;開始実績
H列;終了実績
が入っています
シート【チャート】
A列からD列まで、シート【項目】の情報を転記し、
E列からチャートを作成
開始日-終了日を直線(オートシェイプ)を使用して表示
チャート表示の開始日が、
2011/1/1
チャート表示の終了日が
2012/12/29
728日(2年分)のチャート日数ですが、列数が足りなくなるため、
1列(1セル幅)を7日ピッチで表示させてあり、
チャートの列数は105列としてあります
例えば
予定開始日:2011/1/1 予定終了日;2011/1/5
の場合の直線の配置はうまくいくのですが、
日付があとのほうになればなるほど、どんどんX軸の位置後ろへずれていってしまいます
現在のコードです
Dim CHART_ROW As Integer 'チャート開始行
Dim CHART_COL As Integer 'チャート開始列
Dim CHART_DATE As Date '開始日
Dim CHART_NAME As String 'チャート名称
------------------------------------------------------------
Sub 変数初期化()
CHART_ROW = 5
CHART_COL = 5
CHART_DATE = Sheets("チャート").Cells(4, 5).Value
CHART_NAME = "CHART"
End Sub
------------------------------------------------------------
'項目データ取得
Sub 項目データ取得()
Dim I As Integer
Dim MaxRow As Integer
Sheets("チャート").Activate
With .Sheets("項目")
For I = 2 To .Range("A" & Rows.Count).End(xlUp).Row
MaxRow = Range("A" & Rows.Count).End(xlUp).Row + 1
.Range(.Cells(I, "A"), .Cells(I, "D")).Copy Destination:= _
Sheets("チャート").Cells(MaxRow, "A")
'チャート描画処理
チャート描画 I, MaxRow, True '項目対象行、チャート対象行、予定
チャート描画 I, MaxRow, False '項目対象行、チャート対象行、実績
Next
End With
End Sub
-------------------------------------------------------------------------
'チャート描画処理
Sub チャート描画(項目行 As Integer, チャート行 As Integer, 予定 As Boolean)
Dim I As Integer
Dim J As Double
'描画位置用変数
Dim X1 As Double
Dim X2 As Double
Dim Y1 As Double
Dim Y2 As Double
'チャートの全期間幅用変数
Dim X0 As Double
'予定と実績の別を判断
If 予定 Then
I = 0
Else
I = 2
End If
'チャート728日数の設定
J = 728#
'チャートの全期間の幅を取得(チャート列数105列分)
X0 = Sheets("チャート").Columns(CHART_COL + 105#).Left - _
Sheets("チャート").Columns(CHART_COL).Left
With Sheests("項目")
'X軸の日付を取得
X1 = .Cells(項目行, 5 + I).Value - CHART_DATE
X2 = .Cells(項目行, 6 + I).Value - CHART_DATE
'日付の修正と描画位置への変換
X1 = 日付の修正(X1, 0, J) * X0 / J + Sheets("チャート").Columns(CHART_COL).Left
X2 = 日付の修正(X2, 0, J) * X0 / J + Sheets("チャート").Columns(CHART_COL).Left
'予定と実績の別を判断
If 予定 Then
I = 1
Else
I = 3
End If
'Y軸の取得
Y1 = Sheets("チャート").Rows(チャート行).Top + _
Sheets("チャート").Rows(チャート行).Height * I / 4
Y2 = Y1
'線の描画
線の追加 X1, Y1, X2, Y2, 予定
End With
End Sub
---------------------------------------------------------------------
'チャート用線の追加マクロ
Sub 線の追加(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double, _
予定 As Boolean)
Const 線の太さ = 5#
'線の追加と設定
ActiveSheet.Shapes.AddLine(X1, Y1, X2, Y2).Select
Selection.ShapeRange.Line.Weight = 線の太さ
If 予定 Then
Selection.ShapeRange.Line.DashStyle = msoLineSquareDot
Else
Selection.ShapeRange.Line.DashStyle = msoLineSolid
End If
Selection.Name = CHART_NAME
End Sub
'-----------------------------------------------------------
Sub チャート作成()
Sheets("チャート").Select
変数初期化
項目データ取得
End Sub
よろしくおねがいします
|
|