• ベストアンサー

Excel VBA グラフオブジェクトの使用方法について

Excel2003のVBAについて教えて下さい。 以下の(1)~(4)のコードを用いて セル"A1"に設定された値をグラフスケール(最大値)に設定しようとしています。 (1) scaleData = Worksheets("シート1").Range("A1").Value (2) Set chartObj = ActiveSheet.ChartObjects(1) (3) Set chart1 = chartObj.Chart (4) chart1.Axes(xlValue).MaximumScale = scaleData グラフオブジェクト単体(グループ化しない)時は問題なく、グラフスケールの設定が行えたのですが、グラフオブジェクトやラベル、ボタンなどを結合すると、(3)で、以下のエラーメッセージが出て、グラフスケールの設定が行えません。 「WorksheetクラスのChartObjectsプロパティを取得できません。」 グループ化することにより、グラフオブジェクトの指定方法が異なるのでしょうか? 解決方法をご存知の方、教えて下さい。宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1さんと、表現が異なりますが、同じ事ですね。おまけ付きです。XL2000用です。 'シートモジュールの場合 Sub test() Me.Shapes("Group 4").GroupItems("Chart 1").DrawingObject.Chart.Axes(xlValue).MaximumScale = 2 End Sub 'おまけ グループ化された図形も含め、図形の名前リストアップ Sub test2() Dim shp As Shape For Each shp In Me.Shapes Debug.Print Me.Name & ":" & shp.Name If shp.Type = msoGroup Then Call test3(shp) Next shp End Sub Sub test3(shp As Shape) Dim shp2 As Shape For Each shp2 In shp.GroupItems Debug.Print shp.Name & ":" & shp2.Name If shp2.Type = msoGroup Then Call test3(shp2) Next shp2 End Sub

nori79
質問者

お礼

早速の回答ありがとうございます。 教えていただい方法で、グラフスケールの変更が行えました。 又、図形の名前のリストアッププログラムもありがとうございます。 シート上のオブジェクト名称を参照することができました。

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

>グループ化することにより、グラフオブジェクトの指定方法が異なるのでしょうか? マクロに行く前にまずワークシート画面上で,グループ化したグラフをちょんちょんと触ってみます。いつも通り「軸をWクリックして軸の書式設定を出す」とか出来ますか? 出来ませんね。 でも,多少コツは要りますがグラフオブジェクトの編集に上手く入り,そこから各部設定を編集することはちゃんとできますので,「グラフオブジェクトとしての操作」が出来ないわけでは勿論ありません。 で。 途中は飛ばして結論まで行くと,たとえば activesheet.groupobjects(1).shaperange.groupitems(1).drawingobject.chart.axes(xlvalue).maximumscale = 10 のように連結を丁寧に追っていけば操作できます。

nori79
質問者

お礼

早速の回答ありがとうございます。 教えていただい方法(コード)で、グラフスケールの変更が行えました。 >多少コツは要りますがグラフオブジェクトの編集に上手く入り 小生のやり方が悪いのだと思いますが、グラフオブジェクトの編集は行えませんでした。(コツをつかめませんでした..)

