Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2010)
グラフの凡例とタイトル
投稿日時: 17/03/19 12:45:29
投稿者: バルバロッサ

立て続けに申し訳ありません.
グラフの凡例とタイトルについて教えてください.
先ほどと同じコードになるのですが,
赤い部分で,凡例を消すように指示を出しております.
このとき,グラフでは凡例が消えて,タイトルのみが表示され,タイトルも直下の指示に従い,フォントを小さくできました.
しかし,タイトルを消して,凡例を表示させたいと思い.
赤い部分を
.HasTitle = False
直下のフォント指定も消しました.
しかし,タイトルは消すことが出来ず,凡例も表示されました.
色々HPを調べたら,タイトルを消すようなコードを見つけることが出来ませんでした.
 
Sub Sample()
Dim Str As String, Pos As String
Dim SE1 As Variant, SE2 As Variant, SE3 As Variant
 
    Str = Mid(Cells(7, 1), 4, 20)
    SE1 = Cells(7, 7).Value
    SE2 = Cells(27, 7).Value
    SE3 = Cells(47, 7).Value
    Pos = Split(Cells(1, 8).Address, "$")(1) & CStr(Cells(1, 8).Row)
     
     With ActiveSheet.Shapes.AddChart.Chart
         .ChartType = xlColumnClustered
         .SetSourceData Range("c7,C27,c47")
         .SeriesCollection(1).Name = Str
.HasLegend = False
.ChartTitle.Format.TextFrame2.TextRange.Font.Size = 10
         .SeriesCollection(1).HasErrorBars = True
         .SeriesCollection(1).ErrorBar Direction:=xlY, Include:= _
            xlPlusValues, Type:=xlErrorBarTypeCustom, Amount:=Array(SE1, SE2, SE3)
         .Axes(xlValue).TickLabels.NumberFormatLocal = "###0.00"
         .ChartArea.Top = Range(Pos).Top
         .ChartArea.Left = Range(Pos).Left
     End With
 End Sub
 
どうしたら良いのでしょうか?
よろしくお願いいたします.

回答
投稿日時: 17/03/19 12:53:28
投稿者: simple

タイトルを削除する動作をマクロ記録してみましたか?

投稿日時: 17/03/19 13:53:37
投稿者: バルバロッサ

Simpleさん
早速お返事ありがとうございます.
Sub Sample()
 Dim Str As String, Pos As String
 Dim SE1 As Variant, SE2 As Variant, SE3 As Variant
   
     Str = Mid(Cells(7, 1), 4, 20)
     SE1 = Cells(7, 7).Value
     SE2 = Cells(27, 7).Value
     SE3 = Cells(47, 7).Value
     Pos = Split(Cells(1, 8).Address, "$")(1) & CStr(Cells(1, 8).Row)
       
      With ActiveSheet.Shapes.AddChart.Chart
          .ChartType = xlColumnClustered
          .SetSourceData Range("c7,C27,c47")
          .SeriesCollection(1).Name = Str
     .HasTitle = False
          .SeriesCollection(1).HasErrorBars = True
(以下略)
      End With
  End Sub
とタイトルを外すように,試してみたのですが,
これでは,消えませんでした.
そこで,
          .SeriesCollection(1).Name = Str
も一緒に消してみました,
今度はタイトルを消して,凡例を残すことが出来ました.
しかし,
凡例用の名前を消したので,当然のことながら,
グラフの凡例では”系列1”と出てきました.
折角,凡例の名前を変えることが出来ると思ったのですが,今度は名前を付けられなくなってしまいました.
と,実は昨晩苦しんでいました.
 
よろしくお願いいたします.

回答
投稿日時: 17/03/19 14:36:42
投稿者: mattuwan44

 
マクロの記録でわかると思いますが?
 

Sub Macro10()
'
' Macro10 Macro
'

'
    ActiveSheet.ChartObjects("グラフ 10").Activate
    ActiveChart.PlotArea.Select
    ActiveChart.ChartArea.Select
    ActiveChart.SetElement (msoElementChartTitleAboveChart)
    ActiveChart.SetElement (msoElementChartTitleNone)
    ActiveChart.SetElement (msoElementLegendLeft)
    ActiveChart.SetElement (msoElementLegendNone)
End Sub

 
前回の質問も同じです。
 
Sub Macro6()
'
' Macro6 Macro
'

'
    ActiveSheet.Shapes.AddChart.Select
    ActiveChart.ChartType = xlColumnClustered
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection(1).Name = "=""1"""
    ActiveChart.SeriesCollection(1).Values = "=集計対象!$D$16:$D$23"
End Sub

 
何をどうしたいか解らないけど、合わせるとこんな感じとか?
 
