【最大10000ポイント】当たる!!質問投稿キャンペーン!

EXCEL2007 <VBAで散布図の系列の追加>


標記の通り、VBAで散布図に新たに系列を追加したいのです。
たとえば現在、系列1があるとします。
そこで、横軸がA1:A10、縦軸がB1:B10のデータを追加するとします。

    ActiveChart.SeriesCollection.Add Range("A1:B10")

しかし、このマクロだと縦軸がA1:A10の系列2と縦軸がB1:B10の系列3ができてしまします。

そこで、ためしに

    ActiveChart.SeriesCollection.Add Range("A1")   '仮に作る

    With ActiveChart.SeriesCollection(2)
      .XValues = Range("A1:A10")
      .Values = Range("B1:B10")
    End With

とすると、「実行時エラー'1004'; アプリケーション定義またはオブジェクト定義のエラーです。」となります。


いろいろ検索したのですが、これと言ったのがみつかりません。
意図するマクロはどのようなものになるのでしょうか。
ご教示お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

NewSeriesメソッドで系列が追加出来ます。



ActiveChartがグラフシートならセルは持っていません。
よって
.XValues = Range("A1:A10")
は成立しません。
元データがあるシート名を明記してください。

≪例1≫
With ActiveChart.SeriesCollection.NewSeries
  .XValues = Sheets("Sheet1").Range("A1:A10")
  .Values = Sheets("Sheet1").Range("B1:B10")
End With

≪例2≫
With Charts("Graph1").SeriesCollection.NewSeries
  .XValues = Sheets("Sheet1").Range("A1:A10")
  .Values = Sheets("Sheet1").Range("B1:B10")
End With

≪例3≫
With Charts(1).SeriesCollection.NewSeries
  .XValues = Sheets("Sheet1").Range("A1:A10")
  .Values = Sheets("Sheet1").Range("B1:B10")
End With
    • good
    • 0
この回答へのお礼

そうですね。Sheets("Sheet1").を加えないとだめですね。
いつも的確なご回答ありがとうございます。

お礼日時:2010/09/29 08:02

シート上グラフの場合で、


既に系列1があって、グラフを選択して標準モジュールの以下コードを実行すると
>ActiveChart.SeriesCollection.Add Range("A1")   '仮に作る
>With ActiveChart.SeriesCollection(2)
>  .XValues = Range("A1:A10")
>  .Values = Range("B1:B10")
>End With
これでもうまく行きます。
どの行でエラーが出てますか?

以下も試してみてください。
Sub test()
  With ActiveSheet.ChartObjects(1).Chart.SeriesCollection.NewSeries
    .XValues = Range("A1:A10")
    .Values = Range("B1:B10")
  End With
End Sub
    • good
    • 0
この回答へのお礼

すみません、埋め込みグラフではありませんでした。
埋め込みグラフのシートとデータのシートが同じであれば上記でうまくいくということですね。

ご回答どうもありがとうございます。

お礼日時:2010/09/29 08:04

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルVBAでグラフの線とマーカを設定したい

エクセルVBAでグラフの線とマーカを設定したいです。
グラフの線は無しでマーカの線が有りにしたいのですが、
マクロで記録したコードを見ると
グラフの線、マーカの線ともにFormat.Line.Visibleで指定しています。
実際にコードを記述しても、以下の様になり、グラフの線が表示されてしまいます。
ChartObjects("1").Chart.SeriesCollection(10).Format.Line.Visible = msoFalse

With ChartObjects("1").Chart.SeriesCollection(10).Format.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(255, 102, 0)
.Transparency = 0
End With
グラフの線は無しでマーカの線が有りに設定は出来ないのでしょうか?

Aベストアンサー

With ChartObjects("1").Chart.SeriesCollection(10)
.Format.Line.Visible = msoFalse
.MarkerForegroundColor = RGB(255, 102, 0)
End With

あるいは下記で折れ線のみ塗りつぶしなしになります。
Border.ColorIndex = xlNone

QVBAで散布図(グラフ)の作成

