Office 2003 excel vbaでグラフの種類を一系列毎に判定するマクロの実行結果が想定と異なる

このQ&Aのポイント
  • Office 2003 excel vbaでグラフの種類を一系列毎に判定するマクロを組もうとしていますが、実行結果が想定と異なる問題が発生しています。
  • マクロの対象となるグラフには合計で4系列が含まれており、上から棒グラフ、棒グラフ、マーカーなしの折れ線グラフ、マーカー付のおれせんグラフとなっています。
  • 実際には「51」「51」「65」「4」と表示されるため、どこで間違っているのかを教えていただきたいです。
回答を見る
  • ベストアンサー

Office 2003 excel vbaでグラフの種類を一系列毎に判

Office 2003 excel vbaでグラフの種類を一系列毎に判定するマクロを組もうとしております。マクロの対象となるグラフには合計で4系列が含まれており、上から棒グラフ、棒グラフ、マーカーなしの折れ線グラフ、マーカー付のおれせんグラフとなっています。 以下のマクロを実行して、「xlbar」「xlbar」「xlline」「xlline」とメッセージが返る事を想定していたのですが、実際には「51」「51」「65」「4」とメッセージが表示されます。 どこで間違っているのかご教示いただけますと幸いです。 Sub 判定() Dim i As Integer Dim seriesCounts As Integer seriesCounts = ActiveChart.SeriesCollection.Count For i = 1 To seriesCounts MsgBox ActiveChart.SeriesCollection(i).ChartType Next i End Sub

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

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

別に間違っているわけではありません。 ChartType指定は .ChartType = xlColumnClustered ...などとしますが、この『xlColumnClustered』は文字列定数です。 コーディング時、 Dim c As Chart c.ChartType= とタイプすると=の後に[定数の一覧]がポップアップしますね。 設定する時はこの中から選択する事ができます。 ですが、VBEで[Ctrl]+[g]、イミディエイトウィンドウで ?xlColumnClustered とタイプして[Enter]。 51 と出力されます。 .ChartType = xlColumnClustered は .ChartType = 51 と指定している事になります。 人がプログラムを組む時に意味が読み取れるように元から組み込んであるものが文字列定数で、 プログラムはそれを数値として解釈します。 逆にこの51からxlColumnClusteredを導くのは難しいです。 文字列定数自体、意味があるように設定する為に、いろんなメソッドやプロパティで 同じ数値に対して違う文字列が割り当てられています。 参考までに「組み込み定数の一覧」を参照してみてください。 http://support.microsoft.com/kb/407881/ja (新しいものがあるのかどうか知らないのでxl95のものですが) XlChartTypeにどんな文字列定数があるかは、VBEで[F2]キー[オブジェクトブラウザ]で確認できます。 仮に「 xlColumnClustered 」を検索文字列に入れて検索すると Excel.XlChartType のメンバ一覧が表示されます。 それぞれのメンバを選択すると Const xlColumnClustered = 51 (&H33) Const xlLine = 4 Const xlLineMarkers = 65 (&H41) ...と、何の数値が文字列定数に割り当てられているかまでは判ります。 予め対応表を用意しておけば文字列定数を出力する事も可能ですが、 どんな定数でも対応できるようにコードから導き出す方法があるかどうかは知りません。

tosa0507
質問者

お礼

ご回答ありがとうございます。 >予め対応表を用意しておけば文字列定数を出力する事も可能ですが、 頻繁に使用する種類のグラフについて、自分で対応表を作成して対応致しました。

その他の回答 (1)

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

>どんな定数でも対応できるようにコードから導き出す方法があるかどうかは知りません。 ちょっと気になったので調べてみました。 TypeLib Information について検索してみてください。 『Office アプリケーションの組み込み定数の値を取得する方法』 http://support.microsoft.com/kb/239930/ja 『VB : 定数の名称を取得する』 http://d.hatena.ne.jp/parasporospa/20060816/1155694359 TLBINF32.DLLがない環境もあるようですが、あれば使えます。

tosa0507
質問者

お礼

>『Office アプリケーションの組み込み定数の値を取得する方法』 こちらが参考になりました。 ご回答いただき、大変ありがとうございました。