Sub test()
    Dim Rng As Range
 
    Set Rng = Range(Cells(2, "A"), Cells(4, "D"))
 
    With ActiveSheet.Shapes.AddChart.Chart
        .ChartType = xlColumnClustered
        With .SeriesCollection.NewSeries
            .Name = Rng.Columns(1).Cells(0).Value
            .Values = Rng.Columns(1).Value
            .HasErrorBars = True
            .ErrorBar Direction:=xlY, Include:= _
                      xlPlusValues, Type:=xlErrorBarTypeCustom, Amount:=Array(1, 2, 3)
 
        End With
        With .SeriesCollection.NewSeries
            .Name = Rng.Columns(3).Cells(0).Value
            .Values = Rng.Columns(3).Value
        End With
        With .SeriesCollection.NewSeries
            .Name = Rng.Columns(2).Cells(0).Value
            .Values = Rng.Columns(2).Value
        End With
         
        'タイトルなし
        .SetElement msoElementChartTitleNone
         
        .ChartArea.Top = Rng.Columns(4).Top
        .ChartArea.Left = Rng.Columns(4).Left
    End With
End Sub
 

回答
投稿日時: 17/03/19 15:48:16
投稿者: simple

たぶん解決済みだとおもいますが。
 
あなたの提示したものをそのまま実行すると
タイトルは消えますけどねえ。
実際に動かしたものと違うものを提示していますか?
 

Sub Sample()
    Dim Str As String, Pos As String
    Dim SE1 As Variant, SE2 As Variant, SE3 As Variant  ' double ?

    Str = Mid(Cells(7, 1), 4, 20)  
    SE1 = Cells(7, 7).Value
    SE2 = Cells(27, 7).Value
    SE3 = Cells(47, 7).Value
    Pos = Split(Cells(1, 8).Address, "$")(1) & CStr(Cells(1, 8).Row) ' 下記言及あり

    With ActiveSheet.Shapes.AddChart.Chart
        .ChartType = xlColumnClustered
        .SetSourceData Range("c7,C27,c47")
        .SeriesCollection(1).Name = Str
        .HasTitle = False
        .SeriesCollection(1).HasErrorBars = True
    End With
End Sub

なお、マクロ記録をとると
ChartTitle.Delete
のようなメソッドが記録されるはずなんだが、
少しも実行していないということですか。
# こちらでないとダメということはないだろうが。
# なんだかな、腑に落ちない。
 
ちなみに、
    Pos = Split(Cells(1, 8).Address, "$")(1) & CStr(Cells(1, 8).Row)
は、直接H1とするか、
    Pos = Cells(1, 8).Address(False, False)
のようにするのが普通ですね。(直接関係しないポイントですが。)

投稿日時: 17/03/19 17:57:33
投稿者: バルバロッサ

mattuwan44さん,Simpleさん
お返事ありがとうございます.
まず,Simpleさんの始めに頂いた内容を,きちんと読まずマクロ記録を読み間違えて,マクロ記録をせずにメッセージをアップしてしまい申し訳ありません.
そこで,実際にマクロ記録をしてみました.
するとおっしゃるとおりに,
    ActiveSheet.ChartObjects("グラフ 1").Activate
    ActiveChart.ChartTitle.Select
    Selection.Delete
と出てきました.
内容的には,理解できます.
しかし,このマクロ記録の物は多分,利用できません.
というのは,このマクロ記録では,すでに作成されたグラフを選択して,その中のタイトルを消すと言う内容になるので,ChartObjects(”グラフ1”)を指定しています.今回の私の場合は,新しくグラフを作成する際にタイトルを表示しないとと言うことになります.
そこで,このマクロ記録をされた物を,利用しようにも,出来ませんでした.
 
さて,そこで私の提示した物

引用:
Sub Sample()
    Dim Str As String, Pos As String
    Dim SE1 As Variant, SE2 As Variant, SE3 As Variant ' double ?
 
    Str = Mid(Cells(7, 1), 4, 20)
    SE1 = Cells(7, 7).Value
    SE2 = Cells(27, 7).Value
    SE3 = Cells(47, 7).Value
    Pos = Split(Cells(1, 8).Address, "$")(1) & CStr(Cells(1, 8).Row) ' 下記言及あり
 
    With ActiveSheet.Shapes.AddChart.Chart
        .ChartType = xlColumnClustered
        .SetSourceData Range("c7,C27,c47")
        .SeriesCollection(1).Name = Str
        .HasTitle = False
        .SeriesCollection(1).HasErrorBars = True
    End With
End Sub

で再度確認しても,はやりタイトルは消えません.
今は,Excel2010でしているので,家で違うパソコンExcel2016で試してみたいと思います.
 
