• ベストアンサー

Excel VBA グラフ作成のときのエラー

VBA初心者です。Excel2003を使っています。 Sheet1に作りたいグラフがあります。 データは下記のとおりです。 ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A")のところで、「実行時エラー13 型が一致しません」とエラーがでます。 不思議なのは、昨日は動いていたのです。 なぜ、エラーが出るようになったのかわかりません。 ご教授よろしくお願いします。 A B 1 a 1 2 2 3 3 4 4 5 5 6 b 6 7 7 8 8 9 9 10 10 11 c 11 12 12 13 13 14 14 15 15 Sub test() Wrow = Worksheets("sheet1").Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To Wrow If Worksheets("sheet1").Cells(i, "A").Value = "a" Then a_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "b" Then b_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "c" Then c_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "d" Then d_data = Worksheets("sheet1").Cells(i, "A").Row End If Next Sheets("sheet1").Select Range(Cells(a_data, "B"), Cells(b_data, "B")).Select ActiveSheet.ChartObjects.Add(30, 10, 500, 200).Select ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=Sheets("sheet1").Range(Cells(a_data, "B"), Cells(b_data - 1, "B")), PlotBy:=xlColumns ActiveChart.Location where:=xlLocationAsObject, Name:="sheet1" Sheets("sheet1").Select ActiveChart.Axes(xlCategory, xlPrimary).CategoryType = xlAutomatic ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A") ←エラーがでます。 ActiveChart.SeriesCollection(2).Values = Range(Cells(b_data, "B"), Cells(c_data, "B")) ActiveChart.SeriesCollection(2).Name = Cells(b_data, "A") ActiveChart.SeriesCollection(3).Values = Range(Cells(c_data, "B"), Cells(d_data, "B")) ActiveChart.SeriesCollection(2).Name = Cells(c_data, "A") End Sub

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

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

データ表がずれて表示されるので、整形してみました。   A B 1 a 1 2   2 3   3 4   4 5   5 6 b 6 7   7 8   8 9   9 10   10 11 c 11 12   12 13   13 14   14 15   15 16 d   '←便宜上入れてみました。 エラーになるのは、変数a_dataにセットされた値がおかしいのかも知れません。 因みに当方では、提示箇所でエラーは出ませんでしたが、変なグラフになります。 コードで、おかしな所、不要な箇所を修正削除してみました。 Sub test2()   Dim Wrow As Long   Dim a_data As Long   Dim b_data As Long   Dim c_data As Long   Dim d_data As Long   Dim i As Long      Wrow = Worksheets("sheet1").Cells(Rows.Count, "A").End(xlUp).row   For i = 1 To Wrow     If Worksheets("sheet1").Cells(i, "A").Value = "a" Then       a_data = Worksheets("sheet1").Cells(i, "A").row     ElseIf Worksheets("sheet1").Cells(i, "A").Value = "b" Then       b_data = Worksheets("sheet1").Cells(i, "A").row     ElseIf Worksheets("sheet1").Cells(i, "A").Value = "c" Then       c_data = Worksheets("sheet1").Cells(i, "A").row     ElseIf Worksheets("sheet1").Cells(i, "A").Value = "d" Then       d_data = Worksheets("sheet1").Cells(i, "A").row     End If   Next   ActiveSheet.ChartObjects.Add(150, 10, 400, 150).Select   ActiveChart.ChartType = xlLineMarkers   ActiveChart.Axes(xlCategory, xlPrimary).CategoryType = xlAutomatic   ActiveChart.SeriesCollection.NewSeries   ActiveChart.SeriesCollection.NewSeries   ActiveChart.SeriesCollection.NewSeries   ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A")   ActiveChart.SeriesCollection(1).Values = Range(Cells(a_data, "B"), Cells(b_data - 1, "B"))   ActiveChart.SeriesCollection(2).Name = Cells(b_data, "A")   ActiveChart.SeriesCollection(2).Values = Range(Cells(b_data, "B"), Cells(c_data - 1, "B"))   ActiveChart.SeriesCollection(3).Name = Cells(c_data, "A")   ActiveChart.SeriesCollection(3).Values = Range(Cells(c_data, "B"), Cells(d_data - 1, "B")) End Sub

goo397620
質問者

お礼

お礼が遅くなりました。 ご回答ありがとうございます。 しかし、xls88さんのコードでも、同じところで、「実行時エラー13 型が一致」とでました。。。パソコンやソフトが悪いのでしょうか。。。 ただ、自分のコードもxls88さんのコードでも、ステップインで一行ずつ実行すると、エラーなしに実行できます。不思議です。

その他の回答 (5)

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

