
初心者です。すいません質問させて下さい。
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
でデバックの画面に移ってしまいます。
どう記述が間違っているのかが知りたいです。
御教授お願い致します!
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
詳細の御回答ありがとうございます。
ActiveSheet.Shapes.Count ができたので
御指摘頂けるまでは、個別にShapeオブジェクトもカウントできるものだと思ってまいした。
Do Loop Until の構文で .Count ではなく .Select でError処理を交えながらとも考えましたが、御指摘の通り上達するまでは避けておきます。
知らない関数が沢山あって勉強になります。
ダブリと連番の中の欠番の処理に記述方法を悩んでいたのですが、
ダブリをあらためてカウントするメリットは、かなりありそうです。
御指導ありがとうございます!!!
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
御回答ありがとうございます。
出来ました!!
For Each ... Nextを使うに使えない気がしていたのですが、
card*というものがあったのですね!!
やはり基礎を全く知らないと進まなくなってしまいますね。。。
どうもありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Excel(エクセル) VBA カゥントで数値の範囲を規制 1 2022/05/20 06:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
テキストボックス中の文字列の...
-
実行時エラー 3265「要求された...
-
Excelでフィルタをかけると警告...
-
エクセルのVBAの標準モジュール...
-
ASP レコードセットしたオブジ...
-
VBAで Set wb = Sheets(1).Cop...
-
VBAで既に開いている別アプリケ...
-
EXCEL VBA オートシェイプナン...
-
エクセルVBAで配列内に空白デー...
-
VBScriptからDLL参照設定したい
-
[VBA]CDOメッセージ送信エラー
-
Excel VBAでWordの複数ファイル...
-
CreateObjectとGetObjectの違い
-
ExcelVBAでのNZ関数について
-
Excel2007 VBA ラジオボタン Ca...
-
VBAについてです。 初心者です...
-
VBで引数にDictionaryオブジェ...
-
VBAからPDFファイルにパスワー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
実行時エラー 3265「要求された...
-
エクセルのVBAの標準モジュール...
-
Excelでフィルタをかけると警告...
-
VBAで既に開いている別アプリケ...
-
テキストボックス中の文字列の...
-
EXCEL VBA オートシェイプナン...
-
VBAで Set wb = Sheets(1).Cop...
-
ExcelVBAでのNZ関数について
-
[VBA]CDOメッセージ送信エラー
-
VBAからPDFファイルにパスワー...
-
エクセルVBAでcode128のバー...
-
VBScriptからDLL参照設定したい
-
VBAについてです。 初心者です...
-
エクセルマクロエラー「'Cells'...
-
オブジェクトが見つかりません
-
エクセルVBAで配列内に空白デー...
-
Excel VBAでWordの複数ファイル...
-
VBScriptでファイルの日時順(降...
おすすめ情報