• ベストアンサー

【ExcelVBA】SeriesCollectionのXValuesについて

はじめまして。 VBAのSeriesCollectionのXValuesについて教えて下さい。 Excel2000のVBAを使用して棒グラフを描こうとしています。 グラフの元データは、セルを使用せずにVBA内での配列を使ってデータを設定しています。 下記プログラムの星印箇所で「SeriesクラスのXValuesプロパティを設定できません」というエラーが発生し、うまく作成できません。 (Y軸に個数、X軸に1週間ごとの日付を表示する単純なプログラムです) 私の環境(WinXP,Excel2000)では、上記プログラムの定数「W_要素数」の値を20から19に減らすとうまく動作するのですが、その仕組みもわかりません。 希望として、下記の条件を満たしたいと考えています。 (1)可能であれば20よりももっと大きい100くらいの要素を指定したい。 (2)セルにデータを書き込み、セルの範囲指定を行う方法はとりたくない。 (XValuesに配列のデータを指定したい) ご存じの方、ご教示願えますでしょうか? ------以下プログラム------ Sub test() Dim i As Long Dim W_シート名 As String Dim W_X軸() As Long Dim W_日付() As Date Dim W_週ごと As String Const W_要素数 As Long = 20 W_シート名 = ThisWorkbook.Worksheets(1).Name Charts.Add.Location Where:=xlLocationAsObject, Name:=W_シート名 ReDim W_X軸(W_要素数) ReDim W_日付(W_要素数) For i = 0 To W_要素数 W_日付(i) = DateAdd("ww", i, CDate(Format$(Now, "yyyy/mm/dd"))) W_X軸(i) = i + 1 Next i ActiveChart.SeriesCollection.NewSeries With ActiveChart.SeriesCollection(1) .ChartType = xlColumnClustered .Values = W_X軸 ★.XValues = W_日付 End With End Sub

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

あくまで推測ですが ・・・ Seriesオブジェクトの Formula, FormulaLocal, FormulaR1C1, FormulaR1C1Localで格納できる文字列の制限に引っかかっているのかもしれません 系列のデータやラベル文字などをこのFormulaに格納しているようです セル指定の場合は $A$1:$A$30 といったセル番地 配列指定の場合は {0,1,2,3,4,5} といった配列式 が与えられるようです したがって ValuesやXValuesのに与える配列データの内容によって追加できる項目数が制限されるようです W_要素数=38とした場合 .XValues = W_日付 の行を .XValues = W_日付  ' ここでブレーク dim ss as string ss = " " & .Formula ' スペースを追加しておく .XValues = Array( 0,1) 'でウオッチなどで .Formulaを変化を監視 .Formula = ss ' でエラーになる といった具合でデバッグしてみましょう 項目数が多くなるようなら非表示のシートを用意するなどしてセル番地指定のほうがいいかもしれません この障害を逆手にとって W_日付のデータを間引いてしまうといった手法でご希望がかなうかもしれません   For i = 0 To W_要素数     If i Mod 5 = 0 Then       W_日付(i) = CLng(DateAdd("ww", i, Now))     End If     W_X軸(i) = i + 1   Next i といった具合で 5項目ごとにラベルを作るとか ・・・

otto_73
質問者

お礼

redfox63様 度々のご回答ありがとうございます。 W_要素数に39を設定し、「ActiveChart.SeriesCollection(1).Formula」をウォッチ式に入れて確認したところ 下記の値がFomulaには下記の値がセットされていました。 =SERIES(,,{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40},1) SERIESオブジェクトの第3引数にセットされている値がW_X軸のようですので、W_X軸は値をセットできていますが、 redfox63様ご指摘のように、W_日付をセットするところでエラーになっていることを確認できました。 配列方式だと余分なシートを作らないでいいかなと安易に考えていましたが、 アドバイス頂いたように、非表示のシートを利用した方法を考えてみます。 #上記とは別に、W_日付のデータを間引く方法も試してみますね。 みなさんのアドバイスのおかげで1歩前進できました。 ありがとうございました。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

5項目ごとの設定をする場合 ActiveChart.Axes(xlCategory).TickLabelSpacing = 5 の設定をしたほうがいいようです

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

