Excel VBA質問箱 IV

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

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


9382 / 13644 ツリー ←次へ | 前へ→

【27483】グラフの挿入時のエラー回避について andy 05/8/10(水) 11:38 質問[未読]
【27485】Re:グラフの挿入時のエラー回避について Kein 05/8/10(水) 12:28 回答[未読]
【27521】Re:グラフの挿入時のエラー回避について andy 05/8/10(水) 19:41 質問[未読]
【27533】Re:グラフの挿入時のエラー回避について Kein 05/8/10(水) 22:35 回答[未読]
【27551】Re:グラフの挿入時のエラー回避について andy 05/8/11(木) 15:38 質問[未読]
【27555】Re:グラフの挿入時のエラー回避について Kein 05/8/11(木) 16:23 回答[未読]
【27652】Re:グラフの挿入時のエラー回避について andy 05/8/15(月) 1:36 質問[未読]
【27695】Re:グラフの挿入時のエラー回避について Kein 05/8/16(火) 14:46 回答[未読]

【27483】グラフの挿入時のエラー回避について
質問  andy  - 05/8/10(水) 11:38 -

引用なし
パスワード
   お願いします。

下記に記載する表よりデータを取得しグラフ作成を試みています。
表は2点(データ1、データ2)があります。
表に記載されたデータを「グラフ作成」ボタンを押すことでグラフ表示をします。

ここで問題ですが
1、グラフ作成ボタンを押すと削除しない限りグラフが増えていく
 回避方法として先ず既存のグラフを一旦削除して新たに作成するのが良いと
 思いますが方法が分かりません。

2、「グラフ作成1」「グラフ作成2」2つのボタンがありますが先に
 グラフ作成2を実行するとエラーになる。
 これの回避方法が分かりません。

何方かご指導をお願いいたします。


 A B C D E F G H I J K L
1 
2       グラフ表示領域
3       






・名称:データ1   「グラフ作成1」 ←マクロ実行ボタン
・日付 1 2 3 4 5・・・・
40品1 7 8 7 8 7 
41品2 6 8 7 5 3
42品3 9 6 5 7 5
43品4
44品5
45
46
47名称:データ2   「グラフ作成2」 ←マクロ実行ボタン
48日付 1 2 3 4 5・・・・
49品6
50品7
51品8
52品9
53品10


以下のマクロ2点を標準モジュールで操作しています

Sub グラフ作成1()

Dim datarg As Range
Dim graphrg As Range
Dim i As Integer

Set datarg = Range("a40:k44")
Set graphrg = Range("b1:M14")
ActiveSheet.ChartObjects.Add graphrg.Left, graphrg.Top, graphrg.Width, graphrg.Height
ActiveSheet.ChartObjects(1).Activate
ActiveChart.SetSourceData datarg, xlRows
'グラフ種類
ActiveChart.ChartType = xlLine
'タイトル
ActiveChart.HasTitle = True
ActiveChart.ChartTitle.Text = Range("a38").Value

With ActiveChart.ChartTitle
.Font.Size = 15

.Border.ColorIndex = 5
End With

'軸ラベル
With ActiveChart.Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "日付"
.AxisTitle.Font.Size = 12
End With

With ActiveChart.Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = Range("b47").Value
.AxisTitle.Font.Size = 14
End With

End Sub


Sub グラフ作成2()

Dim datarg As Range
Dim graphrg As Range
Dim i As Integer

Set datarg = Range("a49:k53")
Set graphrg = Range("b17:M31")
ActiveSheet.ChartObjects.Add graphrg.Left, graphrg.Top, graphrg.Width, graphrg.Height
ActiveSheet.ChartObjects(2).Activate
ActiveChart.SetSourceData datarg, xlRows
'グラフ種類
ActiveChart.ChartType = xlLine
'タイトル
ActiveChart.HasTitle = True
ActiveChart.ChartTitle.Text = Range("a47").Value

With ActiveChart.ChartTitle
.Font.Size = 15

.Border.ColorIndex = 5
End With

'軸ラベル
With ActiveChart.Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "日付"
.AxisTitle.Font.Size = 12
End With

With ActiveChart.Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = Range("b47").Value
.AxisTitle.Font.Size = 14
End With
End Sub

【27485】Re:グラフの挿入時のエラー回避について
回答  Kein  - 05/8/10(水) 12:28 -

引用なし
パスワード
   ↓「グラフ作成1」ボタンに登録するコード

