• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA(excel)でグラフのデータ範囲の取得)

VBA(excel)でグラフのデータ範囲を取得する方法

このQ&Aのポイント
  • VBAを利用してExcelのグラフのデータ範囲を取得する方法について教えてください。
  • Excel2010で種類が3D等高線グラフのグラフが書いてあり、そのグラフの元になるデータ範囲を取得したいです。
  • 具体的には、範囲'A1:D10'を取得して変数に代入する方法や、矩形範囲の行数と列数を取得する方法について教えてください。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

Sub test()   Dim filed() As String   Dim ret()  As String   Dim v()   As String   Dim s()   As String   Dim cnt   As Long   Dim cx   As Long   Dim ub   As Long   Dim n    As Long   Dim i    As Long   Dim j    As Long   Dim k    As Long   Dim buf   If ActiveChart Is Nothing Then     MsgBox "グラフを選択して実行"     Exit Sub   End If   '項目名セット   filed() = Split("name category_labels values order size")   With ActiveChart     'BubbleChartの時     If (.ChartType = xlBubble) Or (.ChartType = xlBubble3DEffect) Then       cx = 4     Else       cx = 3     End If     'アドレス文字格納配列サイズ決定     cnt = .SeriesCollection.Count     ReDim ret(0 To cnt, 0 To cx)     For i = 0 To cx       ret(0, i) = filed(i)     Next     '系列をLoop     For i = 1 To cnt       v = Split(.SeriesCollection(i).Formula, ",")       ub = UBound(v)       '右端の")"を除外       v(ub) = Left$(v(ub), Len(v(ub)) - 1)       '左端の"=SERIES("除外       ret(i, 0) = Mid$(v(0), 9)       n = 1       For j = 1 To cx         '隔範囲のアドレスを考慮         If Left$(v(n), 1) = "(" Then           ReDim s(1 To ub) As String           For k = 1 To ub             s(k) = v(n)             n = n + 1             If Right$(s(k), 1) = ")" Then Exit For           Next           ReDim Preserve s(1 To k)           ret(i, j) = Join(s, ",")         Else           ret(i, j) = v(n)           n = n + 1         End If       Next       buf = Application.Index(ret, i + 1, 0)       Debug.Print "系列 " & i, Join(buf, ",")     Next   End With   '新規シートに書き出す時。   'Sheets.Add.Range("A1").Resize(cnt + 1, cx + 1).Value = ret   Erase s, ret End Sub こんな感じのは昔書いたことありますが とにかくデータ範囲をRangeに取得するだけなら Formula文字列を整理すれば簡単そう。 Sub try2()   Dim r As Range   If Not ActiveChart Is Nothing Then     Call GetChartSourceRange(ActiveChart, r)     Application.Goto r     MsgBox r.Address(external:=True)   End If End Sub '----------------------------------------------------------- Sub GetChartSourceRange(ByRef c As Chart, ByRef ret As Range)   Dim r() As Range   Dim s  As String   Dim n  As Long   Dim i  As Long   n = c.SeriesCollection.Count   ReDim r(1 To n)   For i = 1 To n     s = Mid$(c.SeriesCollection(i).Formula, 8)     s = Replace(s, ",,", ",")     s = Replace(s, "," & i & ",", ",")     s = Replace(s, "," & i & ")", ")")     s = "(" & Mid$(s, InStr(s, ",") + 1)     Set r(i) = Range(s)   Next   Set ret = r(1)   For i = 2 To n     Set ret = Union(ret, r(i))   Next   Erase r End Sub あらゆるケースに対応できるわけではないですけれども。

tsumuji
質問者

お礼

end-u様 二度目のご回答、感謝いたします 丁寧に記述いただきまして恐縮です 勉強してみます。 ベストアンサーとさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

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

>グラフの現在のデータ範囲の矩形範囲 あなたが作成しようとしているグラフは確かに矩形範囲ですが、エクセルでは飛び飛びのセル範囲からも、また系列ごとに個数が違うグラフも描けますので、「全体としての元データ範囲」を取得する方法はありません。 とりあえず簡単には activechart.seriescollection.count と ubound(activechart.seriescollection(1).xvalues) end sub といったところと思います。

