「これはヤバかったな」という遅刻エピソード

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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/01 00:24

ぅわ。

すみません。

>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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/01 23:36

>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]で同じ結果になりました。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/01 13:54

>ANo.1のお礼



デバッグについて
http://members.jcom.home.ne.jp/rex-uchida/vba110 …

エラー行にブレークポイントを設けてデバッグすればどうなるでしょうか。
ブレークポイントからF5キーで実行して、エラーなくマクロが実行されるかどうかを確認してください。


>ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A")
上記の書き方は、Excel2002でも問題なく使えていました。
A1形式に慣れているので、直観的に列をイメージし易く、良く使っていました。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>エラー行にブレークポイントを設けてデバッグすればどうなるでしょ
>うか。
>ブレークポイントからF5キーで実行して、エラーなくマクロが実行さ
>れるかどうかを確認してください。

今回の質問で例にあげさせて頂いたシンプルデータでは、エラー部にブレークポイントを付けると、エラーなく動きました!
が、実は、ブレークポイントを付けたり、エラー部で、コメントアウトしてみたりしてテストしていました。
そうすると、次の
ActiveChart.SeriesCollection(2).Values = Range(Cells(b_data, "B"), Cells(c_data, "B"))
でエラーがでました。。。

お礼日時:2008/11/01 13:48

>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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/01 13:30

グラフはセルの範囲!のデータに基づいて描くものです。


セルの範囲には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にカスケード型に並びました。
ほかに、問題点として、質問データだと、項目軸の項目名称が抽象的になる(欠点がある)わけですが、質問者はどう考えていたのかな。
    • good
    • 0
この回答へのお礼

最初の質問がわかりづらくすいません。
もう少し詳しく説明させて頂くと、
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さんのコードのように「名前づけ」と「グラフ作成」をわけることができるということを知りました。
その方法で、新しく作ってみたいと思います。

ご回答ありがとうございました。

お礼日時:2008/11/01 00:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報