Sub MyChart1()
  Dim Ch As ChartObject, MyCh As ChartObject
  Dim Lp As Single, Wp As Single, Hp As Single
 
  With ActiveSheet
   If .ChartObjects.Count > 0 Then
     For Each Ch In .ChartObjects
      If Ch.TopLeftCell.Address = "$G$1" Then
        Ch.Delete
      End If
     Next
   End If
   With .Range("G1:L9")
     Lp = .Left + 5
     Wp = .Width - 10
     Hp = .Height - 10
   End With
   Set MyCh = .ChartObjects.Add(Lp, 5, Wp, Hp)
   MyCh.Chart.ChartType = xlLine
   For i = 49 To 53
     If Not IsEmpty(.Cells(i, 2).Value) Then
      With MyCh.Chart.SeriesCollection.NewSeries
        .XValues = .Name & "!$A$48:$K$48"
        .Values = .Name & "!$A$ & i & ":$K$" & i
      End With
     End If
   Next i
   MyCh.Chart.HasTitle = True
   MyCh.Chart.ChartTitle.Text = .Range("A47").Value
  End With
  With MyCh.Chart.ChartTitle
   .Font.Size = 15
   .Border.ColorIndex = 5
  End With
  With MyCh.Axes(xlCategory)
   .HasTitle = True
   .AxisTitle.Text = "日付"
   .AxisTitle.Font.Size = 12
  End With
  With MyCh.Axes(xlValue)
   .HasTitle = True
   .AxisTitle.Text = "データ2"
   .AxisTitle.Font.Size = 14
  End With
  Set MyCh = Nothing
End Sub

↓「グラフ作成2」ボタンに登録するコード
    
Sub MyChart2()
  Dim Ch As ChartObject, MyCh As ChartObject
  Dim Wp As Single, Hp As Single
 
  With ActiveSheet
   If .ChartObjects.Count > 0 Then
     For Each Ch In .ChartObjects
      If Ch.TopLeftCell.Address = "$A$1" Then
        Ch.Delete
      End If
     Next
   End If
   With .Range("A1:F9")
     Wp = .Width - 10
     Hp = .Height - 10
   End With
   Set MyCh = .ChartObjects.Add(5, 5, Wp, Hp)
   MyCh.Chart.ChartType = xlLine
   For i = 40 To 46
     If Not IsEmpty(.Cells(i, 2).Value) Then
      With MyCh.Chart.SeriesCollection.NewSeries
        .XValues = .Name & "!$A$39:$K$39"
        .Values = .Name & "!$A$ & i & ":$K$" & i
      End With
     End If
   Next i
   MyCh.Chart.HasTitle = True
   MyCh.Chart.ChartTitle.Text = .Range("A38").Value
  End With
  With MyCh.Chart.ChartTitle
   .Font.Size = 15
   .Border.ColorIndex = 5
  End With
  With MyCh.Axes(xlCategory)
   .HasTitle = True
   .AxisTitle.Text = "日付"
   .AxisTitle.Font.Size = 12
  End With
  With MyCh.Axes(xlValue)
   .HasTitle = True
   .AxisTitle.Text = "データ1"
   .AxisTitle.Font.Size = 14
  End With
  Set MyCh = Nothing
End Sub

*提示された表では一部、行や列範囲があいまいなため、セルアドレスを推測で
指定しているところがあります。その点はそちらで正確に修正して下さい。

【27521】Re:グラフの挿入時のエラー回避について
質問  andy  - 05/8/10(水) 19:41 -

引用なし
パスワード
   Kein さん ありがとうございます。

若干、手は加えたのですがどうしても

Seriesクラスのvalueプロパティを設定できません。とエラーが出ます。
.Values = .Name & "!$A$" & i & ":$K$" & i

何が原因でしょうか??

環境はwinXP,エクセル2003になります。


Sub MyChart1()
  Dim Ch As ChartObject, MyCh As ChartObject
  Dim Lp As Single, Wp As Single, Hp As Single
 
  With ActiveSheet
   If .ChartObjects.Count > 0 Then
     For Each Ch In .ChartObjects
      If Ch.TopLeftCell.Address = "$A$1" Then
        Ch.Delete
      End If
     Next
   End If
   With .Range("A1:L9")
     Lp = .Left + 11
     Wp = .Width - 10
     Hp = .Height - 10
   End With
   Set MyCh = .ChartObjects.Add(Lp, 0, Wp, Hp)
   MyCh.Chart.ChartType = xlLine
   For i = 49 To 53
     If Not IsEmpty(.Cells(i, 2).Value) Then
      With MyCh.Chart.SeriesCollection.NewSeries
        .XValues = .Name & "!$A$48:$K$48"
        .Values = .Name & "!$A$" & i & ":$K$" & i
      
      End With
     End If
   Next i
   MyCh.Chart.HasTitle = True
   MyCh.Chart.ChartTitle.Text = .Range("A47").Value
  End With
  With MyCh.Chart.ChartTitle
   .Font.Size = 15
   .Border.ColorIndex = 5
  End With
  With MyCh.Axes(xlCategory)
   .HasTitle = True
   .AxisTitle.Text = "日付"
   .AxisTitle.Font.Size = 12
  End With
  With MyCh.Axes(xlValue)
   .HasTitle = True
   .AxisTitle.Text = "データ2"
   .AxisTitle.Font.Size = 14
  End With
  Set MyCh = Nothing