tsumuji
質問者

お礼

早速のご回答を  どうも 有難うございます。 やはり、結構、難解にならざるを得ないのですね・・・ 私の頭で理解するのに時間がかかりそうなので コードを勉強させていただきますね。

全文を見る
すると、全ての回答が全文表示されます。
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

残念ながら、 >Formulaプロパティで系列ごとに取得していく方法 です。Range型変数に代入するところはおまけです。 当方も最近、同様の事を思っておりました。もっと簡便な方法があるなら、是非知りたいです。 Sub test() Dim mychartObj As ChartObject Dim mySeries As Series Dim dataRange As Range Set mychartObj = ActiveSheet.ChartObjects(1) For Each mySeries In mychartObj.Chart.SeriesCollection Debug.Print Split(Split(mySeries.Formula, ",")(2), "!")(1) Set dataRange = Worksheets(Split(Split(mySeries.Formula, ",")(2), "!")(0)).Range(Split(Split(mySeries.Formula, ",")(2), "!")(1)) Debug.Print dataRange.Parent.Name, dataRange.Address Next mySeries End Sub 縦横の行数の取得なら、上記コードで Debug.Print UBound(mySeries.XValues), UBound(mySeries.Values) でできますが、こういう事で良いのでしょうか。

tsumuji
質問者

お礼

早速のご回答を  どうも 有難うございます。 やはり、結構、難解にならざるを得ないのですね・・・ 私の頭で理解するのに時間がかかりそうなので コードを勉強させていただきますね。

全文を見る
すると、全ての回答が全文表示されます。
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

とりあえずActiveChartに対して処理するサンプル。 DataObjectを使う為、VBE-[ツール]-[参照設定]で 「Microsoft Forms 2.0 Object Library」にチェックする必要があります。 Sub try()   '■参照設定:Microsoft Forms 2.0 Object Library   Dim r As Range   If Not ActiveChart Is Nothing Then     SendKeys "^c{esc}"     Application.Dialogs(xlDialogChartSourceData).Show     On Error Resume Next     With New DataObject       .GetFromClipboard       Set r = Range(.GetText)     End With     On Error GoTo 0     If Not r Is Nothing Then MsgBox r.Address(external:=True)   End If End Sub SendKeys使ってますから邪道で危ういし。 それに『データの選択』ダイアログに表示されない複雑なSourceDataの場合は取得できません。 素直に系列をLoopして取得したほうがスマートっぽく見えます。

tsumuji
質問者

お礼

