[[20171013140518]] 『グラフの書き出し位置指定について』(コヨーテひな) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『グラフの書き出し位置指定について』(コヨーテひな)

グラフを作成しようとして、以下のコードを自動記録させたり、過去ログから拾ってきてつなぎ合わせましたが、毎回同じ場所にグラフができてしまって、複数グラフが重なってしまいます。グラフを指定セルに書き出すには、どのように修正したらいいのでしょうか。グラフは初めてで命令がよく理解できません。
Sub バブルチャート売上高()

    Range("W2:X7").Select
    ActiveSheet.Shapes.AddChart2(269, xlBubble3DEffect).Select
    ActiveChart.SetSourceData Source:=Range("結果!$W$2:$X$7")
    ActiveChart.FullSeriesCollection(1).Name = "=結果!$X$1"
    ActiveChart.FullSeriesCollection(1).XValues = "=結果!$W$2:$W$7"
    ActiveChart.FullSeriesCollection(1).Values = "=結果!$X$2:$X$7"
    ActiveChart.ApplyDataLabels
    ActiveChart.FullSeriesCollection(1).DataLabels.Select
    Selection.ShowValue = False
    ActiveChart.FullSeriesCollection(1).DataLabels.Select
    ActiveChart.SeriesCollection(1).DataLabels.Format.TextFrame2.TextRange. _
        InsertChartField msoChartFieldRange, "=結果!$V$2:$V$7", 0
    Dim Counter As Integer, ChartName As String, xVals As String
    Dim ranges() As String
    Application.ScreenUpdating = False
'グラフの元データ範囲を取得
    xVals = ActiveChart.SeriesCollection(1).Formula
    xVals = Replace(xVals, "=SERIES(", "")
    xVals = Replace(xVals, ")", "")
    ranges() = Split(xVals, ",")
    xVals = ranges(1)
    xVals = Mid(xVals, InStr(xVals, "!") + 1)

'各バブルの系列名

    For Counter = 1 To Range(xVals).Cells.Count
    ActiveChart.SeriesCollection(1).Points(Counter).HasDataLabel = True
    ActiveChart.SeriesCollection(1).Points(Counter).DataLabel.Text = _
        Range(xVals).Cells(Counter, 1).Offset(0, -1).Value
    Next Counter
End Sub

以上 よろしくお願いいたします。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


Shapes.AddChart2のヘルプを読んでください。(質問する前に、ヘルプ参照やWeb検索はすべき)
自動記録だと、作成場所を記録しませんが、このメソッドは引数で座標指定できるはずです。
(???) 2017/10/13(金) 14:30

???さん

返信ありがとうございます。
見当が全くつきませんでしたが、ピンポイントのご指摘ありがとうございます。
じっくりと勉強していきます。
(コヨーテひな) 2017/10/13(金) 15:12


本題と関係ないのですが

グラフのデータ範囲は、固定なのに、
後半は無駄なことしていませんか?

 Option Explicit

 Sub バブルチャート売上高2()
    Dim r As Range
    Dim rN As Range, rX As Range, rY As Range
    Dim adrL As String

    Set r = Sheets("結果").Range("W2:X7")
    Application.Goto r

    Set rN = r.Cells(0, 2)                 '結果!$X$1
    Set rX = r.Columns(1)                   '結果!$W$2:$W$7
    Set rY = r.Columns(2)                   '結果!$W$2:$X$7
    adrL = r.Columns(0).Address(, , , True) '結果!$V$2:$V$7

    With ActiveSheet.Shapes.AddChart2(269, xlBubble3DEffect).Chart
         .ApplyDataLabels
        With .FullSeriesCollection(1)
            .Name = rN
            .XValues = rX
            .Values = rY
            .BubbleSizes = rY
            .DataLabels.Format.TextFrame2.TextRange. _
                InsertChartField msoChartFieldRange, "=" & adrL, 0
            .DataLabels.ShowRange = True
            .DataLabels.ShowValue = False
        End With
    End With

 End Sub

(マナ) 2017/10/13(金) 23:51


マナさん

すっきりとしたコードありがとうございます。
掲示したコードは、自動記録で作成したコードで、はっきり言って私には理解できませんでした。
急を要していたために自動記録で作成してしまいました。
教えていただいたコードを理解できるように勉強してみます。
(コヨーテひな) 2017/10/16(月) 11:15


>急を要していたために自動記録で作成してしまいました。

わたしも、マクロの記録を使いますよ。
問題はそこではありません。

Selection.ShowRange = True

を間違って削除してしまったのではありませんか?

>Selection.ShowValue = False

は、残してますよね。
もし削除しなければ、そもそも後半部分は不要だったのです。
わずか1行でできたのです。

面倒かもしれませんが、
記録されたマクロは、不要な行を削除だけして使うのではなく
変数やWith句を使用してSelectしないマクロに
書き換える習慣をつけるとよいです。
そうすると、どれが本当に不要で、どれが必要なのか
理解しやすいと思います。

(マナ) 2017/10/16(月) 21:45


マナさん

ご指摘ありがとうございます。

急いでいたために削除してしまったのかもしれません。

>面倒かもしれませんが、
>記録されたマクロは、不要な行を削除だけして使うのではなく
>変数やWith句を使用してSelectしないマクロに
>書き換える習慣をつけるとよいです。
>そうすると、どれが本当に不要で、どれが必要なのか
>理解しやすいと思います。

上記の部分、十分注意して勉強していきたいと思います。
(コヨーテひな) 2017/10/17(火) 16:27


本題についてですが、

セルの指定は、Application.Inputboxを使うこともできます。
http://www.relief.jp/docs/excel-vba-application-inputbox-range.html

ただ疑問なのですが、データは、V2:X7と固定なのに
グラフの出力先のみ変えたいのですか?

(マナ) 2017/10/17(火) 19:59


>毎回同じ場所にグラフができてしまって、複数グラフが重なってしまいます。

グラフはほぼいじったことないうえにバブルチャートの3Dの作り方も手動で上手くできなかったですが、

コヨーテひなさんのコードから、
 >ActiveSheet.Shapes.AddChart2(269, xlBubble3DEffect).Select
グラフも図形の仲間だとするなら、
例えば
’最後の図形を最後から1個前の図形の下右の下のセルの2個下のセルにずらす
Sub さんぷる()

    Dim shp As Shape

    With activesheet.Shapes
        .Item(.Count).Top = Cells(.Item(.Count - 1).BottomRightCell.Row + 2, "A").Top
    End With
End Sub
みたいなことをすればいいと思います。
グラフに限定する必要があれば、どのように指定するかは別途調べてください。

(まっつわん) 2017/10/18(水) 09:33


マナさん

実は数値は、X,Y,Zと入っていて、一つ目は(V2;X7),2つ目は(V2;Y7),3つ目が(V2;Z7)と範囲を変更して、それぞれ最終の列の数値をY軸とバブルサイズに指定しています。こんなやり方自体がそもそも間違っているのかもしれません。それでしたら、大変失礼な質問をしてしまいました。

まっつわんさん

指定されたコードをじっくり研究したいと思います。

どうもありがとうございました。

(コヨーテひな) 2017/10/18(水) 13:20


>実は数値は、X,Y,Zと入っていて、

納得しました。
でしたら、???さんのアドバイス通りです。

(マナ) 2017/10/18(水) 19:39


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.