- 締切済み
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
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- unokwave
- ベストアンサー率58% (966/1654)
>また、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だろうが同じです。
- unokwave
- ベストアンサー率58% (966/1654)
>などは、ChartObjects(chart_name)が使えません。 それは当然です。 ChartObjectsは集合体を指していて、ActiveChartやChartObjects(chart_name)は集合体の中のメンバーを指しています。 集合体に「お前の家はどこだ」と聞いても答えがあるわけはなく、メンバーに「お前のメンバーxxは誰だ?」と聞いても答えはないでしょう?。 ActiveChartの代わりにThisWorkbook.Worksheets(sheet_name).ChartObjects(chart_name)を使えば良いだけです。
お礼
>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 のようにしても同様のエラーになります。 この部分の具体的な正しいコードを教えていただけないでしょうか。 よろしくお願いします。
- imogasi
- ベストアンサー率27% (4737/17069)
http://officetanaka.net/excel/vba/graph/05.htm に説明されています。 >名前は2つある ChartオブジェクトのNameプロパティは値の取得のみ可能です。設定することはできません
お礼
教えてほしかったことは、 ChartオブジェクトのNameプロパティの値の取得の仕方ではなくて ActiveChartを使わずに記述する仕方です。 例えば、 ActiveChart.SetElement (msoElementPrimaryCategoryAxisNone) を、ActiveChartを使わず、"チャート1"という名前で指定するには、 どのように記述すればよいのでしょうか。
- unokwave
- ベストアンサー率58% (966/1654)
>ThisWorkbook.Worksheets("Sheet1").ChartObjects(chart_name).Activate ここで質問の内容をやっている
お礼
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)が使えません。 これらは、どのように記述すればよいのでしょうか。
お礼
>このコードのままなら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 よろしくお願いします。