End Sub

【27533】Re:グラフの挿入時のエラー回避について
回答  Kein  - 05/8/10(水) 22:35 -

引用なし
パスワード
   んー・・それはおかしいですね。では、これでどうでしょーか ?

Sub MyChart1()
  Dim Ch As ChartObject, MyCh As ChartObject
  Dim Lp As Single, Wp As Single, Hp As Single
  Dim i As Integer, j As Integer   
 
  With ActiveSheet
   If .ChartObjects.Count > 0 Then
     For Each Ch In .ChartObjects
      If Ch.TopLeftCell.Address = "$A$1" Then
        Ch.Delete
      End If
     Next
   End If
   With .Range("A1:L9")
     Lp = .Left + 11
     Wp = .Width - 10
     Hp = .Height - 10
   End With
   Set MyCh = .ChartObjects.Add(Lp, 0, Wp, Hp)
   MyCh.Chart.ChartType = xlLine
   For i = 49 To 53
     If Not IsEmpty(.Cells(i, 2).Value) Then
      j = j + 1
      MyCh.Chart.SeriesCollection.NewSeries _
      .Formula = "=SERIES(," & .Name & "!$A$48:$K$48," & _
      .Name & "!$A$" & i & ":$K$" & i & "," & j & ")"
     End If
   Next i
   MyCh.Chart.HasTitle = True
   MyCh.Chart.ChartTitle.Text = .Range("A47").Value
  End With
  With MyCh.Chart.ChartTitle
   .Font.Size = 15
   .Border.ColorIndex = 5
  End With
  With MyCh.Axes(xlCategory)
   .HasTitle = True
   .AxisTitle.Text = "日付"
   .AxisTitle.Font.Size = 12
  End With
  With MyCh.Axes(xlValue)
   .HasTitle = True
   .AxisTitle.Text = "データ2"
   .AxisTitle.Font.Size = 14
  End With
  Set MyCh = Nothing
End Sub

【27551】Re:グラフの挿入時のエラー回避について
質問  andy  - 05/8/11(木) 15:38 -

引用なし
パスワード
   Kein さん ありがとうございました。

With MyCh.Axes(xlCategory)
にてエラーでしたので下記のように修正しました。
With MyCh.Chart.Axes(xlCategory)
無事に動いています。

ただし、表示領域をMyChart1ではA1:L15、MyChart2ではA17:L31に
設定したいのですが両方共A1:L15に表示されてしまいますなぜでしょうか?

またA39:K39に記載されている日付をグラフ横軸に表示したいのですが
どのようにすればよいでしょうか?


Sub MyChart1()
  Dim Ch As ChartObject, MyCh As ChartObject
  Dim Lp As Single, Wp As Single, Hp As Single
  Dim i As Integer, j As Integer

  With ActiveSheet
   If .ChartObjects.Count > 0 Then
     For Each Ch In .ChartObjects
      If Ch.TopLeftCell.Address = "$A$1" Then
        Ch.Delete
      End If
     Next
   End If
   With .Range("A1:L15")
     Lp = .Left + 5
     Wp = .Width - 10
     Hp = .Height - 10
   End With
   Set MyCh = .ChartObjects.Add(Lp, 0, Wp, Hp)
   MyCh.Chart.ChartType = xlLine
   For i = 40 To 44
     If Not IsEmpty(.Cells(i, 2).Value) Then
      j = j + 1
      MyCh.Chart.SeriesCollection.NewSeries _
      .Formula = "=SERIES(," & .Name & "!$A$39:$K$39," & _
      .Name & "!$A$" & i & ":$K$" & i & "," & j & ")"
     End If
   Next i
   MyCh.Chart.HasTitle = True
   MyCh.Chart.ChartTitle.Text = .Range("A38").Value
  End With
  With MyCh.Chart.ChartTitle
   .Font.Size = 11
   .Border.ColorIndex = 5
  End With
  With MyCh.Chart.Axes(xlCategory)
   .HasTitle = True
   .AxisTitle.Text = "DATE"
   .AxisTitle.Font.Size = 11
  End With
  With MyCh.Chart.Axes(xlValue)
   .HasTitle = True
   .AxisTitle.Text = Range("b38").Value
   .AxisTitle.Font.Size = 12
  End With
  Set MyCh = Nothing
End Sub


Sub MyChart2()
  Dim Ch As ChartObject, MyCh As ChartObject
  Dim Lp As Single, Wp As Single, Hp As Single
  Dim i As Integer, j As Integer

  With ActiveSheet
   If .ChartObjects.Count > 0 Then
     For Each Ch In .ChartObjects
      If Ch.TopLeftCell.Address = "$A$17" Then
        Ch.Delete
      End If
     Next
   End If
   With .Range("A17:L31")
     Lp = .Left + 5
     Wp = .Width - 10
     Hp = .Height - 10
   End With
   Set MyCh = .ChartObjects.Add(Lp, 0, Wp, Hp)
   MyCh.Chart.ChartType = xlLine
   For i = 49 To 53
     If Not IsEmpty(.Cells(i, 2).Value) Then
      j = j + 1
      MyCh.Chart.SeriesCollection.NewSeries _
      .Formula = "=SERIES(," & .Name & "!$A$48:$K$48," & _
      .Name & "!$A$" & i & ":$K$" & i & "," & j & ")"
     End If
   Next i
   MyCh.Chart.HasTitle = True
   MyCh.Chart.ChartTitle.Text = .Range("A47").Value
  End With
  With MyCh.Chart.ChartTitle
   .Font.Size = 11
   .Border.ColorIndex = 5
  End With
  With MyCh.Chart.Axes(xlCategory)
   .HasTitle = True
   .AxisTitle.Text = "DATE"
   .AxisTitle.Font.Size = 11
  End With
  With MyCh.Chart.Axes(xlValue)
   .HasTitle = True
   .AxisTitle.Text = Range("b47").Value
   .AxisTitle.Font.Size = 12
  End With
  Set MyCh = Nothing
End Sub

【27555】Re:グラフの挿入時のエラー回避について
回答  Kein  - 05/8/11(木) 16:23 -

引用なし
パスワード
   >MyChart2ではA17:L31に設定したい
ならば Top の値も取得・設定する必要がありますね。

Dim Lp As Single, Tp As Single, Wp As Single, Hp As Single

と、変数の宣言を追加し

With .Range("A17:L31")
  Lp = .Left + 5
  Tp = .Top + 5
  Wp = .Width - 10
  Hp = .Height - 10
End With

と、取得して

Set MyCh = .ChartObjects.Add(Lp, Tp, Wp, Hp)

と、設定します。
>A39:K39に記載されている日付をグラフ横軸に表示
両方のグラフ共通で、39行目をX軸にする。ということでしょーか ?
それなら MyChart2のコードを
>.Formula = "=SERIES(," & .Name & "!$A$48:$K$48," & _
>.Name & "!$A$" & i & ":$K$" & i & "," & j & ")"


.Formula = "=SERIES(," & .Name & "!$A$39:$K$39," & _
.Name & "!$A$" & i & ":$K$" & i & "," & j & ")"

とすれば良いのです。ちなみに SERIES関数(Excel4マクロ関数です)の引数は

=SERIES(系列名,X軸範囲,Y軸範囲,系列番号)

となっていて、系列名はブランクにしても文字列を "" で括って渡してもOKです。
これを知っていれば、自由にプロット範囲の書き換えが出来ますので、ぜひ覚えて
おいて下さい。

【27652】Re:グラフの挿入時のエラー回避について
質問  andy  - 05/8/15(月) 1:36 -

引用なし
パスワード
   Kein さん 有難うございます。


時間はかかりましたが系列の表示、何とかできました。
> =SERIES(系列名,X軸範囲,Y軸範囲,系列番号)
有難うございます。

ただ凡例の表示について
系列名は任意に表示されますが
カラーのラインが常に5本表示されます。
系列名の存在するカラーラインのみを表示することは可能でしょうか?
また凡例枠の大きさの設定は可能でしょうか?

【27695】Re:グラフの挿入時のエラー回避について
回答  Kein  - 05/8/16(火) 14:46 -

引用なし
パスワード
   >系列名の存在するカラーラインのみを表示
こんな感じかな ?

Dim i As Long

With Worksheets("sheet1").ChartObjects(1).Chart
  For i = .SeriesCollection.Count To 1 Step -1
   If .SeriesCollection(i).Name = "" Then
     .Legend.LegendEntries(i).Delete
   End If
  Next i
End With

>凡例枠の大きさの設定
Legend オブジェクトの Left,Top,Width,Height プロパティの各値をポイント単位で
設定すれば良いでしょう。↓

With Worksheets("sheet1").ChartObjects(1).Chart.Legend
  .Left = ?
  .Top = ?
  .Width = ?
  .Height = ?
End With

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