ママのスキンケアのお悩みにおすすめアイテム

縦にデータが70列ほど並んだエクセルシートに関して,そのうち1列目と2列目を参照したグラフを書いています.
Excel VBAでマクロをつくり,クリックひとつで2列目の参照が3列目へ,そしてもう一度クリックすると3列目の参照が4列目へと遷移させてグラフの変化を確認したいのですが,VBA初心者のためやり方がわかりません.

クリック1回でグラフの参照を1列ずらすようなマクロの作り方がわからなかったため,今は最後の列の隣(71列目)に2列目をコピーするようにして,グラフの参照は1列目と71列目にしています.
しかしこのようにしてもRange内に変数を入れてはいけないせいなのか,エラー(Rangeメソッドは失敗しました:Globalオブジェクト)と表示されて全く動きません.
現在書いているコードは以下のとおりです.

Sub change_graph()
'
' change_graph Macro
' マクロ記録日 : 2009/12/15 ユーザー名 : ABC
'

'
Dim cCnt As Long
Dim myAddress As String

ActiveCell.Offset(0, 1).Range("A1:A914").Select
myAddress = ActiveCell.Address
cCnt = Range("& myAddress:$W$61").Columns.Count
Selection.Copy
ActiveCell.Offset(0, cCnt - 1).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(0, -(cCnt - 1)).Range("A1").Activate

End Sub

よろしければ
(1)そもそもグラフの参照を1列ずつ変化させるやり方
(2)上記コードの誤り
を教えていただけないでしょうか?
よろしくお願いいたします.

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

A 回答 (5件)

(1)


下記のようなコードで、マクロ実行の度に、元のデータが1列オフセットします。
グラフを選択しておいてマクロを実行してみてください。

上手くいかない場合、プロットされている棒?(あるいは折れ線?)を選択し、数式バーに表示されるSERIES式を教えてください。

あと、最終列がプロットされている場合はどうしますか?
最初の列に戻る?
それともそのままマクロを終了する?

Dim fomla As Variant
Dim ws As String

fomla = Split(ActiveChart.SeriesCollection(1).Formula, ",")
ws = Split(Split(fomla(0), "(")(1), "!")(0)

With ActiveChart.SeriesCollection(1)
.Name = "=" & ws & "!" & Range(Split(fomla(0), "(")(1)).Offset(, 1).Address
.Values = Sheets(ws).Range(fomla(2)).Offset(, 1)
End With

最終的にグラフオブジェクトに「マクロの登録」すればどうでしょうか。
グラフをクリックでマクロが実行されるようになると思います。
その場合少し手直しが必要です。

(2)
目についたところ
未確認ですが
cCnt = Range("& myAddress:$W$61").Columns.Count

cCnt = Range(myAddress & ":$W$61").Columns.Count
でどうなるでしょうか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます.

(2)に関して,修正してみたところ完成しました.ありがとうございます.

(1)に関して,散布図を選択したときに数式バーに表示されるSERIES式は以下のとおりです.

=SERIES(,シート名!$A$61:$A$974,シート!$B$61:$B$974,1)

教えていただいた数式の内容をまだ理解できていないためそのままコピーアンドペーストしたのですが,

実行時エラー'91':
オブジェクト変数またはWithブロック変数が設定されていません

と表示されてエラーになってしまいます.どこを修正すればこのコードが有効になるかを教えていただけると幸いです.

お礼日時:2009/12/17 20:02

もし、グラフを選択していても同じエラーが発生する場合、シートが1つしかない状況かもしれません。


実は2003以前では1シートのみのシート上グラフのSERIES関数は、[Book名.xls]が付いてるんです。
(数式バーには出てこない。Formulaプロパティで取得した場合)
いずれにしても、Range(fomla(2))でシート名込みでRagneを指定してますから、Sheets(ws). が不要になります。

ActiveChart.SeriesCollection(1).Values = Range(fomla(2)).Offset(, 1)
    • good
    • 0

>回答番号:No.2 この回答へのお礼


下記内容についての回答を忘れていました。

>実行時エラー'91':
>オブジェクト変数またはWithブロック変数が設定されていません
マクロを実行する前に、グラフクリックして選択されていますか?
回答番号:No.2で記述しておいたのですが伝わっていないようです。
    • good
    • 0

