- ベストアンサー
マクロで折れ線グラフの系列変更の際、EXCEL2003だと実行時エラーになります。
仕事でEXCELマクロを作成しているのですが、 折れ線グラフの系列(X軸/Y軸)の値等を変更しようとすると、 「実行時エラー'1004': SeriesクラスのXvaluesプロパティを設定できません。」 とのエラーになります。 ただし、EXCEL2007ではエラーにならずに正しくグラフが作れます。 ソースは業務上全てのせるわけにはいかないのと、 長文過ぎるため関係のありそうな部分のみ抜き出しています。 原因として考えられるものを挙げていただけると助かります。 <Version> エラー発生> ・EXCEL2003 VBA Ver6.0 ・EXCEL2003 VBA Ver6.5 正常動作> ・EXCEL2007 VBA Ver6.5 <ソース> ※かなり省略 Dim NewBook As Workbook, DataBook As Workbook Dim GraphSheet As Worksheet, MaxSheet As Worksheet Dim ChartNumber(8) As Variant, MaxChartNumber(8) As Variant 'グラフの名前 ~~~略~~~ Set NewBook = Workbooks.Add Set GraphSheet = NewBook.Worksheets(1) 'データを入れるシート定義 Set MaxSheet = Worksheets.Add() '最大値を入れるシートを追加し、定義 GraphSheet.Name = "測定データ" MaxSheet.Name = "最大値" ~~~略~~~ For m=1 to 8 MaxSheet.Activate MaxSheet.ChartObjects.Add(54 + (m - 1) * 270, 54, 270, 203).Select '新規グラフ ActiveChart.ChartType = xlLine 'グラフ種類を折れ線に指定 ActiveChart.Location Where:=xlLocationAsObject, Name:="最大値" 'グラフをオブジェクトとして、sheet1におく。 ActiveChart.SetSourceData Source:=Range("C24:C25"), PlotBy:=xlColumns 'データの範囲(適当)と方向 Set MaxChartNumber(m) = ActiveChart ~~~略~~~ Next ~~~略~~~ '最大値グラフの範囲設定 MaxSheet.Activate With MaxChartNumber(p).SeriesCollection(1) '****エラーになる部分は↓の2行。 '****エラー時、p=l=1、MStartRow=24、MstartCol=3 .XValues = Range(Cells(MStartRow, MStartCol - 1), Cells(MStartRow + l - 2, MStartCol - 1)) .Values = Range(Cells(MStartRow, MStartCol + p - 1), Cells(MStartRow + l - 2, MStartCol + p - 1)) End With ~~~略~~~ End sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
折れ線グラフで系列の値を設定し直す時、値がemptyだと実行時エラーになります。 回避方法として、グラフ種別を一旦棒グラフにして設定すると良いそうです。 最低限の修正なら >ActiveChart.ChartType = xlLine 'グラフ種類を折れ線に指定 ここを ActiveChart.ChartType = xlColumnClustered に変更し、最後に For m = 1 To 8 MaxChartNumber(m).ChartType = xlLine Next を追加する感じです。 とりあえず開示情報だけで動くようにしたコードを載せると以下。 Dim NewBook As Workbook Dim DataBook As Workbook Dim GraphSheet As Worksheet Dim MaxSheet As Worksheet Dim MStartRow As Long Dim MStartCol As Long Dim m As Long Dim p As Long Dim l As Long Dim ChartNumber(1 To 8) As Variant Dim MaxChartNumber(1 To 8) As Chart Set NewBook = Workbooks.Add 'データを入れるシート定義 Set GraphSheet = NewBook.Worksheets(1) '最大値を入れるシートを追加し、定義 Set MaxSheet = NewBook.Worksheets.Add() GraphSheet.Name = "測定データ" With MaxSheet .Name = "最大値" For m = 1 To 8 Set MaxChartNumber(m) _ = .ChartObjects.Add(54 + (m - 1) * 270, 54, 270, 203).Chart MaxChartNumber(m).ChartType = xlColumnClustered '■ 'データの範囲(適当)と方向 MaxChartNumber(m).SetSourceData Source:=.Range("C24:C25"), _ PlotBy:=xlColumns Next p = 1 l = 1 MStartRow = 24 MStartCol = 3 '最大値グラフの範囲設定 MaxChartNumber(p).SeriesCollection(1).XValues _ = .Range(.Cells(MStartRow, MStartCol - 1), _ .Cells(MStartRow + l - 2, MStartCol - 1)) MaxChartNumber(p).SeriesCollection(1).Values _ = .Range(.Cells(MStartRow, MStartCol + p - 1), _ .Cells(MStartRow + l - 2, MStartCol + p - 1)) End With For m = 1 To 8 MaxChartNumber(m).ChartType = xlLine '■ Next Erase MaxChartNumber Set MaxSheet = Nothing Set GraphSheet = Nothing Set NewBook = Nothing
その他の回答 (3)
- end-u
- ベストアンサー率79% (496/625)
>しかし値はEmptyではないのですが・・・。 この『・・・。』を解決するには >長文過ぎるため関係のありそうな部分のみ抜き出しています。 で割愛された箇所が実際には関係があったのでしょうから、その部分の開示がなければ無理です。 おそらく最初の >ActiveChart.SetSourceData Source:=Range("C24:C25"), PlotBy:=xlColumns 'データの範囲(適当)と方向 Source範囲が適当すぎたのではないですかね。 何らかの不具合を解消するには、シンプル化したコードで検証する事も必要です。 Option Explicit Sub test0() 'エラー Dim cht As Chart With Sheets.Add Set cht = .ChartObjects.Add(54, 54, 270, 203).Chart cht.ChartType = xlLine cht.SetSourceData Source:=.Range("C24:C25"), PlotBy:=xlColumns cht.SeriesCollection(1).XValues = .Range("B23:B24") cht.SeriesCollection(1).Values = .Range("C23:C24") End With Set cht = Nothing End Sub Sub test1() 'Source:=.Range("C24:C25")含め、emptyでなければ可 Dim cht As Chart With Sheets.Add Set cht = .ChartObjects.Add(54, 54, 270, 203).Chart cht.ChartType = xlLine cht.SetSourceData Source:=.Range("C24:C25"), PlotBy:=xlColumns .Range("B23:C25").Value = 1 cht.SeriesCollection(1).XValues = .Range("B23:B24") cht.SeriesCollection(1).Values = .Range("C23:C24") End With Set cht = Nothing End Sub Sub test2() 'xlColumnClusteredからxlLineへ変更 Dim cht As Chart With Sheets.Add Set cht = .ChartObjects.Add(54, 54, 270, 203).Chart cht.ChartType = xlColumnClustered cht.SetSourceData Source:=.Range("C24:C25"), PlotBy:=xlColumns cht.SeriesCollection(1).XValues = .Range("B23:B24") cht.SeriesCollection(1).Values = .Range("C23:C24") cht.ChartType = xlLine End With Set cht = Nothing End Sub Sub test3() 'xlLineでも既存系列の変更ではなく新規作成ならemptyで可 Dim cht As Chart With Sheets.Add Set cht = .ChartObjects.Add(54, 54, 270, 203).Chart cht.ChartType = xlLine cht.SeriesCollection.NewSeries.XValues = .Range("B23:B24") cht.SeriesCollection(1).Values = .Range("C23:C24") End With Set cht = Nothing End Sub では、私はこの辺で。後はご自分で検証なさって下さい。
お礼
ありがとうございました! おかげさまで無事に動作するところにこぎつけました。 サンプルソースコードなども載せていただき非常に勉強になりました。 参考にしながら検証して、腕を磨いていきたいと思います。
- xls88
- ベストアンサー率56% (669/1189)
>回答番号:No.1 この回答へのお礼 >肝心のエラーの件ですが、 >どちらの方法も試してみましたがダメでした。 マクロの記録では下記のようなコードが普通に得られるとおもいます。 .SeriesCollection(1).XValues = "=最大値!$B$24:$B$25" ですから、ダメだったというのは理解できません。 >また、データ範囲は測定したデータ数によって流動的に変わるもので、 >リンク式を代入する方法ではダメなんです。 可変範囲への対応は、例えば .SeriesCollection(1).XValues = "=最大値!B" & 変数1 & ":B" & 変数2 のようにすれば良いと思います。
お礼
>マクロの記録では下記のようなコードが普通に得られるとおもいます。 >.SeriesCollection(1).XValues = "=最大値!$B$24:$B$25" >ですから、ダメだったというのは理解できません。 その通りなのですが、ダメなのです・・・。 私も理解できません・・・。 可変範囲への対応にそんな方法があるのですか。 勉強不足でした、お恥ずかしい限りです。
- xls88
- ベストアンサー率56% (669/1189)
MaxSheet.Name = "最大値" MaxSheet.ChartObjects.Add で 直接、MaxSheet上に、ChartObjectsを、Addしているのですから ActiveChart.Location Where:=xlLocationAsObject, Name:="最大値" の1行は必要ありません。 一例ですが、.ChartObjects.Addの部分は下記のように書けます。 For m = 1 To 8 Set MaxChartNumber(m) = MaxSheet.ChartObjects.Add(54 + (m - 1) * 270, 54, 270, 203).Chart With MaxChartNumber(m) .ChartType = xlLine .SetSourceData Source:=MaxSheet.Range("C24:C25"), PlotBy:=xlColumns End With '~~~略~~~ Next エラーの件はExcel2007しかないので確認できません。 データは、MaxSheetにあるのですか? もしも、違うシートにあるなら、下記のようにシート名で修飾してください。 .XValues = シート.Range(シート.Cells(MStartRow, MStartCol - 1), シート.Cells(MStartRow + l - 2, MStartCol - 1)) だめなら、下記のようなリンク式を代入する方法を試せばどうでしょうか。 .SeriesCollection(1).XValues = "=最大値!$B$24:$B$25"
お礼
回答ありがとうございます。 なるほど、そんな書き方が・・・。 マクロの記録をもとにしている拙いマクロなもので(汗) 肝心のエラーの件ですが、 どちらの方法も試してみましたがダメでした。 データはMaxsheetにあります。 また、データ範囲は測定したデータ数によって流動的に変わるもので、 リンク式を代入する方法ではダメなんです。 (略した部分でデータ数を数えたりしています。)
補足
棒グラフだとグラフ作成できました! 時間がとれなくてその後に折れ線に戻す処理は試していません。 時間作って試します。 しかし値はEmptyではないのですが・・・。