ぅわ。すみません。 >Sub try() >': >For Each r In .Range("A1", .Cells(.Rows.Count, 1)) For Each r In .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)) .End(xlUp)が抜けてましたorz Sub zikken()については、何故?、と訊かれると私にもわかりません。 そんな事もある...って事で。 知っておけば対処のしようがあるというプチ情報としてさらっと流しといてください。:D

goo397620
質問者

お礼

ご回答ありがとうございます。 修正し、実行すると問題なく動きました! 本当にありがとうございます!

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

>Cellsの列指定 "A" が影響してます。 一応、補足。 全ての状況で影響があるわけではないです。 ケースバイケースで使い分けされて構わないと思います。 ちょっと実験です。 '標準モジュール Option Explicit Sub zikken()   Dim ws As Worksheet   Dim r As Range   On Error GoTo errLine   Set ws = ActiveSheet   Set r = ws.Cells.Item(1, "A")   If Not r Is Nothing Then Debug.Print r.Address(0, 0);   Set r = Nothing   Set r = ws.Cells.Item(1, 2)   If Not r Is Nothing Then Debug.Print r.Address(0, 0)   Set r = Nothing   With ws.ChartObjects.Add(0, 0, 200, 100).Chart     Set r = ws.Cells.Item(2, "A")     If Not r Is Nothing Then Debug.Print r.Address(0, 0);     Set r = Nothing     Set r = ws.Cells.Item(2, 2)     If Not r Is Nothing Then Debug.Print r.Address(0, 0)     Set r = Nothing     With .SeriesCollection.NewSeries  '■       Set r = ws.Cells.Item(3, "A")       If Not r Is Nothing Then Debug.Print r.Address(0, 0);       Set r = Nothing       Set r = ws.Cells.Item(3, 2)       If Not r Is Nothing Then Debug.Print r.Address(0, 0)       Set r = Nothing       .Delete     End With     Set r = ws.Cells.Item(4, "A")     If Not r Is Nothing Then Debug.Print r.Address(0, 0);     Set r = Nothing     Set r = ws.Cells.Item(4, 2)     If Not r Is Nothing Then Debug.Print r.Address(0, 0)     Set r = Nothing     .Parent.Delete   End With   Set r = ws.Cells.Item(5, "A")   If Not r Is Nothing Then Debug.Print r.Address(0, 0);   Set r = Nothing   Set r = ws.Cells.Item(5, 2)   If Not r Is Nothing Then Debug.Print r.Address(0, 0)   Set r = Nothing   Set ws = Nothing   Exit Sub errLine:   Debug.Print Err.Number; Err.Description;   Resume Next End Sub ステップ実行ではエラーが出ません。普通に実行してみてください。 結果は[イミディエイトウィンドウ]に書き出されます。 [win2000/xl2000][winXP/xl2003]で同じ結果になりました。

goo397620
質問者

お礼

ご回答ありがとうございます。 普通に実行してみると、[イミディエイトウィンドウ]に A1B1 A2B2 13 型が一致しません。B3 13 型が一致しません。B4 A5B5 とでました。 そして、ステップ実行では、エラーはでませんでした。 不思議ですね。。。

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

>ANo.1のお礼 デバッグについて http://members.jcom.home.ne.jp/rex-uchida/vba110.htm エラー行にブレークポイントを設けてデバッグすればどうなるでしょうか。 ブレークポイントからF5キーで実行して、エラーなくマクロが実行されるかどうかを確認してください。 >ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A") 上記の書き方は、Excel2002でも問題なく使えていました。 A1形式に慣れているので、直観的に列をイメージし易く、良く使っていました。

goo397620
質問者

お礼

ご回答ありがとうございます。 >エラー行にブレークポイントを設けてデバッグすればどうなるでしょ >うか。 >ブレークポイントからF5キーで実行して、エラーなくマクロが実行さ >れるかどうかを確認してください。 今回の質問で例にあげさせて頂いたシンプルデータでは、エラー部にブレークポイントを付けると、エラーなく動きました! が、実は、ブレークポイントを付けたり、エラー部で、コメントアウトしてみたりしてテストしていました。 そうすると、次の ActiveChart.SeriesCollection(2).Values = Range(Cells(b_data, "B"), Cells(c_data, "B")) でエラーがでました。。。

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

>ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A") ←エラーがでます。 Cellsの列指定 "A" が影響してます。(環境にもよります。[xl2007]ではOK) ステップ実行だと通るからちょっとタチ悪いですね。 とりあえず ': ActiveChart.SeriesCollection(1).Name = Cells(a_data, 1) ' ←エラーがでます。 ActiveChart.SeriesCollection(2).Values = Range(Cells(b_data, 2), Cells(c_data - 1, 2)) ActiveChart.SeriesCollection(2).Name = Cells(b_data, 1) ActiveChart.SeriesCollection(3).Values = Range(Cells(c_data, 2), Cells(d_data - 1, 2)) ActiveChart.SeriesCollection(3).Name = Cells(c_data, 1) ': "A"を 1 に。"B"を 2 に修正してみてください。 余談ですが、変数を工夫すれば以下のような書き方もできます。 Sub try()   Dim ws As Worksheet   Dim r As Range     'Loop用Range型変数   Dim i As Long      'Loopカウンタ   Dim rs(1 To 4) As Long  'データの区分行   Set ws = Worksheets("Sheet1")   With ws     For Each r In .Range("A1", .Cells(.Rows.Count, 1))       Select Case r.Value       Case "a": rs(1) = r.Row       Case "b": rs(2) = r.Row       Case "c": rs(3) = r.Row       Case "d": rs(4) = r.Row       End Select     Next     With .ChartObjects.Add(30, 10, 500, 200).Chart       .ChartType = xlLineMarkers       .Axes(xlCategory, xlPrimary).CategoryType = xlAutomatic       For i = 1 To 3         With .SeriesCollection.NewSeries           .Values = ws.Range(ws.Cells(rs(i), 2), ws.Cells(rs(i + 1) - 1, 2))           .Name = ws.Cells(rs(i), 1)         End With       Next     End With   End With   Set ws = Nothing End Sub

goo397620
質問者

お礼

>"A"を 1 に。"B"を 2 に修正してみてください。 いろいろ試したものの中に、上記があったのですが、その時もエラーがでました。 しかし、職場で使ってる複雑なデータ(コード)でなく、今回例にあげさせて頂いたシンプルデータ(コード)でなら、エラーなく実行できました! tryプロシージャも試したところ、問題なく動きました! データ系列を複数作成するのに、For~Next使うことは、思いつかなかったので、勉強になりました! 本当にありがとうございました!

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

グラフはセルの範囲!のデータに基づいて描くものです。 セルの範囲にはB1:B6のように指定のほか、名前をつけて、その名前を使える場合があります(ほとんどの場合使えるでしょう) ForNextの内のコードの場合、セル範囲に名前をつけているのでしょうか?つけてないようですが。 >ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A") と質問にあるので、名前の仕組みを使う気があるものと思います。 それにdと名づける範囲はどうした、無いのでは? ーーーー 私なら、質問者の意向を尊重しつつ(囚われつつ)やる方法で、下記に参考にコードを挙げます。良いと思った点があれば今後の参考にしてください。 ーーー データ例  A2:B19 A B a 23 45 43 22 12 b 26 17 53 38 29 c 11 19 5 16 11 d 12 18 名前づけルーチンの私案 Sub test03() d = Range("B65536").End(xlUp).Row fst = "y" '最初のブロック pm = 3 '第3行目から始まる k = 1 '名前のサブ番号1から振る For i = 3 To d If Cells(i, "A") <> "" And fst = "n" Then Range(Cells(pm, "A"), Cells(i - 1, "B")).Name = "nm" & k pm = i k = k + 1 End If fst = "n" Next i Range(Cells(pm, "A"), Cells(i - 1, "B")).Name = "nm" & k End Sub これで、nm1-nm4間での名前の定義が出来る。 ーー グラフを描く Sub test04() For k = 1 To 4 ActiveSheet.ChartObjects.Add(30, (k - 1) * 250 + 50, 500, 200).Select ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=Range("nm" & k), PlotBy:=xlColumns ActiveChart.Location where:=xlLocationAsObject, Name:="sheet3" Next k End Sub テストデータでは4つのグラフが、Sheet3にカスケード型に並びました。 ほかに、問題点として、質問データだと、項目軸の項目名称が抽象的になる(欠点がある)わけですが、質問者はどう考えていたのかな。

goo397620
質問者

お礼

最初の質問がわかりづらくすいません。 もう少し詳しく説明させて頂くと、 B列のデータは数万行あります。 A列:項目名、B列:データとなります。 (例)aという項目名のデータが1~1000あり、項目名はA列のA1にしか入っていません。 下記のように項目毎に列が別れていればよかったのですが。 A B C D E F 1a 1 b 3 c 5 2 2 4 6 imogasiさんのコードのように「名前づけ」と「グラフ作成」をわけることができるということを知りました。 その方法で、新しく作ってみたいと思います。 ご回答ありがとうございました。

関連するQ&A