=SERIES(,シート名!$A$61:$A$974,シート!$B$61:$B$974,1)


は散布図なら
=SERIES(系列名,Xの値,Yの値,系列番号)
といった内容になります。
系列名が設定されていないようです。
コードは下記のようにすれば良いと思います。

Dim fomla As Variant
Dim ws As String

fomla = Split(ActiveChart.SeriesCollection(1).Formula, ",")
ws = Split(fomla(2), "!")(0)

With ActiveChart.SeriesCollection(1)
.Values = Sheets(ws).Range(fomla(2)).Offset(, 1)
End With

回答番号:No.1 end-uさんの回答内容も面白そうですが試されましたか?
    • good
    • 0
この回答へのお礼

はじめの回答内容はちょっとやり方がわからずにそのままにしてしまっています.
まだコードが理解できていないのですが無事動きました!
ありがとうございます!

お礼日時:2009/12/19 16:33

>(2)上記コードの誤り


cCnt = Range(myAddress & ":$W$61").Columns.Count
です。
"& myAddress:$W$61" では、『 & myAddress:$W$61 』という文字列が Range( ) の中に入ってしまいます。
変数 myAddress はStringですから、例えば "$B$1" という文字列がはいっていたら、
myAddress & ":$W$61" とする事で、 Range("$B$1:$W$61") になります。

>(1)そもそもグラフの参照を1列ずつ変化させるやり方
いろいろやり方はありますが、例えばマクロを使わず、数式で処理する方法も考えられます。
グラフ元データの範囲を2行目から始めて、A1セルを作業用セルとします。
A列は固定のようですから、C列以降に可変させたいデータを配置します。
A:B列でグラフを作成して、B列には
B2:=INDEX(C2:Z2,$A$1)
以下コピー。
こんな感じの式を入れておけばA1セルの値を変更する事でグラフの系列は変えず、数値を遷移させる事ができます。
マクロでやりたいなら、A1セルの値を書き換えるマクロにすると良いでしょう。
    • good
    • 0

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

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

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

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

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

Qエクセルのマクロで同じサイズの複数のグラフを整列して作成する方法

エクセルで商品毎の販売量推移の散布図を複数作成し、それぞれのグラフを比較する等して販売活動の参考にしているのですが、対象となる商品の数が増えてきたので比較作業が大変になりました。一つのシートに比較邸小さな同じサイズのグラフを作成し、きちんと並べることができれば、作業が大変楽になると思っています。勿論、シートをスクロールしてグラフを見る前提です。
そこで、「新しいマクロの記録」でコードを作成してみたのですが、次の点がわからず困っています。ご指導の程よろしくお願い致します。

1.グラフを作成する際、最初からサイズを指定する方法
「新しいマクロの記録」では、一度作成したグラフのサイズを縮小する内容※になっていますが、これを最初からサイズ指定する方法があるのでしょうか?
※ ActiveSheet.Shapes("グラフ 103").ScaleWidth 0.48, msoFalse, msoScaleFromTopLeft

2.移動する際のグラフの名前?の指定方法
名前が分からないのでグラフを移動しようと思ってもグラフを指定することができないので困っています。上の例では名前が自動付与されて"グラフ 103"になっていますが、作成したグラフを消去してもグラフを作成するたびに数字が増えてしまうので、作成時に指定する方法を知りたいのです。サイズを指定する数値の単位は下記の移動に使用する単位と同じであれば助かります。

3.グラフの移動方法
「新しいマクロの記録」では下記のように相対的な数字がポイントで指定するようになっていました。
ActiveSheet.Shapes("グラフ 103").IncrementLeft 4.5
ActiveSheet.Shapes("グラフ 103").IncrementTop 43.5
これでは、複数のグラフを整列させることは難しいので、適当な移動方法はないでしょうか?

以上よろしくお願い致します。

エクセルで商品毎の販売量推移の散布図を複数作成し、それぞれのグラフを比較する等して販売活動の参考にしているのですが、対象となる商品の数が増えてきたので比較作業が大変になりました。一つのシートに比較邸小さな同じサイズのグラフを作成し、きちんと並べることができれば、作業が大変楽になると思っています。勿論、シートをスクロールしてグラフを見る前提です。
そこで、「新しいマクロの記録」でコードを作成してみたのですが、次の点がわからず困っています。ご指導の程よろしくお願い致します。

