• ベストアンサー

ExcelVBAでUserFormのカウント

ユーザーフォームはどれも開いていない状態です。 カウントしようと Sub test01() Dim i As Long Dim uf As UserForm For Each uf In UserForms i = i + 1 Next MsgBox i End Sub としてみましたが0になってしまいます。 どう書けばいいのでしょうか?

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.6

Set mFormも煩わしい感じなので直接以下のようにしてもいけます。 Sub Test022() Dim i As Long Dim ct As Control With ActiveWorkbook.VBProject For i = 1 To .VBComponents.Count If .VBComponents(i).Type = 3 Then For Each ct In .VBComponents(i).Designer.Controls If TypeName(ct) = "CommandButton" Then If ct.Caption = "TEST" Then .VBComponents(i).Designer.Controls.Remove (ct.name) End If End If Next ct End If Next i End With End Sub なお、蛇足かもしれませんが(回答で分からないと言ったりできないと言ったりして矛盾ぽいと思われたかもしれません) 削除できるのはControls.Addで動的に作成したコントロール というのは通常のUserForm1とかUserFormsなどでアクセスした場合のことで、No2でわからないと言ったのは上記のコードのやり方です。

emaxemax
質問者

お礼

ありがとうございます。 いま、この方法でやってみたところうまく削除できました! ありがとうございます。

その他の回答 (5)

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.5

なんかごぞごぞやっているうちに削除できました。 ただし、フォームを開いてすぐだとエラーになります。再度実行するかフォームを開く前だと正常に終わります。 Sub Test02() Dim i As Long Dim ct As Control Dim mForm As UserForm With ActiveWorkbook.VBProject For i = 1 To .VBComponents.Count If .VBComponents(i).Type = 3 Then Set mForm = ThisWorkbook.VBProject _ .VBComponents(i).Designer For Each ct In mForm.Controls If TypeName(ct) = "CommandButton" Then If ct.Caption = "TEST" Then mForm.Controls.Remove (ct.name) End If End If Next ct End If Set mForm = Nothing Next i End With End Sub

emaxemax
質問者

お礼

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

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.4

> 閉じたままなのですが。 そうですか。どちらにしても削除できるのはControls.Addで動的に作成したコントロールだけだと思います。

emaxemax
質問者

お礼

ありがとうございました。そういうものなんですね。勉強になりました。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.3

> .Deleteでエラーになってしまいました。 開いているフォームのコントロールを削除できるのはControls.Addで動的に作成したコントロールだけだと思います。

emaxemax
質問者

お礼

ありがとうございます。ユーザーフォームは呼び出していません。閉じたままなのですが。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.2

> ユーザーフォーム上の特定のコマンドボタンを削除する フォームそのものや特定のフォーム上のコントロール全てを削除することはできますが、特定のコントロールについてはわかりません。 Initialize()で該当するコントロールを.Visible = Falseにしておけばいかがでしょう。

emaxemax
質問者

お礼

ありがとうございます。 Initialize()で該当するコントロールを.Visible = Falseに も考えましたが、不必要なボタンを削除しようと思いました。それで」全部のユーザーフォームが無理ならほひとつづつではと思い以下のように書きましたが.Deleteでエラーになってしまいました。 Sub testUF() Dim ct As Control With UserForm1 For Each ct In .Controls If TypeName(ct) = "CommandButton" Then If ct.Caption = "TEST" Then ct.Delete 'ここでエラー End If End If Next End With End Sub

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.1

フォームモジュールがいくつあるか数えます。 VBEでフォームツリーにあるユーザーフォームの数です。 オプションのセキュリティセンター、マクロの設定で VBAプロジェクトオブジェクトモデルへのアクセスを信頼する のチェックを入れてください。 Sub Test() Dim i As Long, mCount As Long With ActiveWorkbook.VBProject For i = 1 To .VBComponents.Count If .VBComponents(i).Type = 3 Then mCount = mCount + 1 End If Next i MsgBox mCount End With End Sub 参考: http://officetanaka.net/excel/vba/vbe/04.htm

emaxemax
質問者

お礼

さっそくありがとうございます。カウントできました。 ただほんとにやりたかったことはカウントではなく、ユーザーフォーム上の特定のコマンドボタンを削除することでした。最初からきちんと書かずにすみません。 以下のようにしてみましたがエラーになってしまいました。どこを直せばよろしいのでしょうか? Sub Test02() Dim i As Long, mCount As Long Dim ct As Control With ActiveWorkbook.VBProject For i = 1 To .VBComponents.Count If .VBComponents(i).Type = 3 Then For Each ct In .VBComponents(i).Controls If ct.Caption = "TEST" Then mCount = mCount + 1 ct.Delete End If Next ct End If Next i MsgBox mCount End With End Sub

関連するQ&A