- ベストアンサー
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
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
データ表がずれて表示されるので、整形してみました。 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
その他の回答 (5)
- end-u
- ベストアンサー率79% (496/625)
ぅわ。すみません。 >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
お礼
ご回答ありがとうございます。 修正し、実行すると問題なく動きました! 本当にありがとうございます!
- end-u
- ベストアンサー率79% (496/625)
>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]で同じ結果になりました。
お礼
ご回答ありがとうございます。 普通に実行してみると、[イミディエイトウィンドウ]に A1B1 A2B2 13 型が一致しません。B3 13 型が一致しません。B4 A5B5 とでました。 そして、ステップ実行では、エラーはでませんでした。 不思議ですね。。。
- xls88
- ベストアンサー率56% (669/1189)
>ANo.1のお礼 デバッグについて http://members.jcom.home.ne.jp/rex-uchida/vba110.htm エラー行にブレークポイントを設けてデバッグすればどうなるでしょうか。 ブレークポイントからF5キーで実行して、エラーなくマクロが実行されるかどうかを確認してください。 >ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A") 上記の書き方は、Excel2002でも問題なく使えていました。 A1形式に慣れているので、直観的に列をイメージし易く、良く使っていました。
お礼
ご回答ありがとうございます。 >エラー行にブレークポイントを設けてデバッグすればどうなるでしょ >うか。 >ブレークポイントからF5キーで実行して、エラーなくマクロが実行さ >れるかどうかを確認してください。 今回の質問で例にあげさせて頂いたシンプルデータでは、エラー部にブレークポイントを付けると、エラーなく動きました! が、実は、ブレークポイントを付けたり、エラー部で、コメントアウトしてみたりしてテストしていました。 そうすると、次の ActiveChart.SeriesCollection(2).Values = Range(Cells(b_data, "B"), Cells(c_data, "B")) でエラーがでました。。。
- end-u
- ベストアンサー率79% (496/625)
>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
お礼
>"A"を 1 に。"B"を 2 に修正してみてください。 いろいろ試したものの中に、上記があったのですが、その時もエラーがでました。 しかし、職場で使ってる複雑なデータ(コード)でなく、今回例にあげさせて頂いたシンプルデータ(コード)でなら、エラーなく実行できました! tryプロシージャも試したところ、問題なく動きました! データ系列を複数作成するのに、For~Next使うことは、思いつかなかったので、勉強になりました! 本当にありがとうございました!
- imogasi
- ベストアンサー率27% (4737/17069)
グラフはセルの範囲!のデータに基づいて描くものです。 セルの範囲には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にカスケード型に並びました。 ほかに、問題点として、質問データだと、項目軸の項目名称が抽象的になる(欠点がある)わけですが、質問者はどう考えていたのかな。
お礼
最初の質問がわかりづらくすいません。 もう少し詳しく説明させて頂くと、 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さんのコードのように「名前づけ」と「グラフ作成」をわけることができるということを知りました。 その方法で、新しく作ってみたいと思います。 ご回答ありがとうございました。
お礼
お礼が遅くなりました。 ご回答ありがとうございます。 しかし、xls88さんのコードでも、同じところで、「実行時エラー13 型が一致」とでました。。。パソコンやソフトが悪いのでしょうか。。。 ただ、自分のコードもxls88さんのコードでも、ステップインで一行ずつ実行すると、エラーなしに実行できます。不思議です。