...続きを読む

Aベストアンサー

>エラー

グラフを選んだままマクロを動かすと,よくそうなる症状です。


では。
Sub macro1R1()
Dim c As ChartObject
Dim n
n = 3

ActiveSheet.Range("A1").Select

For Each c In ActiveSheet.ChartObjects
c.Height = 200
c.Width = 300
c.Left = Cells(n, "D").Left
c.Top = Cells(n, "D").Top
n = n + 16
Next

End Sub

Qグラフの範囲指定を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

1シートに複数のグラフがあり、値を入れて完成させているファイルがあります。
データ範囲が毎回違うため、いちいちグラフを選択し、範囲を変更しています。

系列:行
データ範囲:A列から~H列までだったり、A列からJ列までだったりします

データがH列までの場合はI列は値が入っていませんが、L列からまた他のグラフのデータ範囲になっているという形です。

データが始まる位置はすべて固定です。

シートにある複数のグラフを一度に変更したいのですが、どのようにしたら良いのでしょうか?
(選択している...続きを読む

Aベストアンサー

>No.4 この回答への補足
>=SERIES(グラフ!$B$45,グラフ!$C$26:$J$26,グラフ!$C$45:$J$45,8)
SERIES式をみると
Xのセル範囲とYのセル範囲の行数が系列NO以上に離れています。
各系列のYのセル範囲もそれぞれ離れているのですか?
それとも隣り合っていますか?

各系列のYのセル範囲は隣接しているが、Xのセル範囲とは数行離れているようです。
違いますか?
No.4までの回答は
各系列名セル範囲、Xのセル範囲、各系列のYのセル範囲は隣接して
矩形セル範囲内にあるとして考えています。
従って、思ったような結果は得られていないと思います。

>B45   他のセルからの転記
手打ち入力ですか?それとも数式で参照表示ですか?
手打ち入力という事ですね?

>C26:J26 1~8までの単純な数値
手打ち入力という事ですね?

>C45:J45 数式。C35は=IF(C35="","",C$27-C35)
C35はC45の間違いでは?
C45は=IF(C35="","",C$27-C35)

>おそらく見えていないグラフがインデックス番号1になっており、REFになったようです。
インデックス番号の所為ではないと思います。
「見えていないグラフ」とは???です。


新たに提示して頂けた情報から判断して
系列ごとにデータ範囲を設定した方が確実かも知れません。
戻り値が数値のセルは連続している事として
SpecialCellsプロパティで、戻り値が数値になっているセル範囲を特定します。
グラフ指定でChartObjects(1)のインデックスは適宜書き換えてください。
ChartObjects("グラフ 1")というように名前にした方が特定し易いかも知れません。
まだまだ検討の余地はありますが取りあえずサンプルコードを提示してみます。

Dim ser As Series
Dim fmla As String
Dim xrng As Range
Dim yrng As Range
Dim plt As Long

With ActiveSheet.ChartObjects(1)
plt = cht.Chart.PlotBy
If plt <> 0 Then
For Each ser In cht.Chart.SeriesCollection
fmla = ser.Formula
Set xrng = Range(Split(fmla, ",")(1))
Set yrng = Range(Split(fmla, ",")(2))
Select Case plt
Case 1 'xlRows(データ系列は列)
Set yrng = Range(yrng, yrng.End(xlToRight))
Set yrng = yrng.SpecialCells(xlCellTypeFormulas, 1)
Case 2 'xlColumns(データ系列は行)
Set yrng = Range(yrng, yrng.End(xlDown))
Set yrng = yrng.SpecialCells(xlCellTypeFormulas, 1)
End Select
With ser
.XValues = xrng.Resize(yrng.Rows.Count, yrng.Columns.Count)
.Values = yrng
End With
Next ser
End If
End With

>No.4 この回答への補足
>=SERIES(グラフ!$B$45,グラフ!$C$26:$J$26,グラフ!$C$45:$J$45,8)
SERIES式をみると
Xのセル範囲とYのセル範囲の行数が系列NO以上に離れています。
各系列のYのセル範囲もそれぞれ離れているのですか?
それとも隣り合っていますか?

各系列のYのセル範囲は隣接しているが、Xのセル範囲とは数行離れているようです。
違いますか?
No.4までの回答は
各系列名セル範囲、Xのセル範囲、各系列のYのセル範囲は隣接して
矩形セル範囲内にあるとして考えています。
従って、思ったような結果...続きを読む

QVBA グラフを複数作成する場合

マクロにてグラフを複数作成しようと考えています

しかし、ループを使用してグラフを作成すると
1つ以上の場合エラーになってしまい作成できません

どのように作成したらよいのでしょうか?
2つ目以降のグラフObjectの名前が重なるからエラーになるとか、そういう部分での問題でしょうか?

-------------------------------------

Sub Graph
  For i = 1 To 2 'source_cnt
  Call Make_Graph(引数)
  Next
End Sub

-------------------------------------

Sub Make_Graph(引数)

With ActiveSheet.ChartObjects.Add( _
Left:=Range(***).Left, _
Top:=Range(***).Top, _
Width:=Range(***).Width, _
Height:=Range(***).Height)
.Chart.ChartType = xlRadar
.Chart.SetSourceData Source:= Range(***), PlotBy:=xlColumns
.Chart.Location Where:=xlLocationAsObject, Name:=WorkSheet.Name
.Chart.HasLegend = False
End With

-------------------------------------

マクロにてグラフを複数作成しようと考えています

しかし、ループを使用してグラフを作成すると
1つ以上の場合エラーになってしまい作成できません

どのように作成したらよいのでしょうか?
2つ目以降のグラフObjectの名前が重なるからエラーになるとか、そういう部分での問題でしょうか?

-------------------------------------

Sub Graph
  For i = 1 To 2 'source_cnt
  Call Make_Graph(引数)
  Next
End Sub

-------------------------------------

Sub Make_...続きを読む

Aベストアンサー

標準モジュールに、質問のコードを一部手直しして、下記にして貼り付け実行しました。2つレーダーチャートを描きましたが。
後はご自分で改良してください。
Dim i
Sub Graph()
For i = 1 To 2 'source_cnt
Call Make_Graph
Next
End Sub
Sub Make_Graph()

With ActiveSheet.ChartObjects.Add( _
Left:=Cells(2, i * 5).Left, _
Top:=Cells(2, i * 5).Top, _
Width:=200, _
Height:=300)
.Chart.ChartType = xlRadar
.Chart.SetSourceData Source:=Range(Cells(1, 1), Cells(10, i)), PlotBy:=xlColumns
'.Chart.Location Where:=xlLocationAsObject, Name:=Worksheet.Name
.Chart.HasLegend = False
End With
End Sub

標準モジュールに、質問のコードを一部手直しして、下記にして貼り付け実行しました。2つレーダーチャートを描きましたが。
後はご自分で改良してください。
Dim i
Sub Graph()
For i = 1 To 2 'source_cnt
Call Make_Graph
Next
End Sub
Sub Make_Graph()

With ActiveSheet.ChartObjects.Add( _
Left:=Cells(2, i * 5).Left, _
Top:=Cells(2, i * 5).Top, _
Width:=200, _
Height:=300)
.Chart.ChartType = xlRadar
.Chart.SetSourceData Source:=Range(Cells(1, 1), Cells(10, i)...続きを読む

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%ぐらいだったかな? だから、理論的に、一旦、プロットエリアの大きさを取って、グラフエリアを変更してしまえば可能だと思うのです。その後で、並びの位置整理すればよいわけですね。でも、そうすると、今度は、グラフ全体の大きさがマチマチになる可能性があるわけです。

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

QVBA(excel)でグラフのデータ範囲の取得

excel2010の
VBA利用者です。

グラフが書いてあって(種類は3D等高線グラフ)、
その元になるデータ範囲は
例えば
ActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$D$10")
のようにすれば、シート1のRange("A1:D10")の範囲が設定できます。
 では、
 これの 逆に
設定でなくて、取得が出来ませんでしょうか?
 つまり
上記の場合でしたら、範囲"A1:D10"を取得して、変数に代入したいのです。

もし、範囲としての取得が難しいならば、最低限
グラフの現在のデータ範囲の矩形範囲の縦横の、行数、列数の
取得だけでもなんとかしたいのですが、
何か方法はないでしょうか?

縦横数百セルの大き目の範囲を相手にしたいので、
Formulaプロパティで系列ごとに取得していく方法では煩雑になるので
何とかもっと
簡便な方法が無いものかと思っております

御教授のほど、よろしくお願いいたします。

Aベストアンサー

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

あらゆるケースに対応できるわけではないですけれども。

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")...続きを読む

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

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

Aベストアンサー

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

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

QEXCEL2007

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'; アプリケーション定義またはオブジェクト定義のエラーです。」となります。


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

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)
    ...続きを読む

Aベストアンサー

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

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")....続きを読む

Qエクセル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

お世話になっています。

グラフ自体は、作成済みのものを使用して、データの範囲だけを
変更させる方法を考えています。

A列に、データが入っている範囲を選択して、選択したセル範囲を
グラフのデータ範囲としたいと思います。

現在、作成したプログラムは以下のものです。
当たり前なんでしょうが、以下のものではエラーになります。
Loopコマンドで、アクティブになったセルをグラフのデータ範囲に
設定する方法を教えてください。

よろしくお願いします。


Sub グラフ作成()
'
Dim 範囲 As String

Range...続きを読む

Aベストアンサー

Sub グラフ作成()
'
Dim 範囲 As Range

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
Set 範囲 = Selection

ActiveSheet.ChartObjects("グラフ 1").Activate
ActiveChart.SetSourceData Source:=範囲

End Sub

QExcel VBAで同じフォルダ内のファイルを開くには?

Windows2000、Excel2000を使用しています。

「経理」というフォルダに「見積」「請求」の2つのExcelファイルがあります。
「見積」から「請求」を開くマクロを作りたいのですが、どうすればいいでしょうか?
「経理」フォルダは場所が変わることがあるので、パスをどうすれば良いかがわからず苦しんでいます。
VBAはまったくの素人で、本を見ながら挑戦しているのですがうまくできないのです。

どうかよろしくお願いします。

Aベストアンサー

必ず「経理」というフォルダに「見積」「請求」の2つのExcelファイルがあると仮定。

以下ならどうでしょう?

フォルダごと移動されても上記のお約束があれば大丈夫と思います。
以下の記述は「見積」に記述してください。



Sub BookOpen()
Workbooks.Open Filename:=ThisWorkbook.Path & "\請求.xls"
End Sub

QExcel VBAで、グラフを特定のセルに移動させたい。

VBA初心者です。
エクセルのワークシート上のグラフ(例えば"グラフ1")を、特定のセル(例えばB4)に移動(もしくはカットペースト)させたいのですが、記述方法を教えて頂けないでしょうか。よろしくお願いします。

Aベストアンサー

#2です。

「アクティブなChartObjectsのナンバーを取得する方法」はなかなか複雑になります。。。。

前提として以下のことを知っておいたほうがよいと思うので記入します。
【前提】
グラフには2種類のオブジェクトが存在します。
今回使用した「ChartObject」と「Chart」です。
違いは「埋め込みグラフ専用」か「シート&埋め込み両用」かの違いです。
またそれとは別に現在選択中のグラフを取得する方法として「ActiveChart」がありますが、これは「Chart」を戻り値とします。

以上の前提を踏まえて「アクティブなChartObjectsのナンバーを取得する方法」について記入します。

【取得方法】
Dim i As Long
Dim lngGetIndex As Long

'初期化
lngGetIndex = -1

'埋め込みグラフを繰り返しチェックし、アクティブグラフかどうかを判別
For i = 1 To ActiveSheet.ChartObjects.Count

'同一オブジェクトの場合はインデックスを取得して処理を抜ける
If ActiveSheet.ChartObjects(i).Chart Is ActiveChart Then
lngGetIndex = i
Exit For
End If

Next

一応以上の方法でアクティブなグラフのインデックスを「lngGetIndex」に取得できます。
(未選択の場合は「-1」が「lngGetIndex」に設定されています)

#2です。

「アクティブなChartObjectsのナンバーを取得する方法」はなかなか複雑になります。。。。

前提として以下のことを知っておいたほうがよいと思うので記入します。
【前提】
グラフには2種類のオブジェクトが存在します。
今回使用した「ChartObject」と「Chart」です。
違いは「埋め込みグラフ専用」か「シート&埋め込み両用」かの違いです。
またそれとは別に現在選択中のグラフを取得する方法として「ActiveChart」がありますが、これは「Chart」を戻り値とします。

以上の前提を踏...続きを読む


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

このカテゴリの人気Q&Aランキング