関連するQ&A

  • 任意にデータの範囲を選択し、グラフを描画したい

    質問を閲覧していただきありがとうございます。 できればみなさんのお力を貸していただきたいことがあり、質問しました。 以下にマクロ作成に用いたプログラムの仕様とコードを貼りますので、ご指摘等いただけましたら幸いです。 まず、今回のマクロの目的は ・既に存在するエクセルデータから、x軸、y軸のデータ列の長さに応じたグラフを描画するVBプログラムを書く事 です。 ・可能ならば、既存のふたつのグラフを結合したものを新しく表示する ※データシートの画像は添付しましたのでご覧ください。 以上のふたつとなります。 理想形としては、 A2 ~ A1025までをx軸のデータ、B2~B1025までの実データ値としたグラフAを一つ D2 ~ E1025までをx軸のデータ、E2~E1025までの実データ値としたグラフBを一つ 上記二つのグラフを結合したグラフを一つ の3つのグラフが自動的に作成され、エクセルファイル上に表示されている といったような感じです。 私の書いたコードの問題点としては、 ・グラフAグラフBともに「x軸と実データが正しく対応していない」 →本来両方のグラフにおいてはグラフの右端まで折れ線グラフが続いているはずですが、x軸の値にして約1000の所でデータが終わってしまっています。 ・グラフBでは、D2 ~ D344, E2 ~ E344 を基にしたグラフ一つのみが描画されているはずですが、ここには何故か二つ以上の折れ線グラフがあるようにみえ、グラフB右には系列1~5までがあるように書かれています。(理想としては5個ではなく実データを示すもの一つのみ) ・ふたつのグラフの結合方法が不明 という感じです。 以下にプログラムを貼ります。 お時間ありましたら、ご指摘の程宜しくお願い致します。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub グラフ描画() chart_title1 = "グラフA" chart_title2 = "グラフB" '軸のタイトル x_title = "周波数[Hz]" y_title = "パワー" ' -------------------------グラフ作成---------------------- ' グラフを描画 Dim chartObj1 As ChartObject Set chartObj1 = ActiveSheet.ChartObjects.Add(1, 1, 300, 200) With chartObj1.Chart ' データ範囲をセット .SetSourceData Source:=Range(Range("B2"), _ Cells(2, 1).End(xlDown)) ' x軸の項目軸範囲をセット .SeriesCollection(1).XValues = Range(Range("A2"), _ Cells(1, 1).End(xlDown)) ' オプションをセット .ChartType = xlXYScatterSmoothNoMarkers ' 散布図 .HasTitle = True .ChartTitle.Characters.Text = chart_title .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = x_title .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = y_title ' x軸の最大値、最小値設定 .Axes(xlCategory, xlPrimary).MinimumScale = 0 .Axes(xlCategory, xlPrimary).MaximumScale = 4500 ' y軸の最大値、最小値設定 .Axes(xlValue).MinimumScale = -10 .Axes(xlValue).MaximumScale = 3 End With Dim chartObj2 As ChartObject Set chartObj2 = ActiveSheet.ChartObjects.Add(1, 320, 300, 200) With chartObj2.Chart ' データ範囲をセット .SetSourceData Source:=Range(Range("E2"), _ Cells(2, 1).End(xlDown)) ' x軸の項目軸範囲をセット .SeriesCollection(1).XValues = Range(Range("D2"), _ Cells(1, 1).End(xlDown)) ' オプションをセット .ChartType = xlXYScatterSmoothNoMarkers ' 散布図 .HasTitle = True .ChartTitle.Characters.Text = chart_title .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = x_title .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = y_title ' x軸の最大値、最小値設定 .Axes(xlCategory, xlPrimary).MinimumScale = 0 .Axes(xlCategory, xlPrimary).MaximumScale = 4500 ' y軸の最大値、最小値設定 .Axes(xlValue).MinimumScale = -10 .Axes(xlValue).MaximumScale = 3 End With End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • 横軸ラベルの追加に関するエラー(VBA)

    マクロの記録にて、グラフに横軸ラベルの追加を記録したところ 以下のようなコードになりました。 ActiveSheet.ChartObjects("グラフ 30").Activate ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "μsec" これと同じことをVBAのコードから実行しようとしたのですが、  ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "μsec" の行にて"オブジェクトが必要です"というエラーがでました。 何のオブジェクトが足りないのでしょうか? ActiveSheet.ChartObjects("グラフ 30").Activate にて チャートオブジェクトは指定されているので、チャートオブジェクトでは無いと思うのですが・・

  • 現在、エクセルで、選択したグラフの大きさや縦横軸を統一するマクロを作成

    現在、エクセルで、選択したグラフの大きさや縦横軸を統一するマクロを作成中です。 以下のようなマクロまでは作ることができましたが、ひとつだけ不満があります。 それは、初期値です。 できれば、最初に選択したグラフの設定を初期としてダイアログの入力欄に記入してある状態にしたいのですが、どうすればよいかわかりません。 知恵を貸してください!! よろしくお願いいたします!!! Sub 選択したグラフ縦横軸変更() Dim chartObj As ChartObject Dim myObj As Object Dim xmin As Double Dim xmax As Double Dim ymin As Double Dim ymax As Double xmin = Application.InputBox("x軸最小値") xmax = Application.InputBox("x軸最大値") ymin = Application.InputBox("y軸最小値") ymax = Application.InputBox("y軸最大値") For Each myObj In Selection Set chartObj = ActiveSheet.ChartObjects(myObj.Name) With chartObj.Chart.Axes(xlCategory) .MaximumScale = xmax .MinimumScale = xmin End With With chartObj.Chart.Axes(xlValue) .MaximumScale = ymax .MinimumScale = ymin End With Next myObj End Sub

  • EXCEL VBA:埋め込みグラフオブジェクトの命名方法について (続き1)

    http://oshiete1.goo.ne.jp/qa3258443.html の質問の続きです。 ------------------------------------------------------------- Sub sample() Dim myRange As Range Set myRange = Range("A1:D2") With Worksheets("Sheet1").ChartObjects.Add(50, 50, 300, 200).Chart .ChartType = xlPie .SetSourceData Source:=myRange, PlotBy:=xlRows .ApplyDataLabels Type:=xlDataLabelsShowLabelAndPercent, LegendKey:=False, HasLeaderLines:=True End With End Sub ------------------------------------------------------------- この手法でグラフ作成した場合について、 1. グラフ作成時に以下と同じように NumberFormatLocal を設定する方法はありますか? (通常の記述例) ActiveChart.SeriesCollection(1).DataLabels.Select Selection.NumberFormatLocal = "0.0%" といいますのは、現在作成しているマクロはユーザーの操作によっては 円グラフと棒グラフが順不同に作成される場合があり、 SeriesCollection の INDEX番号 が分からない場合があるためです。 または、グラフの名前等を指定することなどにより、 SeriesCollection の INDEX番号 を取得する事が可能でしたら その方法を教えて頂きたいのですが・・・。 2. 同じく、グラフ作成時にデータラベルのフォントを設定する方法はありますか? (通常の記述例) With Selection.Font .Name = "MS Pゴシック" .Size = 10 End With 3. 同じく、横棒グラフ作成時に、以下と同じ事はできますか? '反転 ActiveChart.Axes(xlCategory).Crosses = xlMaximum ActiveChart.Axes(xlCategory).ReversePlotOrder = True '横軸100% ActiveChart.Axes(xlValue).MaximumScale = 1 以上、何卒ご教授のほど、よろしくお願い致します。

  • ExcelのVBAの保護をかけた時のグラフについて教えてください。

    グラフにタイトルを設定した後、保護をかけると「ChatクラスのHasTitleプロパティを設定できません」といわれてしまい、.HasTitle=Trueで止まってしまいました。シートの保護をかけても動くようにしたいのですが、どうしたらよいのでしょうか。 (保護しなければ通常に動きます。) 'グラフをオブジェクトで配置 set chartObj=worksheets("Sheet1").ChartObjects.Add(200,0,300,200) chartObj.Chart.SetSourceData Worksheets("Sheet1").range(range("b4").End(xlDown),ActiveCell.end(xlToright)) 'タイトルをつける with worksheets("Sheet1").ChartObjects(1).Chart .HasTitle=True .ChartTitle.Text="タイトル" End with 保護をかけてもグラフの作成ができるのに、タイトル部分で止まってしまうのはなぜでしょうか。 よろしくお願い致します。

  • VBA 全グラフに適応されない理由

    お世話になっております。 Excel2003を使用しております。 1400個のグラフを自動作成しております。 -------------------------------- Function GlaphSetting() 'グラフ色などの設定 Dim C As ChartObject On Error Resume Next For Each C In ActiveSheet.ChartObjects ' C.RoundedCorners = True C.Chart.AutoScaling = False C.Chart.PlotArea.Interior.ColorIndex = xlNone C.Chart.PlotArea.Border.ColorIndex = xlNone 'プロットエリアの色を消す C.Chart.Axes(xlValue).MaximumScale = 5 'メモリ最大値 C.Chart.Axes(xlValue).MinimumScale = 0 'メモリ最小値 C.Chart.Axes(xlValue).MajorUnit = 1 'メモリ間隔 If ComboBox4.Text <> "" Then '氏名が入ってると、メモリ-1にしたい! C.Chart.Axes(xlValue).MinimumScale = -1 'メモリ最小値 C.Chart.PlotArea.Top = 50 C.Chart.PlotArea.Width = 100 C.Chart.PlotArea.Height = 100 C.Chart.PlotArea.Left = 50 End If If ComboBox4.Text = "" Then '氏名が空のとき C.Chart.Axes(xlValue).HasMajorGridlines = False End If C.Chart.ChartArea.Font.Size = 8 '全部のフォントサイズ Next End Function ---------------------------- 上記方法でフォントサイズの設定等を行っているのですが、 全グラフの文字サイズが8になっていなく、 ActiveSheet.ChartObjectsの個数は制限があるのか?なんて思っております。 間にプログレスバーの表示を行っておりますが、 しっかり全部動いているみたいであり、 1400個中、33個目くらいまでしか フォントサイズが変わっておりません。 ステップインで確認してみましたが、 ステップインだと33個以上も大丈夫な気がします。 何か、理由をご存知の方がいらっしゃいましたら 回答をお願い致します。

  • [VBA]グラフを作りたいです!(^-^v

    教えて下さい。 テキストファイルの内容を元に自動的グラフを作りたいです。 【C:\Temp\data.csv】の中身 ----------------------------------- 1回目,10.50% 2回目,30.45% 3回目,70.45% ----------------------------------- 横軸には「n回目」の文字列を、縦軸には「n%」数値を入れたいです。 なんとか静的にグラフを作ることは出来ましたが、これを自動化したいと思っています。 【サンプルvba】 ----------------------------------- Private Const LOGFILE = "C:\Temp\data.csv" Private Sub CommandButton1_Click() ' グラフオブジェクト作成(位置,サイズ) With Sheet1.ChartObjects.Add(10, 50, 400, 150).Chart .ChartType = xlLine ' 折れ線グラフ .Axes(xlValue).MaximumScale = 100 ' 縦軸最大値 .Axes(xlValue).MinimumScale = 0 ' 縦軸最小値 ' グラフデータ内容 With .SeriesCollection.NewSeries ' グラフ名 .Name = "テスト" ' 縦軸 (ここに%数値を入れたい) .Values = "={10.50,30.45,70.45}" ' 横軸 (ここに回数を入れたい) .XValues = "={""1回目"",""2回目"",""3回目""}" End With End With End Sub ----------------------------------- テキストファイルの内容は一定間隔で更新されるため自動的に取り込みたいです。 すいませんがよろしくおねがいします、、。(T▽T)ノ

  • エクセルのマクロで教えてください。仕事で、種類の異なる20個のグラフを

    エクセルのマクロで教えてください。仕事で、種類の異なる20個のグラフを一つのシートに作成しますが、2個だけ内容が異なるグラフになってします この20個の散布図グラフで、クリックして選択したグラフだけ、y軸の目盛を自動スケールで最大値、最少値、目盛間隔の分割数は5個に自動にできないでしょうか? このサイトなどいくつか調べて、以下でアクティブシートのすべてのグラフ(20個)をセルに入力された値に一括で変更することはできるのですが、クリックして選択したグラフだけ、上記のようにできません。よろしくお願いします。 Sub 全部() Dim co As ChartObject For Each co In ActiveSheet.ChartObjects With co.Chart With .Axes(xlValue) .MinimumScale = Range("A1").Value '最小値 .MaximumScale = Range("A2").Value '最大値 .MajorUnit = Sheets("Sheet1").Range("A3") '目盛間隔 End With End With Next End Sub

  • グラフの削除をExcelVBAで行う

    こんばんは。同じシートの中にグラフを3つ作成し、 コマンドボタンを押すとグラフを削除し、新しいグラフを作成するようにしたいのですが、グラフの3つ目を削除のしようとするとエラーが発生してしまいます。 2つ目までは順調に消えるのですが、3つ目のグラフが削除されないのはなぜなのでしょうか。 色々教えていただき何とか形になってきたのですが、確認すると色々とぼろがでてきてしまい、困っています。 どなたか教えていただけないでしょうか。 宜しくお願い致します。 Sub Glafu() Dim chartobj As ChartObject Worksheets("ABC").Activate ActiveSheet.ChartObjects(1).Delete ActiveSheet.ChartObjects(2).Delete ActiveSheet.ChartObjects(3).Delete Set chartobj = Worksheets("ABC").ChartObjects.Add(600, 0, 300, 200) chartobj.Chart.SetSourceData Worksheets("ABC").Range(Range("b2").End(xlDown), ActiveCell.End(xlToRight)) With Worksheets("ABC").ChartObjects(1).Chart .HasTitle = True .charttaitle.Text = "タイトル1" End With Set chartobj = Worksheets("ABC").ChartObjects.Add(600, 200, 300, 200) chartobj.Chart.SetSourceData Worksheets("ABC").Range(Range("e2").End(xlDown), ActiveCell.End(xlToRight)) With Worksheets("ABC").ChartObjects(1).Chart .HasTitle = True .charttaitle.Text = "タイトル2" End With Set chartobj = Worksheets("ABC").ChartObjects.Add(600, 400, 300, 200) chartobj.Chart.SetSourceData Worksheets("ABC").Range(Range("h2").End(xlDown), ActiveCell.End(xlToRight)) With Worksheets("ABC").ChartObjects(1).Chart .HasTitle = True .charttaitle.Text = "タイトル3" End With End Sub

  • Excel グラフ自動作成が遅い VBA

    いつもお世話になっております。 今回は、大量のグラフを作る際に動作が異常に遅いため質問させて頂きました。 http://okwave.jp/qa/q8384381.html 下記リンクにあるように、グラフを作成しています。 Function GlaphSetting() 'グラフ色などの設定 Dim C As ChartObject On Error Resume Next For Each C In ActiveSheet.ChartObjects C.Chart.Axes(xlCategory).TickLabels.Orientation = xlVertical '縦書き調整 C.Chart.ChartGroups.GapWidth = 70 '幅を70に C.Chart.ChartArea.Font.Size = 9 '全部のフォントサイズ C.Chart.PlotArea.Interior.ColorIndex = xlNone 'プロットエリア色なし C.Chart.PlotArea.Border.ColorIndex = xlNone '枠線なし C.Chart.Axes(xlValue).HasMajorGridlines = False 'メモリ見えなくする C.Chart.Axes(xlValue).MinimumScale = 0 'メモリ最小値 Next End Function 実行すると、データ量により物凄く遅くなります。 (グラフの数は14、項目数52)※今のところの最大量 実行すると、5分程度はかかるでしょうか・・・ ためしにメッセージボックスを使い、 ストップウォッチで計ってみました。 データ処理     :2秒 その他の処理   :2秒 グラフ作成処理  :1分12秒 グラフの編集    :4秒 でした。 グラフの作成処理をどうにか早くできないでしょうか? 回答よろしくお願い致します。

専門家に質問してみよう