早速のご回答を  どうも 有難うございます。 やはり、結構、難解にならざるを得ないのですね・・・ 私の頭で理解するのに時間がかかりそうなので コードを勉強させていただきますね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel:指定したデータ範囲を可変的に取得する方法。

    Excel:指定したデータ範囲を可変的に取得する方法。 現在、個人の労働時間の昨年度と今年度を月ごとに比較するグラフを作っています。 一人ひとりのグラフを新規シートに追加していくのですが、人数が多いのでこれをマクロに したいのです。 【sheet1の表(元データ)】 (A) (B) (C) (D) (E) (F) (G) (P) (1)      1月  2月  3月  4月・・・12月 (2) 1 社員A 20期 20 15.5 22.75 12 27.2 (3)    21期 12 12 26 10 13 (4) 2 社員B 20期 : : : : : (5)    21期 (6) 3 社員C 20期 (7)    21期 (8) 4 社員D 20期      21期 : : 【作りたいマクロ】 例)A2のセル[1]を選択して実行すると、社員Aのデータ範囲(B2~P3までと一行目の月単位行)を グラフ化し、新規シートに追加する。 ・上記例を他社員のデータ範囲にも使えるようにデータ範囲を可変的にしたい。 ・できればそのマクロをボタン化して、A列にそれぞれボタンを挿入したい。 ※A4[2]セルのボタンを押すと、社員Bのグラフが作成される。 下記にわかるところまでのコードを記します。(vba初心者で拙いコードですがお許しください) Sub Macro1() Range(Cells(1, 2), Cells(1, 18)).Select '1月~月平均の列 Range(Cells(2, 2), Cells(3, 18)).Select 'グラフ化する範囲 Cells(2, 2).Activate ActiveSheet.Shapes.AddChart.Select 'グラフ追加 'グラフデータの範囲設定 ActiveChart.SetSourceData Source:=Worksheets("Sheet1").Range(Worksheets("Sheet1").Cells(1, 2), Worksheets("Sheet1").Cells(1, 18)) ActiveChart.SetSourceData Source:=Worksheets("Sheet1").Range(Worksheets("Sheet1").Cells(2, 2), Worksheets("Sheet1").Cells(3, 18)) ActiveChart.ChartType = xlColumnClustered ActiveChart.ApplyLayout (5) ActiveChart.Location Where:=xlLocationAsNewSheet, name:="グラフ" ActiveSheet.Move after:=Worksheets("Sheet1") Sheets("Sheet1").Select End Sub 上記のコードだと範囲指定しているため社員Aのグラフしか作成できません。 範囲を可変的にするために変数を使おうと考えているのですが、 どのように書いてよいのか混乱してしまって・・・ 皆様にご教授願いたいと思いましてこちらに質問させていただきました。 長文および読み辛くなってしまい申し訳ありません。 どうかよろしくお願いいたします。

  • VBAでグラフ作成

    過去のログから色々探したのですが、原因が分かりません。お願いいたします。 エクセルのグラフの元データの範囲を ActiveChart.SetSourceData Source:=Sheets(\"sheet1\").Range(\"J11:M35\"), PlotBy:=xlColumns から ActiveChart.SetSourceData Source:=Sheets(\"sheet1\").Range(Cells(11, 10), Cells(35, 13)), PlotBy:=xlColumns に書き換えたら動かなくなってしまいました。 ナゼでしょうか? すいません、初歩で、、。お願いいたします。

  • VBAでグラフ作成

    過去のログから色々探したのですが、原因が分かりません。お願いいたします。 エクセルのグラフの元データの範囲を ActiveChart.SetSourceData Source:=Sheets("sheet1").Range("J11:M35"), PlotBy:=xlColumns から ActiveChart.SetSourceData Source:=Sheets("sheet1").Range(Cells(11, 10), Cells(35, 13)), PlotBy:=xlColumns に書き換えたら動かなくなってしまいました。 ナゼでしょうか? すいません、初歩で、、。お願いいたします。

  • Excel VBAでグラフの可変データ範囲の取得方法

    Excel2003を使用しています。 ExcelのVBAでグラフ作成のマクロを作る際に、 取得するデータの行数が可変だった場合にどうすればいいのか知りたいです。 現在は取得するデータの範囲を以下の様に取ってきています。 ActiveChart.SetSourceData Source:=Sheets("シート名").Range("B1:C5000"), PlotBy:=xlColumns ここで、データの範囲("B1:C5000")が可変だった場合のデータ範囲の取得方法を知りたいです。 例えば、("B1:C7000")や("B1:C10000")など。 具体的には"B1"のセルを選択して、 [Ctrl & Shift]を押しながら "→"、"↓" と操作を行なったときに選択される範囲をグラフのデータとして使用したいです。 途中、空白セルはない前提でかまいません。 データの終端を取得する「Endプロパティ」なるものが存在するようですが、 これを使用するのでしょうか? それとも別の方法があるのか・・・? 宜しくお願いします。

  • グラフの範囲指定をVBAで可変にしたい

    1シートに複数のグラフがあり、値を入れて完成させているファイルがあります。 データ範囲が毎回違うため、いちいちグラフを選択し、範囲を変更しています。 系列:行 データ範囲:A列から~H列までだったり、A列からJ列までだったりします データがH列までの場合はI列は値が入っていませんが、L列からまた他のグラフのデータ範囲になっているという形です。 データが始まる位置はすべて固定です。 シートにある複数のグラフを一度に変更したいのですが、どのようにしたら良いのでしょうか? (選択しているグラフのグラフ変更ではなく、選択していないものも変更したい) 以下のようなマクロを仮で組んでみたのですが、うまく動きません。 よろしくお願いします。 Sub グラフ範囲変更() Dim lastcolumn As Integer lastcolumn = Range("A2").End(xlToRight).Column ActiveChart.SetSourceData Source:=Range(Cells(1, 1), Cells(1, lastcolumn)) End Sub

  • エクセルVBAでグラフの範囲を設定する方法

    お世話になっています。 グラフ自体は、作成済みのものを使用して、データの範囲だけを 変更させる方法を考えています。 A列に、データが入っている範囲を選択して、選択したセル範囲を グラフのデータ範囲としたいと思います。 現在、作成したプログラムは以下のものです。 当たり前なんでしょうが、以下のものではエラーになります。 Loopコマンドで、アクティブになったセルをグラフのデータ範囲に 設定する方法を教えてください。 よろしくお願いします。 Sub グラフ作成() ' Dim 範囲 As String Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate Loop ActiveCell.Offset(-1, 0).Activate Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlUp)).Select   範囲 = ActiveCell ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.SetSourceData Source:=Range(範囲) End Sub

  • 2本ある折れ線グラフの範囲をVBAで更新したい

    2本ある折れ線グラフの範囲をVBAで更新したいと考えております。 excel2003を使っています。 グラフ1の中に系統がひとつなら以下の内容でうまくいきますが、2本ある場合どうすれば 良いか分からず困っております。 Sub サンプル() Dim myPicture As StdPicture Dim buf As String Dim myR With Worksheets("Sheet1") myR = Application.WorksheetFunction.Count(Worksheets("Sheet1").Range("A5:A100")) End With row1 = "5" row2 = myR col1 = "A" Sheets("Sheet2").Activate ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.ChartArea.Select ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range(col1 & row1 & ":" & col1 & row2 + 4), PlotBy:=xlColumns End Sub 系統を増やした場合の書き方をどなたかお教え頂けませんか。 どうぞ、よろしくお願い致します。

  • グラフ可変範囲のデータ設定

    環境Excel2002です グラフ 1が棒グラフ2個、折れ線グラフ1個で作成されています Sheets("支社")に8支社のデータがあります グラフシートは1Sheetにしたいので グラフシートで支社を選択することにより Sheets("支社")の該当支社のグラフデータを取得します そうすると、グラフデータは可変範囲で設定することになります そのVBAが下記です ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.SeriesCollection(1).Select With ActiveChart.SeriesCollection(1) .XValues = Sheets("支社").Range(Cells(497, i), Cells(497, i + 12)) .Values = Sheets("支社").Range(Cells(497, i + 1), Cells(497, i + 12)) End With .XValues = Sheets("支社").Range(Cells(497, i), Cells(497, i + 12)) のところで実行時エラー1004がでてしまいます エラー回避方法を教えてください

  • VBA 選択しているデータでグラフを書きたい

    自分で選択している範囲を使ってグラフを書きたいのですが、 以下のコードに何と書けばよいのでしょうか? Selection.Addressと書くとエラーが出ます。 ActiveChart.SetSourceData Source:=”選択しているデータを使用する”

  • グラフ作成

    グラフ作成のマクロを作りたくて、マクロの記憶を用いて試してみたのですが、うまくいかないので、もしよろしければおしえてください。 選択範囲をアルファベットを用いたものではなく、cells(k,i)で表したいと思っています。 <マクロ> Charts.Add ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=Sheets("元データ").Range( _ "A1:B1,A927:B987,Y1:Z1,Y927:Z987"), PlotBy:=xlColumns ’←このグラフ範囲をcells(,)の形式にしたい。 ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet3" どうぞよろしくお願いします。

このQ&Aのポイント
  • PCを立ち上げると「サインインプロセス初期化エラー 」のメッセージが表示される
  • Windowsキーも反応しない状態になる
  • 解決方法を教えてください
回答を見る

専門家に質問してみよう