
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を見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
同じ名前(重複)かつ 日本 ア...
-
VLOOKUP FALSEのこと
-
if関数の複数条件について
-
excel
-
エクセルでフィルターした値を...
-
【マクロ】数式を入力したい。...
-
エクセルに写真が貼れない(フ...
-
エクセルシートの見出しの文字...
-
エクセルの文字数列関数と競馬...
-
表計算ソフトでの様式の呼称
-
エクセル
-
オートフィルターの絞込みをし...
-
グループごとの個数をカウント...
-
LibreOffice Clalc(またはエク...
-
【関数】=EXACT(a1,b1) a1とb1...
-
【Officer360?Officer365?の...
-
グループごとの人数のカウント
-
【関数】3つのセルの中で最新...
-
5単位で繰り上げしたい
-
【マクロ】【画像あり】4つの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
C言語 ファイル内のデータと入...
-
int型(2バイト)データの分割
-
ポインター引数の関数でコンパ...
-
C言語でのLinuxとwindows共通の...
-
Excel VBA グラフ作成のとき...
-
【Excel VBA】10進数を2進数に...
-
データの値の近いものをグルー...
-
C言語の構造体にてバブルソート...
-
CreateProcessでの環境変数の設...
-
PINVOKEで構造体配列をマーシャ...
-
c言語 Bitについて
-
ビットデータのチェック方法
-
C++/CLIのオブジェクト型配列
-
RegQueryValueExでの2バイト文字
-
'dataType' 引数を Null にする...
-
System.Collections.ArrayList ...
おすすめ情報