以下 Sub test() Dim i As Long Dim W_シート名 As String Dim W_X軸() As Long Dim W_日付() As Long   '型を変えた Dim W_週ごと As String Const W_要素数 As Long = 30 W_シート名 = ThisWorkbook.Worksheets(1).Name Charts.Add.Location Where:=xlLocationAsObject, Name:=W_シート名 ReDim W_X軸(W_要素数) ReDim W_日付(W_要素数) For i = 0 To W_要素数 W_日付(i) = DateAdd("ww", i, Now)  '単純に加算するだけ W_X軸(i) = i + 1 Next i ActiveChart.SeriesCollection.NewSeries With ActiveChart.SeriesCollection(1) .ChartType = xlColumnClustered .Values = W_X軸 .XValues = W_日付 ActiveChart.Axes(xlCategory).TickLabels.NumberFormatLocal = "yyyy/m/d"  'ラベルの書式を日付に End With End Sub

otto_73
質問者

お礼

okormazd様 回答ありがとうございます。 W_日付の型がDate型だとマズイということがわかりました。 ただ、やはりXValuesには0から38までの39要素しか入らないようです。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Date型で与えているからエラーになっているのかも … Double型の配列でデータを与えて 軸の書式設定を日付にしてみてはいかがでしょう Dim W_日付() as Double と宣言して W_日付(i) = CDbl(DateAdd("ww", i, Format$(Now, "yyyy/mm/dd"))) といった具合にして End Subの前に   With ActiveChart.Axes(xlCategory).TickLabels     .NumberFormatLocal = "yyyy/m/d"     .Alignment = xlCenter     .Offset = 100     .ReadingOrder = xlContext    .Orientation = xlDownward   End With を追加してみてください # 表示方向が上下逆ならOrientationなどを変更してください # 全角スペースを使用していますので適宜置換してください

otto_73
質問者

お礼

redfox63様 早速の回答ありがとうございます。 ご指摘の通り、Double型の宣言に変えて実行したらグラフを作成できました。 ありがとうございます! 「実際の値はDouble型で、X軸項目のラベル表示を変える」という発想がありませんでした。 惜しいのは、これでもXValuesには38までしか値が入らないんですね。 そもそもXValuesにはそんなに値を入れるものではないのでしょうか。。。

