みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel2007VBA:サブルーチンの実行結果が1度目と2度目で違う

Excel2007のVBAで、
まず「.csvデータからグラフを作成する」マクロに、
「そのグラフに系列を追加する」サブルーチンを2度(1度目の系列名をA,2度目の系列名をB)呼びだすようにしました。

しかし、実行結果はメインのグラフである『系列1』の直後にいきなり『B』(2本目の追加線)が意図通りの形で追加され、さらに『系列3』という名前の系列が実際の参照・線なしに凡例に存在し、一本目の追加線のはずの『A』がありませんでした。

同一のサブルーチンであるのに2度目だけ意図通りの結果になるのはなぜですか?
また、これを修正するにはどうすればいいのでしょうか?

コード全文が入りきらないので、グラフ操作に関連すると自分なりに思うところを抜粋します。抜粋部分は//でコメントします。抜粋した部分が重要な場合は指摘してください。

よろしくお願いします。

//サブルーチンでも共有してほしい変数
Dim starttemp As Variant, endtemp As Variant, linetemp As Variant
Dim filename As String, line As String
//メイン
Sub DSC()

Dim mass As Variant
Dim MaxRow As Integer
Dim crosspoint As Variant, AB As Variant, Bex As Variant, allintegral As Variant

'ファイルを開く
filename = InputBox("ファイル名")
Workbooks.Open filename:= filename & ".csv"

//この間にデータをグラフ化する数値に処理する工程が入ります。

'グラフ化
Range("B2:B" & MaxRow, "D2:D" & MaxRow).Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlXYScatterLinesNoMarkers
ActiveChart.SetSourceData Source:=Range("'" & filename & "'!$B$2:$B$" & MaxRow & ",'" & filename & "'!$D$2:$D$" & MaxRow)
ActiveChart.Location Where:=xlLocationAsNewSheet
ActiveChart.Name = "abc"

'950-960(?)での接線Aを引く
line = "A"
'接線の範囲
starttemp = 950
endtemp = 960
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = starttemp & "-" & endtemp
Call intercept

'1000前後での接線Bを引く
line = "B"
'接線の範囲
starttemp = 1000
endtemp = 1020
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = starttemp & "-" & endtemp
Call intercept

Sheets(filename).Activate
//この後にもこまごまとした処理が続きます
End Sub

//以下サブルーチン
Sub intercept()

//ここにも数処理が入ります

Charts("abc").Select
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(2).Name = line
ActiveChart.SeriesCollection(2).XValues = "='" & starttemp & "-" & endtemp & "'!$E$3:$E$" & mr
ActiveChart.SeriesCollection(2).Values = "='" & starttemp & "-" & endtemp & "'!$F$3:$F$" & mr

End Sub

投稿日時 - 2009-12-09 19:41:04

QNo.5510330

困ってます

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

原因はここ。
>Charts("abc").Select
>ActiveChart.SeriesCollection.NewSeries
>ActiveChart.SeriesCollection(2).Name = line
>ActiveChart.SeriesCollection(2).XValues = "='" & starttemp & "-" & endtemp & "'!$E$3:$E$" & mr
>ActiveChart.SeriesCollection(2).Values = "='" & starttemp & "-" & endtemp & "'!$F$3:$F$" & mr

ActiveChart.SeriesCollection.NewSeries
この行では、ActiveChartに新しい系列を追加しています。
これ以下は
ActiveChart.SeriesCollection(2)...
に対する設定。つまり系列2に対する設定です。
このサブプロシージャを何回実行しても系列2に対する設定にしかなりません。
変更するなら、Withステートメントを使って括ってあげると、追加した系列に対して設定できます。

With Charts("abc").SeriesCollection.NewSeries
  .Name = line
  .XValues = "='" & starttemp & "-" & endtemp & "'!$E$3:$E$" & mr
  .Values = "='" & starttemp & "-" & endtemp & "'!$F$3:$F$" & mr
End With



ついでですが、ActivateやSelectに影響されないコードをこころがけた方が良いです。
提示コードの範囲だけ修正してみると

Dim r As Range 'グラフ元範囲用に変数を追加
':
':
'グラフ化
Set r = ActiveSheet.Range("B2:B" & MaxRow, "D2:D" & MaxRow)
With Charts.Add
  .Name = "abc"
  .ChartType = xlXYScatterLinesNoMarkers
  .SetSourceData r
End With

'950-960(?)での接線Aを引く
line = "A"
'接線の範囲
starttemp = 950
endtemp = 960
Sheets.Add(After:=Sheets(Sheets.Count)).Name = starttemp & "-" & endtemp
Call intercept

'1000前後での接線Bを引く
line = "B"
'接線の範囲
starttemp = 1000
endtemp = 1020
Sheets.Add(After:=Sheets(Sheets.Count)).Name = starttemp & "-" & endtemp
Call intercept

こんな感じです。

投稿日時 - 2009-12-09 21:36:06

お礼

回答ありがとうございます。
コードをコピーペーストしたらホントにあっさり解決しました。

……select・activeの話も含めて「マクロの記録」で横着せずに勉強し直します。

投稿日時 - 2009-12-10 12:34:03

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問