VBAでセルの値を読み込み散布図である折れ線グラフを作成しました。しかし、x軸に指定したい列も折れ線(xlScatterLines)で表示されてしまい思い通りになりません。どのようなキーワードでx軸を指定できるのでしょうか?ちなみに、そのグラフの[元のデータ]を参照するとやはりx軸の項目が空欄になっています。

Aベストアンサー

私なりにまとめてみました。参考になりますでしょうか。
反例などありましたら、指摘してください。
ここでは項目データが、列ごとに記録されているシートを考えます。
A列に体重、B列に身長、C列に年令などの例です。
(1)エクセルの散布図は2次元の図です。縦横の座標データが必要です。
また3つ以上あっても、2次元散布図では書けません。
シートに沢山(3列以上)の系列がある場合は、3系列以上指定するまたは指定しないと、それぞれが折れ線グラフで線なしの点グラフになってしまいます。
(2)2列の同行データでy軸、x軸で測って、交差する位置に点が描かれます。
(3)文字列の列があっても、2列しか数値データがない場合は、最初に出てくる数値列と次に出てくる数値列の2つが取り上げられます。
指定しないと、上例では体重と身長の散布図となります。
A列に近いほうから、最初にあるデータ列がX軸になり、次にあるデータ列がY軸になります。グラフウイザードの2/4でデータ範囲を、逆転させて
指定しても、逆になりません。列を入れかえるより他ないようです。
しかし隣り合わない、2つの列を指定したい(例えば体重と年令)場合は、体重列と年令列を(CTRLキーを押して)範囲指定して、グラフを描かせれば良い。
(4)そのほかに、Y軸の目盛の範囲を決めたいときは、一旦グラフを作成しY軸をクリックして、右クリックして、「軸の書式設定」を選び、「目盛」タブを選び、Y/数値軸目盛の最小値・最大値を指定します。身長であれば最小140、最大190とか指定します。X軸との交差点も指定します。
(5)あとX軸の目盛の範囲を決めたいときは、一旦グラフを作成しX軸をクリックして、右クリックして、「軸の書式設定」を選び、「目盛」タブを
選び、X/数値軸目盛の最小値・最大値を指定します。体重であれば最小50、最大90とか指定します。
(6)以上で目盛り線、凡例、タイトル、マーカー、データラベルなどを除いた、数値的な仕様が決まります。
--------
さて本題の、VBAでは
(A)散布図は
Charts.Add
ActiveChart.ChartType = xlXYScatter
(B)系列はActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:D7"), PlotBy:= _
xlColumns
この例ではA、C列は文字列の例でした。
列方向にデータ系列を考えるときはPlotBy:=xlColumnsです。
(C)グラフにするデータの列(と範囲)の指定は
C,D列に数値データがあるときの例では
ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("C1:D7")
離れた範囲の場合は
ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("C1:C7,E1:E7"),
(D)X軸の最高値と最低値、Y軸の最高値と最低値、交差する点を
定義するのは下記で行う。
ActiveChart.Axes(xlCategory).Select
With ActiveChart.Axes(xlCategory)
.MinimumScale = 50
.MaximumScale = 100
.CrossesAt = 50
End With
ActiveChart.Axes(xlValue).Select
With ActiveChart.Axes(xlValue)
.MinimumScale = 20
.MaximumScale = 100
.CrossesAt = 20
End With

私なりにまとめてみました。参考になりますでしょうか。
反例などありましたら、指摘してください。
ここでは項目データが、列ごとに記録されているシートを考えます。
A列に体重、B列に身長、C列に年令などの例です。
(1)エクセルの散布図は2次元の図です。縦横の座標データが必要です。
また3つ以上あっても、2次元散布図では書けません。
シートに沢山(3列以上)の系列がある場合は、3系列以上指定するまたは指定しないと、それぞれが折れ線グラフで線なしの点グラフになってしまいます。
...続きを読む

QExcelマクロ・グラフエリア・プロットエリアのサイズを変更及び綺麗に並べる

何方か、宜しくお願いします。

質問1
ワークシート上の複数のグラフを選択した状態でマクロを実効して
全てのグラフエリア・プロットエリアを同じサイズに変更するマクロを
教えて下さい。
(下記のコードでは、一つのグラフのプロットエリアのみ変更になります。)

