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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CakePHP Undefined index
-
printfの%eで指数部分の桁数を...
-
C#でのswitch文
-
マクロ登録したピボットが重い...
-
データの値の近いものをグルー...
-
【Excel VBA】10進数を2進数に...
-
テキストファイルの結合について
-
FFTがうまくできない
-
Excel VBA グラフ作成のとき...
-
ポインター引数の関数でコンパ...
-
エクセルシート名の制限を変更...
-
10Mバイトて文字数に すると何...
-
C++ Builderで文字列をバイトに...
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
Excel 1セル当りの文字数が2...
-
DataGridViewの特定列に入力さ...
-
バイト列とバイナリ列の違いが...
-
char str[256]の256の意味は?
-
「1TB」のHDDに日本語は何字入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printfの%eで指数部分の桁数を...
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
CreateProcessでの環境変数の設...
-
RegQueryValueExでの2バイト文字
-
'dataType' 引数を Null にする...
-
【Excel VBA】10進数を2進数に...
-
matlabのソースコードをpython...
-
C++ multipart/form-data f
-
Cのプログラムがどうしても動き...
-
テキストファイルの結合について
-
int型(2バイト)データの分割
-
Excel VBA グラフ作成のとき...
-
C言語 構造体の名前欄?を小文...
-
C++/CLIのオブジェクト型配列
-
CSVファイルの行と列のセルって...
-
C言語 ファイル内のデータと入...
-
アプリケーション
おすすめ情報