重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

初心者です。すいません質問させて下さい。

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
でデバックの画面に移ってしまいます。
どう記述が間違っているのかが知りたいです。

御教授お願い致します!

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

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

お礼日時:2009/04/15 19:24

実行時エラー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
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/04/15 18:52

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