Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2416 / 13645 ツリー ←次へ | 前へ→

【68136】チャート作成について かな 11/2/4(金) 15:09 質問[未読]
【68140】Re:チャート作成について 不明 11/2/4(金) 21:03 発言[未読]
【68156】Re:チャート作成について かな 11/2/7(月) 13:09 お礼[未読]
【68143】Re:チャート作成について kanabun 11/2/6(日) 16:47 発言[未読]
【68155】Re:チャート作成について かな 11/2/7(月) 13:05 お礼[未読]

【68136】チャート作成について
質問  かな  - 11/2/4(金) 15:09 -

引用なし
パスワード
   今、ガントチャートをエクセルで作成しているのですが、
図形の直線の位置がうまくいかなくて悩んでいます
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


よろしくおねがいします

【68140】Re:チャート作成について
発言  不明  - 11/2/4(金) 21:03 -

引用なし
パスワード
   試そうと思ってもエラーが出て進みません。
ご自分でためして、エラーが出ないようなコードを
アップしてください。

【68143】Re:チャート作成について
発言  kanabun  - 11/2/6(日) 16:47 -

引用なし
パスワード
   ▼かな さん:
こんにちは〜

>チャートの開始日付から、どんどん後ろの日付にいく度に、すこしづつ
>X軸の位置がずれていっているようです
>
>どこがいけないのか?

肝心の「日付の修正」関数が公開されていないので、
どうずれているかはわからないです。

ただ、「728日」といったら「104週」分であって、105週ではないですよね?

あと、描画範囲の 最初の日付〜最後の日付 に対応する
描画範囲の左端座標〜右端座標は 描画中変更はありませんから、
さいしょに一度だけ計算しておいて、共有変数に覚えておけば
位置の計算はもうすこし簡単になります。

'-----------------------------------------------------------
Option Explicit

Dim MINDay As Long   '描画初期日
Dim MAXDay As Long   '描画最終日
Dim MinPoint As Double '初期日に対応するPoint座標
Dim MaxPoint As Double '最終日に対応するPoint座標
Dim xCOEF As Double   '日にち→セルPoint座標 変換係数

'----------------------------------------------------
Sub 作業()
 Dim v As Variant
 Dim i As Long
 
 With Worksheets("項目")
   With .Range("A1").CurrentRegion.Resize(8)
     v = Intersect(.Cells, .Offset(1)).Value
   End With
 End With
 
 With Worksheets("チャート")
   .Activate
   'ラインを削除
   .Lines.Delete
 
   '初期設定
   MINDay = DateSerial(2011, 1, 1)
   MAXDay = DateAdd("d", 105 * 7, MINDay) '105週分
   MinPoint = .Columns(5).Left
   MaxPoint = .Columns(5 + 105).Left
   xCOEF = (MaxPoint - MinPoint) / (MAXDay - MINDay)
   
   .Range("E4").Value2 = MINDay
    
   'データのコピー
   .Range("A5").Resize(UBound(v), 4).Value = v
   For i = 1 To UBound(v)
     If Not IsEmpty(v(i, 5)) And (v(i, 6) >= v(i, 5)) Then _
       DrawBar i + 4, CLng(v(i, 5)), CLng(v(i, 6)), True
     
     If Not IsEmpty(v(i, 7)) And (v(i, 8) >= v(i, 7)) Then _
       DrawBar i + 4, CLng(v(i, 7)), CLng(v(i, 8)), False
   Next
 End With

End Sub
'----------------------------------------------------
Private Sub DrawBar(RowIndex As Long, day1 As Long, day2 As Long, _
          is予定 As Boolean)
 '描画位置用変数
 Dim X1 As Double
 Dim X2 As Double
 Dim Y1 As Double
 Dim Y2 As Double
  
 'day1に対応するxPoint を求める
 X1 = (day1 - MINDay) * xCOEF + MinPoint
 'day2に対応するxPoint を求める
 X2 = (day2 - MINDay) * xCOEF + MinPoint
 With ActiveSheet.Rows(RowIndex)
   Y1 = .Top + .Height * IIf(is予定, 1, 3) / 4
   Y2 = Y1
 End With
 With ActiveSheet.Shapes.AddLine(X1, Y1, X2, Y2)
   .Line.Weight = 5
   .Line.DashStyle = IIf(is予定, msoLineSquareDot, msoLineSolid)
 End With
End Sub

【68155】Re:チャート作成について
お礼  かな  - 11/2/7(月) 13:05 -

引用なし
パスワード
   ▼kanabun さん:

アドバイスありがとうございました

>
>ただ、「728日」といったら「104週」分であって、105週ではないですよね?

勘違いしておりました
上記の言葉で気づきました
728日は104週だから、計算がずれていっていたようです
728+7日したら、チャートがうまくいきました

あと、Kanabunさんが記述してくれたコードを、参考に
座標などを初期設定させるといった方法を今、
作成しなおし中です

また、不明な点がでてきたら聞くことがあるかもしれませんが、
よろしくお願いします

【68156】Re:チャート作成について
お礼  かな  - 11/2/7(月) 13:09 -

引用なし
パスワード
   ▼不明 さん:
>試そうと思ってもエラーが出て進みません。
>ご自分でためして、エラーが出ないようなコードを
>アップしてください。

不明さん・・・

すみません・・・確かにエラーがでてしまいますね
実際のコードはいろいろと複雑だった為に、
VBA質問箱用に作成し直して、アップしていた為に、こんな結果になってしまいました

ご迷惑おかけしました・・・

とりあえず、チャートの問題はなんとか回避できました

こちらの考えのポカミスでした

2416 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free