関連するQ&A

  • 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 変数を使って表したいのですが...

  • VBAでグラフの範囲指定

    VBAでグラフ範囲指定について 先日質問させて頂いたのですが、行き詰ってしまったのでどうかご指南ください。 只今、sheet1データ一覧をダブルクリックした際にsheet2へ移り、表の詳細データが記入されるツールを作っています。 sheet2には表詳細データ以外にも、空白を挟んで他のデータが記入され、詳細データの散布図グラフが挿入されています。 sheet2に移り詳細データが表示されるようには出来ているのですが、表は12行に項目、13行からデータが始まるのは固定で、終わりの行はその都度変わるため、sheet1のダブルクリックした際のシート移動の処理の中に記述し、sheet2に記入された表データを参照して散布図のグラフを挿入したく思いました。 Dim ws2 As Worksheet Dim logGYO As Long Dim j As Long Dim x軸 As Variant Dim 系列1y軸 As Variant Dim 系列2y軸 As Variant Dim GYOMAX As Long Set ws2 = Worksheets("sheet2名前") ws2.ChartObjects("詳細グラフ").Activate ActiveChart.ChartArea.Select logGYO = 13 j = 13 Do Until ws2.Cells(j, 1).Value = "" j = j + 1 Loop GYOMAX = j - 1 With ws2 x軸 = .Range(.Cells(logGYO, 1), .Cells(GYOMAX, 1)) 系列1y軸 = .Range(.Cells(logGYO, 2), .Cells(GYOMAX, 2)) 系列2y軸 = .Range(.Cells(logGYO, 4), .Cells(GYOMAX, 4)) End With With ActiveChart.SeriesCollection(1) .XValues = x軸 .Values = 系列1y軸 .Name = "=""系列1名前""" End With With ActiveChart.SeriesCollection(2) .XValues = x軸 .Values = 系列2y軸 .Name = "=""系列2名前""" End With 実行したところ、「SeriesクラスのXValuesプロパティを設定できません」とエラーが出てしまいます。 SeriesCollection(1).Formula = "=SERIES(" & Range("B12")~ とFormulaと記述を変えて試してもみたのですが、「SeriesクラスのFormulaプロパティを設定できません」とエラーが出ます。 2週間程前までExcel自体を殆ど使ったことが無かった初心者のため、見当外れな質問をしていたら申し訳ありません。 どうか宜しくお願い致します

  • 初心者です。SeriesCollection(i)はどのように使うのでしょうか

    Sheets("推移グラフ").Select ActiveChart.ChartArea.Select ActiveChart.SeriesCollection(1).XValues = Worksheets(Zsheet2).Range(xrenge1) ActiveChart.SeriesCollection(1).Values = Worksheets(Zsheet2).Range(yrenge1) ActiveChart.SeriesCollection(2).XValues = Worksheets(Zsheet2).Range(xrenge1) ActiveChart.SeriesCollection(2).Values = Worksheets(Zsheet2).Range(yrenge2) ActiveChart.SeriesCollection(3).XValues = Worksheets(Zsheet2).Range(xrenge1) ActiveChart.SeriesCollection(3).Values = Worksheets(Zsheet2).Range(yrenge3) ActiveChart.Deselect に折れ線を1本追加したいのですが、SeriesCollectionの使い方がわかりません。SeriesCollection(i)のiは1~3しか使えないのでしょうか。

  • VBAでの、Excelグラフの項目軸の指定方法

    エクセルグラフ作成にて、棒グラフ、X軸の項目名を指定するVBAでの方法を求めています。 エクセルのウィザード2/4「系列」にて、項目軸の設定ができますが、それをVBAにてやりたいのです。 ウィザードでは、下記のように指定  ='xxxxxxxx'!R2C25:R13C25 レコード機能で、これをキャッチすると、 ActiveChart.SeriesCollection(1).XValues = "=' xxxxxxxx '!R21C25:R30C25" ActiveChart.Location Where:=xlLocationAsObject, Name:=" xxxxxxxx " ‘--------ChartObject化する 小生は、Chartobjectにて、グラフを作成、上記を使って、項目名を指定しようとしました。 ActiveChart.SeriesCollection(1).XValues = "=' xxxxxxxx '!R21C25:R30C25" これは、うまくいきました。しかし、変数を使うと、途端に駄目です。 例えば、 temp1="xxxxxxxx" temp2="R21C25:R30C25" temp="=" & temp1 & "!" & temp2 として ActiveChart.SeriesCollection(1).XValues =temp これは、うまくいきません。 よろしくお願いいたします。

  • エクセル グラフ データラベルにX軸の値を表示

    VBAでエクセルのグラフにX軸の値を表示させる方法を教えて下さい。 このように書いているのですが、Type:=xlCategoryでエラーとなってしまいます。 For i = 1 To ActiveChart.SeriesCollection(1).Points.Count ActiveChart.SeriesCollection(1).Points(i).HasDataLabel = True ActiveChart.SeriesCollection(1).ApplyDataLabels Type:=xlCategory Next i Y軸を表示させるxlValueではエラーとならず、Y軸の値が表示されました。 教えて下さい。 宜しくお願い致します。

  • Excellのvbaにおける、グラフの設定

    このたびは、Excellのvbaにおける、グラフの設定がわからず質問させていただきます。 具体的に、行いたいこととしましては、 円グラフを新規に作成し、データ範囲を指定し、グラフを表示させるということをしたいと考えております。 しかし、項目軸ラベルに使用するデータの設定がうまくいきません。 以下にソースコードをのせますのでアドバイス願います。 Sub AddGrafh()      Range("J4:O4").Select      Dim NowSheetName As String   NowSheetName = ActiveSheet.Name      ActiveSheet.ChartObjects.Add(50, 200, 338, 220).Select   ActiveChart.ChartType = xlPie   ActiveChart.ChartWizard Source:=Range("J4:O4"), PlotBy:=xlRows   ActiveChart.SeriesCollection(1).Name = "=""項目別支出割合"""   ActiveChart.ChartTitle.Font.Size = 14     ActiveChart.SeriesCollection(1).XValues = """=" & NowSheetName & "!$J$3:$O$3"""      End Sub 上記の ActiveChart.SeriesCollection(1).XValues = """=" & NowSheetName & "!$J$3:$O$3""" という箇所の記述がおかしいのですが、なんてかいてよいかわかりません。 ちなみに、項目軸ラベルに設定したいデータは、現在のシートのJ$3:$O$3です。 よろしくお願いします。

  • マクロでグラフを作成したい

    Charts.Add ActiveChart.ChartType = xlXYScatterLinesNoMarkers For i = 1 To 25    ActiveChart.SeriesCollection.NewSeries    ActiveChart.SeriesCollection(i).XValues = "=APC!"(3,X)":"Range(lngYCut,X)    ActiveChart.SeriesCollection(i).Values = "=APC!Cells(3,Y):Cells(lngYCut,Y)"    ActiveChart.SeriesCollection(i).Name = "=APC!R1C&X"  X = i * 3 + 1   Y = i * 3 + 2 Next 上記のプログラムでグラフを作成しています。(X,Y,lngYCutは事前に定義しています。) 25個のデータをグラフにする為、For文の中でグラフデータを1つずつ追加していこうと思っています。 データ範囲を変数で指定したいため、=のあとを変えないといけないと思っています。 ただ=のあと""で囲っているため、文字として入力しているんだと思います。 その文字列として入力している場所にどうにかして変数を使いたいです。 どなたか ActiveChart.SeriesCollection(i).XValues = のあとに変数を使用できる方法を教えてください

  • excel散布図のX軸とY軸を入れ替えるVBA

    散布図の軸を入れ替える方法を考えています。(excel2003です。) 散布図は数百枚あり、系列ごとに元データが散在しているので、 元データは触らずに、グラフの軸だけを入れ替えて表示したいのです。 例えば横軸が身長、縦軸が体重の散布図を縦軸を体重、横軸を身長にするイメージです。 xvaluesとvaluesを入れ替えるのだと思い、以下を組んでみたのですが、うまくいきません。 どのように修正すればよいか教えてください。 Sub 軸入替() Dim cht As Chart Dim i As Long, N As Long   Dim sxvalues As Object,svalues As Object With ActiveSheet.ChartObjects For N = 1 To .Count Set cht = .Item(N).Chart With cht.SeriesCollection For i = 1 To .Count          sxvalues = .Item(i).XValues ←ここでエラーが出ます。          svalues = .Item(i).Values          .Item(i).Values = sxvalues          .Item(i).XValues = svalues Next End With Next End With End Sub 以上です。

  • EXCELVBAグラフ凡例表示部分の系列の名称非表

    すいません。VBAの記述の方法がわからないのでお手数ですが教えてください 使用アプリ・使用OS:Excel2010 VBA Windows7 ■教えてほしい内容 グラフを作成し、その後以下のVBAでグラフの系列を追加しています。 dk = ActiveChart.SeriesCollection.Count + 1 ActiveChart.SeriesCollection.NewSeries '系列名の設定 ActiveChart.SeriesCollection(dk).Name = "cp-" & dk 'y軸の値設定 ActiveChart.SeriesCollection(dk).Values = "={" & aaa & "}" '散布図設定 ActiveChart.SeriesCollection(dk).ChartType = xlXYScatter その後、グラフの凡例部分でこの追加した系列cp-○の凡例内の系列を非表示にしたいのですがわかりません。 申し訳ありませんが教えてください。

  • VBAの動的配列について

    いつもお世話になっております。 エクセルVBAを学習中の者です。 動的配列についてお伺いします。 添付資料を見て頂きたいのですが、 シート名1~4に同一レイアウトの表があります。 これらの表をを2次元配列に格納し、その後、同一レイアウトのシートに一括転記したいと考えています。 転記の事を考えて、条件としては、 シート1から2行目以降のデータを配列『data』に格納、変数『dataCnt』が転記先の行番号と同じになるように考えています。 当初は、配列の定義を『Dim data(100,3) As Variant』と、多めに要素数を定義して、コードを記述していました。 正直、凄く気持ちが悪い感じでした・・・ 最近、動的配列を学習しまして、 シートごとにデータの行数を変数『lastRow』に格納して、配列を再定義して【データ数=要素数】とならないか? と思い、下記のようなコードを書いてみました。 が、『ReDim Preserve~』で実行エラーが発生してしまいます。 原因がなぜかわかりません! そもそも、動的配列はこのような使い方は出来ないのでしょうか? Sub テスト() Dim data() As Variant Dim x As Long Dim i As Long Dim ii As Long Dim lastRow As Long Dim dataCnt As Long dataCnt = 2 For x = 2 To 5 Worksheets(x).Activate lastRow = Cells(Rows.Count, 1).End(xlUp).Row If x = 2 Then ReDim data(2 To lastRow, 3) Else ReDim Preserve data(2 To dataCnt + lastRow - 1, 3) End If For i = 2 To lastRow For ii = 1 To 3 data(dataCnt, ii) = Cells(i, ii) Next ii dataCnt = dataCnt + 1 Next i Next x End Sub どなたかご指導をよろしくお願いいたします。

専門家に質問してみよう