こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Excel VBA グラフチャート名で指定するには

ExcelのVBAでグラフを作成した後
ActiveChartでアクティブなチャートを指定するのではなく
ActiveChart.Nameなどで取得したチャート名で指定するには
どのように記述すればよいでしょうか。

例えば、以下のtest()のコードの中の
ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows
ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone)
ActiveChart.PlotArea.Select
ActiveChart.Parent.Copy
の部分をActiveChartを使わずチャート名(chart_nameなど)で指定するには
どのように記述すればよいでしょうか。

よろしくお願いします。(Windows7,Excel2016)

---------------------------------------
Sub test()
 Dim chart_name As String
 ThisWorkbook.Worksheets("Sheet1").Select
 ThisWorkbook.Worksheets("Sheet1").Range("A1") = "A"
 ThisWorkbook.Worksheets("Sheet1").Range("A2") = "B"
 ThisWorkbook.Worksheets("Sheet1").Range("B1") = "75"
 ThisWorkbook.Worksheets("Sheet1").Range("B2") = "25"
 ThisWorkbook.Worksheets("Sheet1").Range("A10").Select
 ThisWorkbook.Worksheets("Sheet1").Shapes.AddChart2(297, xlBarStacked100).Select
 ThisWorkbook.Worksheets("Sheet1").Select
 ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows
 chart_name = ActiveChart.Name
 chart_name = Trim(Right(chart_name, Len(chart_name) - Len(ActiveSheet.Name)))
 ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).Activate
 ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone)
 ActiveChart.PlotArea.Select
 ActiveChart.Parent.Copy
End Sub

投稿日時 - 2019-03-14 14:16:47

QNo.9596767

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

>また、ActiveChart.Nameで"Sheet1 グラフ 1"が取得されますが

>chart_name = ActiveChart.Name
 chart_name = Trim(Right(chart_name, Len(chart_name) - Len(ActiveSheet.Name)))

このコードのままならchart_nameは空文字になりますね。

集合体は、次のような形で個々の要素を取り出せます。
dim obj as Object
for each obj in 集合体インスタンス名
if obj.Name = name then
MsgBox "発見"
end if
next
WorksheetsだろうがShapesだろうがChartObjectsだろうが同じです。

投稿日時 - 2019-03-15 18:51:41

お礼

>このコードのままならchart_nameは空文字になりますね。

こちらで、test()を実行すると、
chart_name = ActiveChart.Name で "Sheet1 グラフ 1" が取得されて
chart_name = Trim(Right(chart_name, Len(chart_name) - Len で
"グラフ 1"がされているのですが?
そちらでは、空白が取得されているということでしょうか?

>集合体は、次のような形で個々の要素を取り出せます。

取得の仕方は分かるのですが、その取得した値を使って、
どのように記述すればよいのかが分からないのです。
取得した値が"グラフ 1"だった場合、
どのように記述すればよいのか教えていただけないでしょうか。

具体的には、

回答No3で頂きました

>ActiveChartの代わりにThisWorkbook.Worksheets(sheet_name).ChartObjects(chart_name)を使えば良いだけです。

という回答に対して、下記のように直してみたけれども、
エラーになることをお伝えしましたが、
下記のコードで間違っていましたら、
正しいコードを教えていただけないでしょうか。

1)ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).Activate

2) ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).SetElement (msoElementPrimaryCategoryAxisNone)

3)ThisWorkbook.Worksheets("Sheet1").ChartObjects("グラフ 1").SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows

よろしくお願いします。

投稿日時 - 2019-03-18 09:16:15

ANo.3

>などは、ChartObjects(chart_name)が使えません。

それは当然です。
ChartObjectsは集合体を指していて、ActiveChartやChartObjects(chart_name)は集合体の中のメンバーを指しています。
集合体に「お前の家はどこだ」と聞いても答えがあるわけはなく、メンバーに「お前のメンバーxxは誰だ?」と聞いても答えはないでしょう?。

ActiveChartの代わりにThisWorkbook.Worksheets(sheet_name).ChartObjects(chart_name)を使えば良いだけです。

投稿日時 - 2019-03-15 10:54:33

お礼

>ActiveChartの代わりにThisWorkbook.Worksheets(sheet_name).ChartObjects(chart_name)を使えば良いだけです。

ActiveChartをThisWorkbook.Worksheets(sheet_name).ChartObjects(chart_name)に書き換えてみました。

ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).Activate

ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).SetElement (msoElementPrimaryCategoryAxisNone)

これらを実行すると、いずれも、
実行時エラー '-2147024809(80070057)':
指定した名前のアイテムが見つかりませんでした。
というエラーになります。

また、ActiveChart.Nameで"Sheet1 グラフ 1"が取得されますが
この場合、
ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows

ThisWorkbook.Worksheets("Sheet1").ChartObjects("グラフ 1").SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows
のようにしても同様のエラーになります。
この部分の具体的な正しいコードを教えていただけないでしょうか。

よろしくお願いします。

投稿日時 - 2019-03-15 12:07:44

ANo.2

http://officetanaka.net/excel/vba/graph/05.htm
に説明されています。
>名前は2つある
ChartオブジェクトのNameプロパティは値の取得のみ可能です。設定することはできません

投稿日時 - 2019-03-14 22:26:06

お礼

教えてほしかったことは、
ChartオブジェクトのNameプロパティの値の取得の仕方ではなくて
ActiveChartを使わずに記述する仕方です。
例えば、
ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone)
を、ActiveChartを使わず、"チャート1"という名前で指定するには、
どのように記述すればよいのでしょうか。

投稿日時 - 2019-03-15 08:07:56

ANo.1

>ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).Activate

ここで質問の内容をやっている

投稿日時 - 2019-03-14 18:57:48

お礼

ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).Activate
は、ChartObjects(chart_name)でできるのですが、
ActiveChart.SetSourceData Source:=Range("Sheet1!A1:B2"), PlotBy:=xlRows
ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone)
ActiveChart.PlotArea.Select
ActiveChart.Parent.Copy
などは、ChartObjects(chart_name)が使えません。
これらは、どのように記述すればよいのでしょうか。

投稿日時 - 2019-03-15 08:14:31

あなたにオススメの質問