で,次にSimpleさんから頂いた別の内容ですが,
以前の投稿でさせていただいたのですが,私はあまり”H1”とか,”A3”とかしているのが好きでないので,出来ればCells()を用いて記載を考えています.
どうもグラフのマクロはCellsで記載をするのは,難しいようなので,”H1”を表記する前に,Cells()を用いて記載しました.
以前投稿した記事(グラフ作成でのソースデータの指定 )で,MAXIさんが記載方法のヒントを教えていただいたので,それを利用させていただきました.
 
次に,Variant ' double ?
とされていた部分ですが,マイクロソフトのグラフ作成のHPを見たらAmount:=の部分はVariantと記載があったので,DoubleではなくVariantとしました.
https://msdn.microsoft.com/ja-jp/library/office/ff193850.aspx
 
ちなみにmattuwan44さんのコードはまだ理解できていないので,もう少し考えてみます.

回答
投稿日時: 17/03/19 18:28:46
投稿者: mattuwan44

>今回の私の場合は,新しくグラフを作成する際にタイトルを表示しないとと言うことになります.
>そこで,このマクロ記録をされた物を,利用しようにも,出来ませんでした.

どういう意味か解らんけど、
あるかも知れないしないかもしれないという意味では、
無い時には削除ができませんね。
でも、削除でも問題はないと思います。
 
>ちなみにmattuwan44さんのコードはまだ理解できていないので,もう少し考えてみます.
こちらの方がいいのかなぁ。。。
 
Sub Sample()
    Dim Rng As Range
    Dim myChart As Chart
    Dim i As Long
 
    With ActiveSheet
        Set Rng = Union(.Cells(7, 7), .Cells(27, 7), .Cells(47, 7))
        Set myChart = .Shapes.AddChart.Chart
    End With
 
    With myChart
        .ChartType = xlColumnClustered
        .SetSourceData Rng
        .Axes(xlValue).TickLabels.NumberFormatLocal = "###0.00"
        .ChartArea.Top = Rng.Areas(1).Offset(, 1).Top
        .ChartArea.Left = Rng.Areas(1).Offset(, 1).Left
 
        For i = 1 To Rng.Areas.Count
            With .SeriesCollection(i)
                .Name = Mid(Rng.Areas(i).Offset(-6).Value, 4, 20)
                .ErrorBar Direction:=xlY, _
                          Include:=xlPlusValues, _
                          Type:=xlErrorBarTypeCustom, _
                          Amount:=Rng.Areas(i).Value
            End With
        Next
         
        .SetElement msoElementChartTitleNone
        .SetElement msoElementLegendRightOverlay
    End With
End Sub

回答
投稿日時: 17/03/19 18:40:23
投稿者: mattuwan44

すこし解説すると、
複数の系列を表示するときは、
凡例項目(系列)の追加をします。
 
範囲で一気に指定しても、系列が作られます。
それが、
SeriesCollection
です。
で各各の系列を
1つ目が SeriesCollection(1)
2つ目が SeriesCollection(2)
と表現されます。
 
後タイトルなしは、
 
グラフを選択したときに出るグラフツールのレイアウトのリボンにあるので、
そちらで切り替えたらいいと思います。
まぁ。各プロパティで設定も出来るかもしれませんが、
実行する順番は最後が確実でしょうね。
何かの拍子にタイトルが勝手に設定されるようです。

回答
投稿日時: 17/03/19 18:56:27
投稿者: mattuwan44

あ、板汚しすみません。
 
系列は1つにしたいのか3つにしたいのかが不明でしたね。
3つ設定したいとして、こうかな?
上のはエラーになりますね^^;;
 
 
Sub Sample()
    Dim Rng As Range
    Dim myChart As Chart
    Dim i As Long
 
    With ActiveSheet
        Set Rng = Union(.Cells(7, 7), .Cells(27, 7), .Cells(47, 7))
        Set myChart = .Shapes.AddChart.Chart
    End With
 
    With myChart
        .ChartType = xlColumnClustered
        .Axes(xlValue).TickLabels.NumberFormatLocal = "###0.00"
        .ChartArea.Top = Rng.Areas(1).Offset(, 1).Top
        .ChartArea.Left = Rng.Areas(1).Offset(, 1).Left
 
        For i = 1 To Rng.Areas.Count
            With .SeriesCollection.NewSeries
                .Name = Mid(Rng.Areas(i).Offset(-6).Value, 4, 20)
                .Values = Rng.Areas(i).Value
                .ErrorBar Direction:=xlY, _
                          Include:=xlPlusValues, _
                          Type:=xlErrorBarTypeCustom, _
                          Amount:=Rng.Areas(i).Value
            End With
        Next
 
        .SetElement msoElementChartTitleNone
        .SetElement msoElementLegendRightOverlay
    End With
End Sub

回答
投稿日時: 17/03/19 20:19:03
投稿者: simple

質問者さんへ
 
> しかし,このマクロ記録の物は多分,利用できません.
> というのは,このマクロ記録では,すでに作成されたグラフを選択して,
> その中のタイトルを消すと言う内容になるので,ChartObjects(”グラフ1”)を
> 指定しています.今回の私の場合は,新しくグラフを作成する際にタイトルを
> 表示しないとと言うことになります.
> そこで,このマクロ記録をされた物を,利用しようにも,出来ませんでした

こう言う考え方をしているということは、
日頃あまりマクロ記録を活用していませんね?
 
マクロ記録というものは、一字一句をそのまま使うと言うことは殆どありません。
 
このマクロ記録から読み取るべき情報は以下のようなものです。
 

・Chartオブジェクトには、ChartTitleオブジェクトを返すChartTitleプロパティがある。
・ChartTitleオブジェクトにはDeleteメソッドがある。
ということです。
 
> ChartObjects(”グラフ1”)を指定しています.
> 今回の私の場合は,新しくグラフを作成する際にタイトルを表示しないとと
> 言うことになります.
新しく作ったものかどうかは関係ありません。
どんな作り方であれ、Chartオブジェクトとしては共通の性質があるのですから、
上記の(a)(b)の情報を使っていけばよいと思いますよ。
 
----------------------------------------
タイトルの消去が出来ないというのは、こちら(Excel2010です)では再現しません。
  .HasTitle = False
のかわりに
  .ChartTitle.Delete
としてもタイトルは消えないんですか?
Str = Mid(Cells(7, 1), 4, 20) の内容がグラフタイトルに残っているのですか?
念のためステップ実行して確認してみて下さい。
 
----------------------------------------
そもそもですが、
.SetSourceData Range("c7,C27,c47")
のような指定は普通しないんじゃないかなあ。(もちろん可能ではあるのですが)
・不連続は普通は避けます
・系列名やラベル(3点の名前)も同時にセットすることが普通。
 
不連続領域でデータを指定しようとしているので、
しなくてもよいと思われる苦労をされているんだと思います。
 
原点に戻って、
連続した領域にデータを集められませんか?
フィルタなどを使えば可能でしょう?
系列名やラベルを同時に指定する標準的なつくりにしたほうが
楽にできると私は思います。
もっと標準的なグラフで学習されたらどうでしょう。

回答
投稿日時: 17/03/19 20:53:20
投稿者: simple

追記します。
(1)
> 以前投稿した記事(グラフ作成でのソースデータの指定 )で,
> MAXIさんが記載方法のヒントを教えていただいたので,
> それを利用させていただきました.

こちらですか?
  SetStrA1 = "'Sheet1'!$" & Split(Cells(1, 1).Address, "$")(1) _
                    & "$" & CStr(Cells(1, 1).Row)
絶対参照ならば
    

SetStrA1 = "'Sheet1'!" & Cells(1, 1).Address
でいいですよ。
Addressのヘルプを参照して下さい。
 
(2)
> 次に,Variant ' double ?
> とされていた部分ですが,マイクロソフトのグラフ作成のHPを見たらAmount:=の部分はVariantと記載があったので,DoubleではなくVariantとしました.
> https://msdn.microsoft.com/ja-jp/library/office/ff193850.aspx
了解しました。
 
Amount:=Array(SE1, SE2, SE3)
を前提とするなら、SE1,SE2,SE3は別にVariantである必要はないと思います。
特にこだわりませんが。

回答
投稿日時: 17/03/19 21:18:03
投稿者: simple

ちなみに、一カ所に集めないといけないわけではないので、今の方針で進めてください。
余計なことでした。
 
また、SetSourceData のsource引数に与えるのは文字列にする必要はなく、
Rangeオブジェクトでよいので、
SetStrA1 = "'Sheet1'!" & Cells(1, 1).Address
と文字列にする必要すらないですね。
 
mattuwan44 さんが有益なコメントをされています。
私はこれで失礼します。

投稿日時: 17/03/19 21:55:19
投稿者: バルバロッサ

mattuwan44さん、Simpleさん
ありがとうございます。
非常に勉強になりました。
特に、mattuwan44さんの解説、お忙しい中非常に参考になりました。
活用させていただきます。
 
Simpleさん
日頃はマクロ記録は多少使用していますが、私の場合は、マクロ記録の中で、使えるものを使って、という方法をとっていました。
つまり、オブジェクトを見たりメソッドを読み取る内容を間違っていました。
マクロ記録から得る情報がこれほど有益だとは知りませんでした。
そして、ステップ実行のことをすっかり忘れておりました。
ご指摘、大変感謝いたします。
 
今回も非常に勉強させていただきました。
ありがとうございました。