• ベストアンサー

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

  • エクセルのグラフのマクロでエラーが出てしまう

    グラフのマクロで Charts.Add ActiveChart.ChartType = xlColumnClustered ActiveChart.SetSourceData Source:=Sheets("個人名シート").Range(.Cells(i, 4), .Cells(i, j - 1)), PlotBy _ :=xlRows X列項目範囲 = Range(.Cells(5, 4), .Cells(5, j - 1)) ActiveChart.SeriesCollection(1).XValues = X列項目範囲 ですが、X列項目範囲が1列だけ(4と変数j-1が同じ)だと最終行で 「実行時エラー'1004'; Series クラスの XValues プロパティを設定出来ません。」と出て しまいます。どなたかご教授下さい

  • ExcelVBA 変数を使って項目軸ラベルを追加するには

    Excel2000 VBAで 一度作ったグラフに 項目軸ラベルを追加しようとすると エラーが出ます. Dim MyWorkBookName As String Dim MySheetName As String Dim LastRow As Integer MyWorkBookName = ActiveWorkbook.Name MySheetName = ActiveSheet.Name LastRow= 52 With ActiveChart .SeriesCollection(1).XValues = _ Workbooks(MyWorkBookName). _ Worksheets(MySheetName). _ Range(Cells(2, 6), Cells(LastRow, 6)) End With 変数を使って表したいのですが...

  • グラフマクロで系列を変数にする方法を教えてください

    エクセルのグラフマクロについて質問します。 系列のxの値(Yの値も)の設定で、 グラフ化したいワークシートと範囲を変数にすることはできますか? 目的は、複数あるシートの複数のセルをグラフ化したい、というものです。 変数にてシート名と範囲を指定したいです。 ↓のようなプログラムを作成してみましたが、どうもうまく動きません。 12行目で止まってしまいます。 13行目はでたらめですが、範囲も変数bにできないかなぁと、勝手にイメージで作ってみました。 Sub () n = Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To n Sheets("SHEET1").Select Range("A" & i).Select a = ActiveCell.Value Sheets(a).Select Charts.Add ActiveChart.ChartType = xlXYScatter ActiveChart.SetSourceData Source:=Sheets(a).Range("V22") ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).XValues = "=sheets(a)!R2C4:R5C4" ActiveChart.SeriesCollection(1).Values = "=sheets(a)!range(b)" ActiveChart.Location Where:=xlLocationAsObject, Name:=Sheets(a) Next i End Sub 当方、マクロかじりたての初心者です。 どなたか、よろしくおねがいします!

  • EXCEL2007で動くマクロがEXCEL2000だとエラーが出ます。

    下記は、wordの「@一覧表」文字の部分をExcelで作成した表(B3:E9)に置き換えるEXCEL2007で作成したマクロですが、EXCEL2000で動かすと「メソッドまたはデータメンバーが見つかりません」のエラーが出ます。初心者につき、対処方法を教えて下さい。 Dim wordApp As Word.Application Dim wordDoc As Word.Document Dim wordRange As Word.Range Set wordApp = New Word.Application Set wordDoc = wordApp.Documents.Open(ThisWorkbook.Path & "\ひな型用ドキュメント.docx") (途中略) Set wordRange = wordDoc.Content wordRange.Find.Execute "@一覧表", Forward:=True Range("B3:E9").Copy wordRange.PasteAndFormat (Word.wdPasteDefault) ←エラー *エラーは、wdPasteDefaultで出ます。

  • VBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

    始めまして、VBA初心者のものです。 ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。 Sub 繰り返し() '繰り返し Dim s As Integer For s = 0 To 17 Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select Range("cells(8,s+2)").Activate Charts.Add ActiveChart.ChartType = xlXYScatter ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _ "cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns ActiveChart.SeriesCollection(1).Name = "=""0810p2x""" ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x" With ActiveChart .HasTitle = True .ChartTitle.Characters.Text = "0810p2x" .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t" .Axes(xlValue, xlPrimary).HasTitle = False End With Next End Sub

  • Excel2013 ExcelVBAで散布図

    Excel2013 ExcelVBAで散布図を書く方法を教えてください。 Excel2013にてA列とC列で散布図を作成するため excelVBAで以下のコードを書いています。 Sub hogehoge() Dim aa As Range Dim cc As Range Dim aacc As Range Set aa = Range(Cells(1, 1), Cells(6, 1)) Set cc = Range(Cells(1, 3), Cells(6, 3)) Set aacc = Union(aa, cc) aacc.Select ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlXYScatterLinesNoMarkers End Sub 上記を実行すると左側のグラフになってしまうのですが 右側のグラフを書きたいんですがどうしたらいいのでしょうか? よろしくお願いします。

  • エクセル2013 VBA グラフのデータ系列変更

    エクセル2013を使っています。マクロ初心者です。グラフも普段あまり扱いませんので不慣れです。よろしくお願いします。 マクロの記録を使ってグラフのデータ範囲を変更したら、下記コードが記録されました(○○○はシート名です)。 ActiveSheet.ChartObjects("グラフ 2").Activate ActiveChart.Axes(xlValue).MajorGridlines.Select ActiveChart.FullSeriesCollection(1).Values = "='○○○'!R189C37:R199C37" ActiveChart.FullSeriesCollection(2).Values = "='バ○○○'!R189C38:R199C38" この189と199に変数を下記のように入れました。 Dim r As Integer r = Range("A1").End(xlDown).Row Dim i As Integer Dim s As Integer s = r - 10 i = ActiveCell.Value ActiveSheet.ChartObjects("グラフ 2").Activate ActiveChart.Axes(xlValue).MajorGridlines.Select ActiveChart.FullSeriesCollection(1).Values = "='○○○'!R" & s & "C37:R" & r & "C37" ActiveChart.FullSeriesCollection(2).Values = "='○○○'!R" & s & "C38:R" & r & "C38" これを実行すると、エラーコード400になっていまいます。 どうすればいいのでしょうか?

  • グラフ可変範囲のデータ設定

    環境Excel2002です グラフ 1が棒グラフ2個、折れ線グラフ1個で作成されています Sheets("支社")に8支社のデータがあります グラフシートは1Sheetにしたいので グラフシートで支社を選択することにより Sheets("支社")の該当支社のグラフデータを取得します そうすると、グラフデータは可変範囲で設定することになります そのVBAが下記です ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.SeriesCollection(1).Select With ActiveChart.SeriesCollection(1) .XValues = Sheets("支社").Range(Cells(497, i), Cells(497, i + 12)) .Values = Sheets("支社").Range(Cells(497, i + 1), Cells(497, i + 12)) End With .XValues = Sheets("支社").Range(Cells(497, i), Cells(497, i + 12)) のところで実行時エラー1004がでてしまいます エラー回避方法を教えてください

  • VBAのグラフに違うシートの系列の追加について??

    VBAでグラフに新たな系列を追加しようと思い 以下のプログラムを書きました。 しかしながら、 . Valuesの値の指定の場所でエラーが発生しました。 また、 .XValues = Sheets(シート名(o)).Range(Cells(2, 1), Cells(行の数 + 1, 1)) .Values = Sheets(シート名(o)).Range(Cells(2, p + 1), Cells(行の数 + 1, p + 1)) を .XValues = Range(Cells(2, 1), Cells(行の数 + 1, 1)) .Values = Range(Cells(2, p + 1), Cells(行の数 + 1, p + 1)) に直すとうまくいきました。 別のシートの値をグラフに設定する方法がわかっていないみたいなのですが、 やり方がよくわかりません。 もし、わかる方がいたら教えていただけないでしょうか? よろしくお願いします。 以下、書いたプログラムです。 o=2 ActiveSheet.ChartObjects("グラフ1 " ).Activate ActiveChart.SeriesCollection.NewSeries 'グラフの種類・データの範囲・凡例・2軸の使用を指定します With ActiveChart.SeriesCollection(o) 'グラフの種類を設定 折れ線グラフ .ChartType = xlXYScatterLines 'データの指定 .XValues = Sheets(シート名(o)).Range(Cells(2, 1), Cells(行の数 + 1, 1)) '←ここでエラーが出ます。 .Values = Sheets(シート名(o)).Range(Cells(2, p + 1), Cells(行の数 + 1, p + 1)) '凡例の指定 .Name = シート名(o) End With

  • グラフの「項目軸ラベルに使用」をVBAで

    VBAで項目軸ラベルの範囲を設定したいのですが分からないので教えてください。データ系列は以下で入れられるのですが・・・ Dim R1 as Range Dim R2 as Range Dim n as Integer Range("a1").Select n=range("h1").value Set R1 =Range(Cells(1,1),Cells(n,1)) Set R1 =Range(Cells(1,2),Cells(n,2)) Sheets("グラフ").Select With ActiveChart .SetSourceData R1 たぶんここに入れるのでは・・・ End With Set R1 = Nothing Set R2 = Nothing

専門家に質問してみよう