VBA初心者です。Excel2003を使っています。
Sheet1に作りたいグラフがあります。
データは下記のとおりです。
ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A")のところで、「実行時エラー13 型が一致しません」とエラーがでます。
不思議なのは、昨日は動いていたのです。
なぜ、エラーが出るようになったのかわかりません。
ご教授よろしくお願いします。
AB
1a1
22
33
44
55
6b6
77
88
99
1010
11c11
1212
1313
1414
1515
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
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
お礼が遅くなりました。
ご回答ありがとうございます。
しかし、xls88さんのコードでも、同じところで、「実行時エラー13 型が一致」とでました。。。パソコンやソフトが悪いのでしょうか。。。
ただ、自分のコードもxls88さんのコードでも、ステップインで一行ずつ実行すると、エラーなしに実行できます。不思議です。
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
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]で同じ結果になりました。
ご回答ありがとうございます。
普通に実行してみると、[イミディエイトウィンドウ]に
A1B1
A2B2
13 型が一致しません。B3
13 型が一致しません。B4
A5B5
とでました。
そして、ステップ実行では、エラーはでませんでした。
不思議ですね。。。
No.4
- 回答日時:
>ANo.1のお礼
デバッグについて
http://members.jcom.home.ne.jp/rex-uchida/vba110 …
エラー行にブレークポイントを設けてデバッグすればどうなるでしょうか。
ブレークポイントから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"))
でエラーがでました。。。
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
>"A"を 1 に。"B"を 2 に修正してみてください。
いろいろ試したものの中に、上記があったのですが、その時もエラーがでました。
しかし、職場で使ってる複雑なデータ(コード)でなく、今回例にあげさせて頂いたシンプルデータ(コード)でなら、エラーなく実行できました!
tryプロシージャも試したところ、問題なく動きました!
データ系列を複数作成するのに、For~Next使うことは、思いつかなかったので、勉強になりました!
本当にありがとうございました!
No.2
- 回答日時:
グラフはセルの範囲!のデータに基づいて描くものです。
セルの範囲にはB1:B6のように指定のほか、名前をつけて、その名前を使える場合があります(ほとんどの場合使えるでしょう)
ForNextの内のコードの場合、セル範囲に名前をつけているのでしょうか?つけてないようですが。
>ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A")
と質問にあるので、名前の仕組みを使う気があるものと思います。
それにdと名づける範囲はどうした、無いのでは?
ーーーー
私なら、質問者の意向を尊重しつつ(囚われつつ)やる方法で、下記に参考にコードを挙げます。良いと思った点があれば今後の参考にしてください。
ーーー
データ例
A2:B19
AB
a23
45
43
22
12
b26
17
53
38
29
c11
19
5
16
11
d12
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さんのコードのように「名前づけ」と「グラフ作成」をわけることができるということを知りました。
その方法で、新しく作ってみたいと思います。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) 日付を重複させずに数えたい 4 2022/12/04 16:26
- Visual Basic(VBA) vbaを早くしたい 5 2022/09/09 10:58
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
stable diffusionのエラー
-
C言語でのLinuxとwindows共通の...
-
テキストファイルの結合について
-
linuxのシェルでファイル名に先...
-
RegQueryValueExでの2バイト文字
-
C言語 構造体の名前欄?を小文...
-
c言語 Bitについて
-
ホスト名の取得&表示について
-
エクセルVBA:日付データの変換...
-
エクセルシート名の制限を変更...
-
Excel VBA メール作成について ...
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
ListView重複データ削除
-
COleDateTime とtime_t
-
全角カタカナチェックについて
-
char str[256]の256の意味は?
-
CGI(Perl)の文字化けについて
-
Excel 1セル当りの文字数が2...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printfの%eで指数部分の桁数を...
-
stable diffusionのエラー
-
ポインター引数の関数でコンパ...
-
エクセルVBA:日付データの変換...
-
【Excel VBA】10進数を2進数に...
-
'dataType' 引数を Null にする...
-
C#でのswitch文
-
int型(2バイト)データの分割
-
Excel VBA グラフ作成のとき...
-
マクロ登録したピボットが重い...
-
C言語でのLinuxとwindows共通の...
-
CakePHP Undefined index
-
Cのプログラムがどうしても動き...
-
linuxのシェルでファイル名に先...
-
データの値の近いものをグルー...
-
VisualBasicでレジストリキーの...
-
C言語 ファイル内のデータと入...
-
sort関数でひらがなとカタカナ...
-
c言語 配列から数字だけをint型...
-
C++/CLIのオブジェクト型配列
おすすめ情報