- ベストアンサー
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になってしまいます。 どう書けばいいのでしょうか?
- みんなの回答 (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でわからないと言ったのは上記のコードのやり方です。
その他の回答 (5)
- kkkkkm
- ベストアンサー率66% (1719/2589)
なんかごぞごぞやっているうちに削除できました。 ただし、フォームを開いてすぐだとエラーになります。再度実行するかフォームを開く前だと正常に終わります。 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
お礼
ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> 閉じたままなのですが。 そうですか。どちらにしても削除できるのはControls.Addで動的に作成したコントロールだけだと思います。
お礼
ありがとうございました。そういうものなんですね。勉強になりました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> .Deleteでエラーになってしまいました。 開いているフォームのコントロールを削除できるのはControls.Addで動的に作成したコントロールだけだと思います。
お礼
ありがとうございます。ユーザーフォームは呼び出していません。閉じたままなのですが。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> ユーザーフォーム上の特定のコマンドボタンを削除する フォームそのものや特定のフォーム上のコントロール全てを削除することはできますが、特定のコントロールについてはわかりません。 Initialize()で該当するコントロールを.Visible = Falseにしておけばいかがでしょう。
お礼
ありがとうございます。 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)
フォームモジュールがいくつあるか数えます。 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
お礼
さっそくありがとうございます。カウントできました。 ただほんとにやりたかったことはカウントではなく、ユーザーフォーム上の特定のコマンドボタンを削除することでした。最初からきちんと書かずにすみません。 以下のようにしてみましたがエラーになってしまいました。どこを直せばよろしいのでしょうか? 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
お礼
ありがとうございます。 いま、この方法でやってみたところうまく削除できました! ありがとうございます。