関連するQ&A

  • Excelでのグラフ系列に関するマクロ

    下記が上手く動作しないので、皆さまのお知恵を拝借したく思います。 概略を言いますと、散布グラフ選択時にmt02数の系列を増やすVBAです。増やした系列情報として基準系列データを与えており、その後置換処理をしています(基準系列=mt03、今は一時的に1系列目) Sub 系列情報の取得 Dim fn As String Dim mt02, mt03 As Integer Dim i, k As Integer Dim new_k As String fn = ActiveChart.SeriesCollection(mt03).Formula k = 1 Do Until k > mt02 new_k = 系列追加と参照先設定((i), (k), (fn)) k = k + 1 Loop ' グラフが選択されていない状態になるとココへ Chart_Error: msg = MsgBox("NG", vbCritical, "error") End Sub Function 系列追加と参照先設定(i2 As Integer, k2 As Integer, fn2 As String) Dim fn_new As String ActiveChart.SeriesCollection.NewSeries ' 系列情報を置換、一時的に1系列目を基準データとしている i2 = i2 + k2 fn_new = Replace(fn2, "1)", i2 & ")") ActiveChart.SeriesCollection(i2).Formula = fn_new End Function 不具合箇所としては、Sub内でDo文が条件外となるとグラフが選択されていないと認識されてNG処理へ移行する点です。For文にしても不可、グラフを再選択させてもその瞬間にNGとなります。

  • 積み上げグラフ 系列ごとの自動塗り分け

    現在、オフィス2003で業務の時刻表を作成しています。 写真(左上)のように業務内容と所要時間ような表があり、(右上)のようなグラフにして輸送の部分だけを色付き、他を白色で塗りわけしています。 しかし(左下)のように、順番が1行でも変わると塗り分もずれてしまます。 現在、この塗り分けを自動化するためにマクロやVBAなどを考えていて、以下のようなVBAを作り実行をさせましたが、思うように表示されません。 Sub Macro2() ' ActiveSheet.ChartObjects(1).Activate ActiveChart.ChartArea.Select Dim scname As String Dim colidx As Variant Dim i As Integer With ActiveChart For i = 1 To .SeriesCollection.Count scname = .SeriesCollection(i).Name Select Case Split(scname, " ") Case "輸送": colidx = 4 End Select .SeriesCollection(i).Interior.ColorIndex = colidx Next End With End Sub 何かよい方法は(VBAやマクロなども踏まえて)ありますでしょうか? ご教授宜しくお願いします。 (最終的に凡例は表示させたくはありませんが、らラベルとして系列名を表示させたく思っています。)

  • excel2000のVBAについてわからないことがあります

    勉強している教科書に以下のようなものが載っていました。 ------------------------ Sub 練習2() Dim syurui As Integer Select Case Range("B15").Value Case "集合縦棒" syurui = xlColumnClustered Case "横棒" syurui = xlBarClustered Case "折れ線" syurui = xlLine Case "面" syurui = xlArea Case Else MsgBox "正しいグラフ名を入力してください" Exit Sub End Select Charts.Add ActiveChart.ChartType = syurui (先はまだ続きます) ------------------------------------- で、質問ですが、変数の型についてです。 上記のマクロは、グラフの種類をいろいろ変更できるマクロなのですが、なぜ、文字を代入するのに、変数宣言が、Integer なのかということです。 integerだと、整数型ですから、数値を入れるはずなのに、グラフの種類は文字です。 意味を履き違えた質問をしているのかもしれませんが、教えていただければ幸いです。よろしくお願いします。

  • Excel 2007 <VBAでグラフの操作>

    Excel 2007 <VBAでグラフの操作> 現在すでにあるグラフを修正しています。 下記マクロでは「各グラフに系列が2つあり、その1つ目を削除して残る1つのデータ範囲(X軸の値)を再設定する」という内容です。 下記マクロではFor構文冒頭のSet~の行で、 「実行時エラー '1004': 'Cells'メソッドは失敗しました:'_Global'オブジェクト」 とのエラーが出ます。 このエラーについて検索してみたのですが、これといったものが見つからなかったので、このマクロでおかしなところがあれば直接指摘していただけないでしょうか。 よろしくお願いします。 Private Sub Test_Arrange()   Dim MyRng As Range   Dim R As Integer   Dim n As Integer   Dim i As Integer   n = 10   R = Sheets("Sheet1").Range("A1").End(xlDown).Row   For i = 1 To n     Set MyRng = Sheets("Sheet1").Range(Cells(2, 2 * n + 3), Cells(R, 2 * n + 3))     Charts(i).SeriesCollection(1).Delete     Charts(i).SeriesCollection(1).XValues = MyRng   Next i End Sub

  • Excel VBAのグラフ化自動マクロがうまくできません。

    Sub 自動グラフ作成() For i = 5 To 32 Step 3 Charts.Add ActiveChart.ChartType = xlXYScatterSmoothNoMarkers ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).XValues = "=distance!R18C1:R1009C1" ActiveChart.SeriesCollection(1).Values = "=distance!R18C" & (i + 2) & ":R1009C" & (i + 2) Next End Sub 上記のように表の中の決められたセルからデータを取り出して自動的にグラフを作成してくれるマクロを作成したのですが、奇数個めのグラフは正常に生成されるのですが、偶数個めのグラフになぜか x= y=distance!$M$18:$M$1009 x= y={1} みたいな必要なグラフ以外に上記の2つのグラフを混じってしまいます。これってどこがおかしいのでしょうか? どなたか助けて下さい。 お願いいたします。

  • excelのマクロによるグラフの指定方法

    マクロがどのように記録されるかを見ながら、VBAのスクリプトの書き方を学んでいる初心者です。 Sub Macro1() ' ' Macro1 Macro , ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlLine ActiveWindow.ScrollColumn = 1 ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).Name = "='平均化'!$B$1" ActiveChart.SeriesCollection(1).Values = "='平均化'!$B$4:$B$18" ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(2).Name = "='平均化'!$C$1" ActiveChart.SeriesCollection(2).Values = "='平均化'!$C$4:$C$18" ActiveChart.ChartType = xlLine ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlLine ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).Name = "='平均化'!$D$1" ActiveChart.SeriesCollection(1).Values = "='平均化'!$D$4:$D$18" ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(2).Name = "='平均化'!$E$1" ActiveChart.SeriesCollection(2).Values = "='平均化'!$E$4:$E$18" ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(3).Name = "='平均化'!$F$1" ActiveChart.SeriesCollection(3).Values = "='平均化'!$F$4:$F$18" End Sub 以上のマクロを作成し、実行したのですが、”指定した名前のアイテムが見つかりませんでした”と出て、上手く実行されませんでした。 操作対象のオブジェクトを行き来する方法を知りたいのですが、オブジェクトを作成するたびに ActiveSheet.ChartObjects("グラフ 1").Activate のダブルクオーテーション内に当たる値が自動的に割り振られるため、この部分でエラーになることは分かりました。 つまりこの値をこちらから指定出来れば、望んだ動作をさせられるのではと考えているのですが、 どなたかご教示お願いできませんでしょうか。

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

    エクセルのグラフマクロについて質問します。 系列の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 当方、マクロかじりたての初心者です。 どなたか、よろしくおねがいします!

  • エクセル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になっていまいます。 どうすればいいのでしょうか?

  • [VBA Excel] 2系列の散布図を書いてみるとおかしくなります・・・

    Excel 2007とVBAで数値解析をしています。計算結果のグラフを表示するための準備段階として、次のようなプログラムを組んで、2系列の散布図を書いて見ました。 Option Explicit Sub makechart()   Dim chart1 As ChartObject, wsh As Worksheet   Set wsh = Sheet1   Set chart1 = wsh.ChartObjects.Add( _   10, 20, 250, 200)   With chart1.Chart    .ChartType = xlLineStacked    .SeriesCollection.NewSeries    .SeriesCollection(1).XValues = _     wsh.Range("A1:A5")    .SeriesCollection(1).Values = _     wsh.Range("B1:B5")   End With   With chart1.Chart    .SeriesCollection.NewSeries    .SeriesCollection(2).XValues = _     wsh.Range("A1:A5")    .SeriesCollection(2).Values = _     wsh.Range("C1:C5")   End With End Sub --sheet1--   A B C ----------- 1| 1 2 3 2| 2 3 4 3| 3 4 5 4| 4 5 6 5| 5 6 7 系列1のグラフはB列 対 A列という意図通りのものになったのですが、系列2のグラフは、Y軸の値が、C列の値にB列の値を足したもの (1,2+3)、(2,3+4) ・・・ になってしまいました。系列2のグラフも純粋にC列 対 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

専門家に質問してみよう