- ベストアンサー
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 でデバックの画面に移ってしまいます。 どう記述が間違っているのかが知りたいです。 御教授お願い致します!
- みんなの回答 (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
その他の回答 (1)
- xls88
- ベストアンサー率56% (669/1189)
実行時エラー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
お礼
御回答ありがとうございます。 出来ました!! For Each ... Nextを使うに使えない気がしていたのですが、 card*というものがあったのですね!! やはり基礎を全く知らないと進まなくなってしまいますね。。。 どうもありがとうございます!
お礼
詳細の御回答ありがとうございます。 ActiveSheet.Shapes.Count ができたので 御指摘頂けるまでは、個別にShapeオブジェクトもカウントできるものだと思ってまいした。 Do Loop Until の構文で .Count ではなく .Select でError処理を交えながらとも考えましたが、御指摘の通り上達するまでは避けておきます。 知らない関数が沢山あって勉強になります。 ダブリと連番の中の欠番の処理に記述方法を悩んでいたのですが、 ダブリをあらためてカウントするメリットは、かなりありそうです。 御指導ありがとうございます!!!