人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

先日グラフ作成にて判らない事があり、教えて頂いたのですがエラーになってしまいます。引き続き教えて頂きたかったのですが、設定変更が出来ず、結局締め切ってしまいました。再度改めて質問させて下さい。
2軸の折れ線グラフの作成にて、セルA1・B1の数値を変更することにより、ワークシート上のグラフの参照位置を全て置換えるというものなのですが、
.SetSourceData Source:=ActiveSheet.・・・・
ここで(実行エラー1004、アプリ又はオブジェクトの定義エラー)どう変更すればよいのでしょうか?よろしくお願いします。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row > 1 Or Target.Column > 2 Then Exit Sub
Dim r,C1,C2 As String
Dim ch As ChartObject
Dim minRow,maxRow As Long
minRow = 50:maxRow = 100
If Range("A1").Value >= minRow And Range("A1").Value <= maxRow _
And Range("B1").Value >= minRow And Range("B1").Value <= maxRow Then
For Each ch In ActiveSheet.ChartObjects
ch.Activate
With ActiveChart
c1 = .SeriesCollection(1).Name
c2 = .SeriesCollection(2).Name
r = c1 & Range("A1").Value & ":" & c1 & Range("B1").Value & "," _
& c2 & Range("A1").Value & ":" & c2 & Range("B1").Value
.SetSourceData Source:=ActiveSheet.Range(r), PlotBy:=xlColumns
.SeriesCollection(1).Name = c1
.SeriesCollection(2).Name = c2
End With
Next
End Sub


●質問者: dadan_dan
●カテゴリ:コンピュータ
✍キーワード:A1 as EXIT name NeXT
○ 状態 :終了
└ 回答数 : 8/8件

▽最新の回答へ

[1]失礼しました SALINGER

コメントがオープンでなかったので、回答で答えてポイントを消費させるのはよくないかと思い返信をしていませんでした。

自分の環境では動作は確認しているので、たぶん、グラフを作ったときに系列名をうまく変更していないからだと思います。

私の回答はグラフオブジェクトから、グラフの参照情報を取得するのが難しいと判断し、だったらグラフを作るときに参照の列の情報を系列名に入れてしまえというものです。

しかし、airplantさんの回答でできるようなのでそのほうがいいでしょう。


[2]>1 ご返答ありがとうございます。 dadan_dan

SALINGERさんありがとうございます。

個人的に問い合わせをしたかったのですが、方法が判りませんでした。また、質問内容覧にハンドル名を記載するのもどうかと思いまして。

もう一度再確認したいのですが、一つ一つのグラフにそれぞれ「系列名」を付けなければならないのですよね。

また、参照元の列を変えるには一つ一つ変更するしか方法はないのでしょうか?


[3]>2 引き続き SALINGER

私の方法では系列名に"B"と"F"のように入れないと動作しないという回りくどいやり方です。

まあ、列を変更するときは、それを"C"と"G"のように変えるだけでいいという利点もありますが。

エラーが出る場合はデバッグ画面で、r のところにカーソルを合わせて代入されている文字列を見てみればだいたいエラーの原因がわかると思います。

グラフが複数ある場合、全部の行を変えるのならいいのですが、特定のグラフの列を変更する場合、グラフを特定する仕組みがどうしても必要になります。

グラフが一定の順番で規則的に並んでいて、その順番に系列を、A2セルから右に、B F C G H Q・・・のように入れてグラフの列を変更するというのならできますよ。


[4]>3 早速の返信ありがとうございます。 dadan_dan

>グラフが一定の順番で規則的に並んでいて、その順番に系列を、A2セル>から右に、B F C G H Q・・・のように入れてグラフの列を変更すると>いうのならできますよ


ある程度は規則性はあるのですが、変則的一定という感じです。

最初の5枚の系列1は2、5、8、11、14列と3列毎。

残りのn枚は17、21、25、29、33列・・・、と4列毎。

系列2の最初の5枚は50、54、58、62、66列、と列毎。

残りのn枚は70、74、78、82、・・・と4列毎。など

このような時にはどのように変更するのでしょうか?

また、御面倒とは思いますが、完全に2列毎、3列毎の時の処理も

教えて頂けるとありがたいです。お願いします。


[5]新しく作ってみました SALINGER
Private Sub Worksheet_Change(ByVal Target As Range)
 If (Target.Row = 1 And Target.Column > 2) Or Target.Row > 3 Then Exit Sub
 Dim minRow As Long
 Dim maxRow As Long
 Dim s1, s2 As String
 Dim p1, p2 As Integer
 Dim r As String
 Dim i, j As Integer
 
 minRow = 50 '最小行を設定
 maxRow = 100 '最大行を設定
 
 If Range("A1").Value >= minRow And Range("A1").Value <= maxRow _
 And Range("B1").Value >= minRow And Range("B1").Value <= maxRow Then
 For i = 1 To ActiveSheet.ChartObjects.Count
 ActiveSheet.ChartObjects(i).Activate
 With ActiveChart
 For j = 1 To 2
 s1 = .SeriesCollection(j).Formula
 p1 = InStrRev(s1, ",")
 p2 = InStrRev(s1, "!")
 s2 = Mid(s1, p2 + 1, p1 - p2 - 1)
 If Cells(j + 1, i).Value = "" Then
 r = Range(Cells(Range("A1").Value, Range(s2).Column), _
 Cells(Range("B1").Value, Range(s2).Column)).Address
 Else
 r = Range(Range(Cells(j + 1, i).Value & Range("A1").Value), _
 Range(Cells(j + 1, i).Value & Range("B1").Value)).Address
 End If
 .SeriesCollection(j).Formula = Left(s1, p2) & r & ",1)"
 Next j
 End With
 Next
 Else
 MsgBox "正しい範囲を入力してください"
 End If
End Sub

[6]>5 説明 SALINGER

A1に全てのグラフの範囲下|B1に全てのグラフの範囲上|

A2に最初のグラフの系列1|B2に次のグラフの系列1 |・・・・・

A3に最初のグラフの系列2|B3に次のグラフの系列2 |・・・・・

例えば、シートの左上に

50|70|
B |C |・・・
F |G |・・・

のように入力すると個々のグラフの列を自由に変更できます。

ただし、列を指定する2行目3行目は空白でも変更しないだけでエラーになりませんが、データの無い行を選択するとエラーになります。


やってることは、SeriesCollection(1).Formula で参照先を取得して、加工してまた代入することで参照先を変更するということです。系列名とかは使ってないので自由に設定もできます。


[7]>4 ええと SALINGER

グラフオブジェクトを取得するには

For i = 1 To ActiveSheet.ChartObjects.Count
next i

For Each ch In ActiveSheet.ChartObjects
next

で全てのグラフにアクセスでき、SeriesCollection(1).Formula で個々の参照先も取得できるので、グラフが規則的に並んでいるかは問題ではなくて、

どのグラフをどの列に変更するか、というのをどうやって指定するかという問題が大変だったりします。

グラフを指定するには、グラフが作られた順番で指定するか、名前で指定するか。列を指定するには変更する列の情報を入力するためのセルをどこかに用意するのか。となります。


前に作ったコードは自分なりに満足のいくものではなかったので改良してみました。

これで回答数全て使いました。引き続き質問があるときは、回答数を上げるか、コメントオープンでお願いします。


[8]>6 ありがとうございました。 dadan_dan

全く問題が無い時とエラーになる時の違いがまだよく判りませんが、

しばらく使わせて頂きます。

また、困った時には質問させて頂くと思いますが、よろしくお願い致します。

ありがとうございました。m(_ _)m

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