Sub グラフサイズ()
ActiveSheet.ChartObjects("グラフ 1").Activate
ActiveChart.PlotArea.Select 'プロットエリア
With Selection
.Top = 17
.Left = 27
.Width = 463
.Height = 330
End With
Range("A3").Select
End Sub
(参考:http://oshiete.nikkeibp.co.jp/qa780484.html)

質問2
質問1で修正したグラフを3列、行数は任意でワークシート上に綺麗に並べたい
のですが、どのようなコードでしょうか。?(グラフとグラフの間は5ポイント位
隙間を入れたいと思います。グラフ数は20~40位、Excel2000)

何方か、宜しくお願いします。

質問1
ワークシート上の複数のグラフを選択した状態でマクロを実効して
全てのグラフエリア・プロットエリアを同じサイズに変更するマクロを
教えて下さい。
(下記のコードでは、一つのグラフのプロットエリアのみ変更になります。)

Sub グラフサイズ()
ActiveSheet.ChartObjects("グラフ 1").Activate
ActiveChart.PlotArea.Select 'プロットエリア
With Selection
.Top = 17
.Left = 27
.W...続きを読む

Aベストアンサー

こんばんは。Wendy02です。

>プロットエリアサイズは固定出来ないのでしょうか?、私が探した所無いようでしたが?Excelの仕様かな?

ある程度は可能ですが、On Error トラップが必要ですね。つまり、そのまま実行してしまうと、物理的?な数値に合わないと、実行時エラーが発生してしまうのです。だいたい、プロットエリアの大きさは、グラフエリアの90%ぐらいだったかな? だから、理論的に、一旦、プロットエリアの大きさを取って、グラフエリアを変更してしまえば可能だと思うのです。その後で、並びの位置整理すればよいわけですね。でも、そうすると、今度は、グラフ全体の大きさがマチマチになる可能性があるわけです。

それで、最初の私のコードのように、グラフエリアは、余計なものだとして、私は、消してしまったのです。結構、見栄えが良いなって、自負したのですが……。^^;

QEXCELVBAグラフ凡例表示部分の系列の名称非表

すいません。VBAの記述の方法がわからないのでお手数ですが教えてください
使用アプリ・使用OS:Excel2010 VBA Windows7

■教えてほしい内容
グラフを作成し、その後以下のVBAでグラフの系列を追加しています。

dk = ActiveChart.SeriesCollection.Count + 1
ActiveChart.SeriesCollection.NewSeries
'系列名の設定
ActiveChart.SeriesCollection(dk).Name = "cp-" & dk
'y軸の値設定
ActiveChart.SeriesCollection(dk).Values = "={" & aaa & "}"
'散布図設定
ActiveChart.SeriesCollection(dk).ChartType = xlXYScatter

その後、グラフの凡例部分でこの追加した系列cp-○の凡例内の系列を非表示にしたいのですがわかりません。
申し訳ありませんが教えてください。

Aベストアンサー

VBE のメニューのオブジェクトブラウザで、(LegendEntries
ではなく)LegendEntry
オブジェクトを見ると、そのメンバに Delete があります。

ちなみに Delete はできても Add はできないようです。LegendEntry を追加したくなったら、HasLegend プロパティを False や True に切り替えることにより、Legend
オブジェクト(凡例)全体を消したり出したりしてください。

あれこれ操作する場合は、参考 URL のように何かのオブジェクトを Set しておくと、コードの可読性が上がるでしょう。


With ActiveChart
  .HasLegend = True
  .Legend.LegendEntries(dk).Delete
End With

参考URL:http://www.officepro.jp/excelvba/chart_edit/index6.html

QVBAのグラフに違うシートの系列の追加について??

VBAでグラフに新たな系列を追加しようと思い
以下のプログラムを書きました。
しかしながら、 .
Valuesの値の指定の場所でエラーが発生しました。
また、
.XValues = Sheets(シート名(o)).Range(Cells(2, 1), Cells(行の数 + 1, 1))
.Values = Sheets(シート名(o)).Range(Cells(2, p + 1), Cells(行の数 + 1, p + 1))

.XValues = Range(Cells(2, 1), Cells(行の数 + 1, 1))
.Values = Range(Cells(2, p + 1), Cells(行の数 + 1, p + 1))
に直すとうまくいきました。

別のシートの値をグラフに設定する方法がわかっていないみたいなのですが、
やり方がよくわかりません。
もし、わかる方がいたら教えていただけないでしょうか?
よろしくお願いします。

以下、書いたプログラムです。

o=2
ActiveSheet.ChartObjects("グラフ1 " ).Activate
ActiveChart.SeriesCollection.NewSeries
'グラフの種類・データの範囲・凡例・2軸の使用を指定します
With ActiveChart.SeriesCollection(o)
'グラフの種類を設定 折れ線グラフ
.ChartType = xlXYScatterLines
'データの指定
.XValues = Sheets(シート名(o)).Range(Cells(2, 1), Cells(行の数 + 1, 1)) '←ここでエラーが出ます。
.Values = Sheets(シート名(o)).Range(Cells(2, p + 1), Cells(行の数 + 1, p + 1))
'凡例の指定
.Name = シート名(o)
End With

VBAでグラフに新たな系列を追加しようと思い
以下のプログラムを書きました。
しかしながら、 .
Valuesの値の指定の場所でエラーが発生しました。
また、
.XValues = Sheets(シート名(o)).Range(Cells(2, 1), Cells(行の数 + 1, 1))
.Values = Sheets(シート名(o)).Range(Cells(2, p + 1), Cells(行の数 + 1, p + 1))

.XValues = Range(Cells(2, 1), Cells(行の数 + 1, 1))
.Values = Range(Cells(2, p + 1), Cells(行の数 + 1, p + 1))
に直すとうまくいきました。

別のシートの値をグラフに設定する方法...続きを読む

Aベストアンサー

よくあるRange(Cells(・・),Cells(・・))の2つのセルのシート名を特定していないときに出るエラーではないのか。
よく経験することだが、これかどうか。
(1)エラーコードぐらい質問に書くこと
(2)教えてもらうのだから、労を惜しまず、読者が直ぐ追試できるぐらいの配慮(コードを修正)をして質問に挙げること。
 質問者しかわからない部分があるコードが例で載っている。
ーー
Sheet1あ、B列
x
a2
b3
c4
d5
ーー
棒グラフを描かせた(折線でも良い)。これも質問に書いてない。
Sheet2 A列
A2以下に1
2
3
4
ーーー
質問コードをを改変
Sub test01()
o = 2
ch = ActiveSheet.ChartObjects(1).Name
ActiveSheet.ChartObjects(ch).Activate
ActiveChart.SeriesCollection.NewSeries
'グラフの種類・データの範囲・凡例・2軸の使用を指定します
With ActiveChart.SeriesCollection(o)
'グラフの種類を設定 折れ線グラフ
.ChartType = xlXYScatterLines
'データの指定
行の数 = Worksheets("Sheet1").Range("a65536").End(xlUp).Row
Set sh2 = Worksheets("Sheet2")
.XValues = sh2.Range(sh2.Cells(2, 1), sh2.Cells(行の数 + 1, 1)) '←ここでエラーが出ます。
.Values = sh2.Range(sh2.Cells(2, p + 1), sh2.Cells(行の数 + 1, p + 1))
'凡例の指定
.Name = "Sheet2"
End With
End Sub
これでエラーは出ずに、それらしく折線が追加されたが、参考にしてください。

よくあるRange(Cells(・・),Cells(・・))の2つのセルのシート名を特定していないときに出るエラーではないのか。
よく経験することだが、これかどうか。
(1)エラーコードぐらい質問に書くこと
(2)教えてもらうのだから、労を惜しまず、読者が直ぐ追試できるぐらいの配慮(コードを修正)をして質問に挙げること。
 質問者しかわからない部分があるコードが例で載っている。
ーー
Sheet1あ、B列
x
a2
b3
c4
d5
ーー
棒グラフを描かせた(折線でも良い)。これも質問に書いて...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QExcel VBAで、アクティブシート内の全てのグラフを削除したい。

VBA初心者です。
アクティブシート内の全てのグラフを削除するには、どのように記述すればよいのでしょうか?よろしくお願いします。

Aベストアンサー

こんにちは。

確か、
ActiveSheet.ChartObjects.Delete

この一行でよかったと思いますね。

Qエクセル 0や空白のセルをグラフに反映させない方法

以下の点でどなたかお教えください。

H18.1~H20.12までの毎月の売上高を表に記載し、その表を元にグラフを作成しています。グラフに反映させる表の範囲はH18.1~H20.12の全てです。
そのためまだ経過していない期間のセルが空白になり、そこがグラフに反映され見づらくなります。
データを入力する都度グラフの範囲を変更すればいいのですが、うまく算式や設定等で空白や0円となっているセルをグラフに反映させない方法はありますか?

お手数ですが、よろしくお願いいたします。

Aベストアンサー

売上高のセルは数式で求められているのですよね?
それなら
=IF(現在の数式=0,NA(),現在の数式)
としてみてください。
つまり、0の場合はN/Aエラーにしてしまうんです。N/Aエラーはグラフに反映されません。

QVBA グラフX軸の変更

A列:X軸(日付)
H列:Y軸(値)
といったようなグラフを作成するにはどのようなソースで組めばよいのでしょうか?
現在は以下のようなソースまで組めます。
あとは、A列の日付をX軸に設定するだけなのですが、コーディングがわかりません。
---------------------------------------------------------------
Dim chart1 As Chart
Set chart1 = Charts.Add
'H列グラフ化
chart1.SetSourceData Worksheets("Sheet1").Range(Cells(ROWINI, COLRUI), Cells(iend, COLRUI))
chart1.ChartType = xlLineStacked
chart1.HasLegend = False
---------------------------------------------------------------

どなたかアドバイスいただければ幸いです。

A列:X軸(日付)
H列:Y軸(値)
といったようなグラフを作成するにはどのようなソースで組めばよいのでしょうか?
現在は以下のようなソースまで組めます。
あとは、A列の日付をX軸に設定するだけなのですが、コーディングがわかりません。
---------------------------------------------------------------
Dim chart1 As Chart
Set chart1 = Charts.Add
'H列グラフ化
chart1.SetSourceData Worksheets("Sheet1").Range(Cells(ROWINI, COLRUI), Cells(iend, COLRUI))
chart1.Ch...続きを読む

Aベストアンサー

>あとは、A列の日付をX軸に設定するだけ...
この手作業を[マクロの記録]すればある程度は判ります。
>chart1.SetSourceData Worksheets("Sheet1").Range(Cells(ROWINI, COLRUI), Cells(iend, COLRUI))
これを

With Worksheets("Sheet1")
  chart1.SetSourceData .Range(.Cells(ROWINI, COLRUI), .Cells(iend, COLRUI))
  chart1.SeriesCollection(1).XValues = .Range(.Cells(ROWINI, 1), .Cells(iend, 1))
End With

こんな感じに変更すれば良いです。
.Cells(ROWINI, COLRUI)が項目名だったら、.Cells(ROWINI, 1)は.Cells(ROWINI + 1, 1)としたほうが良いかも。

もしくは、最初にグラフ元範囲をRange型変数にSetします。

Dim rng As Range
With Worksheets("Sheet1")
  With .Range(.Cells(ROWINI, COLRUI), .Cells(iend, COLRUI))
    Set rng = Union(.Cells, .Offset(, -7))
  End With
End With
With Charts.Add
  .ChartType = xlLineStacked
  .SetSourceData rng
  .HasLegend = False
End With
Set rng = Nothing

こんな感じ。

>あとは、A列の日付をX軸に設定するだけ...
この手作業を[マクロの記録]すればある程度は判ります。
>chart1.SetSourceData Worksheets("Sheet1").Range(Cells(ROWINI, COLRUI), Cells(iend, COLRUI))
これを

With Worksheets("Sheet1")
  chart1.SetSourceData .Range(.Cells(ROWINI, COLRUI), .Cells(iend, COLRUI))
  chart1.SeriesCollection(1).XValues = .Range(.Cells(ROWINI, 1), .Cells(iend, 1))
End With

こんな感じに変更すれば良いです。
.Cells(ROWINI, COLRUI)が項目名だったら、...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング