• ベストアンサー

Excel マクロ cstr を使ったcountができない

初心者です。すいません質問させて下さい。 Excelのシート上に、オートシェイプを"card"& CStr(Num)として、 連番を付けています。連番の上限は200までにしてあります。 例えば"card1"で名前ボックスに入力すると検索できる一個目の"card1"のオートシェイプが検索されます。 またコピーペーストすると、同じ"card1"になります。 ここで、シート上のそのオートシェイプが何個あるか数えたいのですが、連番の数では判定できないので、マクロで考えてみましたが、うまくいきません。 Sub testcc() Dim Num As Integer, Crd As Integer, Sum As Integer Sum = 0 Num = 1 Do Crd = ActiveSheet.Shapes("card" & CStr(Num)).Count Sum = Sum + Crd Num = Num + 1 Loop Until Num = 200 Range("A1").Value = Sum End Sub 必ず、 Crd = ActiveSheet.Shapes("card" & CStr(Num)).Count でデバックの画面に移ってしまいます。 どう記述が間違っているのかが知りたいです。 御教授お願い致します!

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 もし、ある程度をご質問者さんご自身で考えたのなら、そのアイデアは悪くない、というか、私には、思いつかないコードでした。ただ、それを実際に通るコードにするには、なかなか慣れないとできません。 ポイント: ・On Error GoTo ErrHandler を本当の使いこなしは難しいです。VBAの上級コースになります。  今のコードでは、いずれにしてもエラーの発生は避けようがありません。 ・"card"& CStr(Num) のCStr の文字化は、あまり気にしなくてよいです。多少、文字化したほうが速いといいますが、実感はありません。「&」 で、型のキャスティングという機能で、文字に変わります。 ・ActiveSheet.Shapes("card" & CStr(Num)).Count もともと、Shapeオブジェクトに、Count プロパティというものはありません。 ・なお、これは、オートシェイプの自体の数を数えるものでないことは、よく考えれば分かるはずです。 連番がきれたら、そこでとまります。連番でおなじ名前を持つものも、カウントされません。 --------------------------------------------------------- Sub TestCount()   Dim Num As Integer, Crd As Shape, Sum As Integer   On Error GoTo ErrHandler   Sum = 0   Num = 1   Do     Set Crd = ActiveSheet.Shapes("card" & Num)     Num = Num + 1     Sum = Sum + 1   Loop Until Num = 200 ErrHandler:   Range("A1").Value = Sum End Sub ----------------------------------------------------------- 連番に狂いがある場合、それを修正することはできませんが、このようにして検出することは可能です。 オーバーフローが出たら、stock の数を増やしてください。なお、以下の場合、Like 演算子を使う場合は、できれば、Option Compare Text モードの方がよいと思います。以下では、InStr 関数のTextCompare モードで検出しています。 Sub TestCount2()   Dim shp As Variant   Dim stock(1000) As String '上限の数を入れる   Dim i As Variant   Dim j As Long   Dim ret As Variant   Dim buf As String   For Each shp In ActiveSheet.Shapes     If InStr(1, shp.Name, "card", vbTextCompare) > 0 Then       ret = Application.Match(shp.Name, stock(), 0)       stock(i) = shp.Name       i = i + 1       If i > UBound(stock()) Then i = "オーバーフロー": Exit For       If IsNumeric(ret) Then         buf = buf & ", " & shp.Name         j = j + 1       End If     End If   Next   Range("A2").Value = "総 数 :" & i   Range("A3").Value = "ダブリ: " & j   Range("A4").Value = Trim(Mid(buf, 2)) End Sub

tkh_tkh
質問者

お礼

詳細の御回答ありがとうございます。 ActiveSheet.Shapes.Count ができたので 御指摘頂けるまでは、個別にShapeオブジェクトもカウントできるものだと思ってまいした。 Do Loop Until の構文で .Count ではなく .Select でError処理を交えながらとも考えましたが、御指摘の通り上達するまでは避けておきます。 知らない関数が沢山あって勉強になります。 ダブリと連番の中の欠番の処理に記述方法を悩んでいたのですが、 ダブリをあらためてカウントするメリットは、かなりありそうです。 御指導ありがとうございます!!!

その他の回答 (1)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

実行時エラー438:オブジェクトは、このプロパティまたはメソッドをサポートしていません。 総当たりで、名前がcard*のShapeを積算すればどうでしょうか。 Dim shp As Shape Num = 0 For Each shp In ActiveSheet.Shapes If shp.Name Like "card*" Then Num = Num + 1 End If Next shp MsgBox Num

tkh_tkh
質問者

お礼

御回答ありがとうございます。 出来ました!! For Each ... Nextを使うに使えない気がしていたのですが、 card*というものがあったのですね!! やはり基礎を全く知らないと進まなくなってしまいますね。。。 どうもありがとうございます!

関連するQ&A