• ベストアンサー

マクロで折れ線グラフの系列変更の際、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

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

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

折れ線グラフで系列の値を設定し直す時、値が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

daiki-ya
質問者

補足

棒グラフだとグラフ作成できました! 時間がとれなくてその後に折れ線に戻す処理は試していません。 時間作って試します。 しかし値はEmptyではないのですが・・・。

その他の回答 (3)

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

>しかし値は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 では、私はこの辺で。後はご自分で検証なさって下さい。

daiki-ya
質問者

お礼

ありがとうございました! おかげさまで無事に動作するところにこぎつけました。 サンプルソースコードなども載せていただき非常に勉強になりました。 参考にしながら検証して、腕を磨いていきたいと思います。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.3

>回答番号:No.1 この回答へのお礼 >肝心のエラーの件ですが、 >どちらの方法も試してみましたがダメでした。 マクロの記録では下記のようなコードが普通に得られるとおもいます。 .SeriesCollection(1).XValues = "=最大値!$B$24:$B$25" ですから、ダメだったというのは理解できません。 >また、データ範囲は測定したデータ数によって流動的に変わるもので、 >リンク式を代入する方法ではダメなんです。 可変範囲への対応は、例えば .SeriesCollection(1).XValues = "=最大値!B" & 変数1 & ":B" & 変数2 のようにすれば良いと思います。

daiki-ya
質問者

お礼

>マクロの記録では下記のようなコードが普通に得られるとおもいます。 >.SeriesCollection(1).XValues = "=最大値!$B$24:$B$25" >ですから、ダメだったというのは理解できません。 その通りなのですが、ダメなのです・・・。 私も理解できません・・・。 可変範囲への対応にそんな方法があるのですか。 勉強不足でした、お恥ずかしい限りです。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

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"

daiki-ya
質問者

お礼

回答ありがとうございます。 なるほど、そんな書き方が・・・。 マクロの記録をもとにしている拙いマクロなもので(汗) 肝心のエラーの件ですが、 どちらの方法も試してみましたがダメでした。 データはMaxsheetにあります。 また、データ範囲は測定したデータ数によって流動的に変わるもので、 リンク式を代入する方法ではダメなんです。 (略した部分でデータ数を数えたりしています。)

関連するQ&A