- ベストアンサー
複数のユーザーフォームに特定のボタンを非表示する方法
- エクセルのBOOKに複数のユーザーフォームがあり、それぞれにCommandButtonやComboBoxなどのコントロールが配置されています。
- 特定のユーザーフォーム上にTESTというCaptionを持つCommandButtonがあり、これを非表示にする方法を教えてください。
- 他の方法を探しています。より簡単かつ効率的な方法があれば教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
蛇足その2 毎回セットしない場合 Initializeに簡素にどのフォームも同じ内容ですむようにしておくなど 標準モジュールに Function SetControlVisible(ByRef mForm As UserForm, ByVal mControlType As String, ByVal mCaption As String, ByVal mVisible As Boolean) Dim ct As Control With mForm For Each ct In .Controls If TypeName(ct) = mControlType Then If ct.Caption = mCaption Then ct.Visible = mVisible End If End If Next End With End Function それぞれのフォームに Private Sub UserForm_Initialize() If True Then Call SetControlVisible(Me, "CommandButton", "TEST", False) End If End Sub
その他の回答 (4)
- kkkkkm
- ベストアンサー率66% (1725/2595)
これも蛇足ですが tmpはflgとかの方がコードを見たときにBooleanの変数だなという意識が働きます。
お礼
ありがとうございます!
- kkkkkm
- ベストアンサー率66% (1725/2595)
> ご回答を勘違いしてませんよね? はい、そのやり方がいいと思います。
お礼
大変ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1725/2595)
> 実は条件により、たとえばSheets("TEST01").Range("A1").ValueがTRUEのときは表示し、そうでないときは非表示にするという設定 単純な話として UserForm1.CommandButton1.Visible = False という事を全てのフォームのコマンドボタン(TEST)でやりたいということだと思うのですが そうした場合、Visible = FalseはデザインモードかInitializeでセットしないと二度目のフォーム起動時には有効にならないと思いますので、毎回ユーザーフォームを呼ぼ出す前に実行しないと駄目なのではないかという気がします。 単純な例です UserForm1.CommandButton1.Visible = False UserForm1.Show '設定有効 UserForm1.Show '設定無効 もしそうだとしたら、ユーザーフォームを起動するコードの前に、条件によってFalseにするフォーム指定のコード(サブルーチンにしても)を実行したたらいいのかなとも思えます。 蛇足ながら Sub testVisible01() If True Then Call SetVisible(UserForm1, False) End If UserForm1.Show If True Then Call SetVisible(UserForm2, False) End If UserForm2.Show '以降セットして2度目なのでFalseが無効になっている UserForm1.Show UserForm2.Show End Sub Function SetVisible(ByRef mForm As UserForm, ByVal mVisible As Boolean) Dim ct As Control With mForm For Each ct In .Controls If TypeName(ct) = "CommandButton" Then If ct.Caption = "TEST" Then ct.Visible = mVisible End If End If Next End With End Function
お礼
ありがとうございます。勉強になります。
- kkkkkm
- ベストアンサー率66% (1725/2595)
> UserForm_Initialize()で該当するコントロールを.Visible = Falseにすれば 一つ一つは面倒そうだなと前回の時に思ってまして、Visibleを一度にできないかとやってたら削除ができたという流れなので、多分前回のコードの一部変更でいけると思います。 Sub TestVisible() 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(ct.name).Visible = False End If End If Next ct End If Next i End With End Sub
お礼
早速ありがとうございます。非表示にできました。 ただ、これはオプションのセキュリティセンター、マクロの設定で「VBAプロジェクトオブジェクトモデルへのアクセスを信頼する」のチェックを入れてないと動かないですよね。 実は条件により、たとえばSheets("TEST01").Range("A1").ValueがTRUEのときは表示し、そうでないときは非表示にするという設定にする場合、このBOOKを使用する方のマクロの設定をいじれないですよね? そのような場合に対処できる方法を知りたいのです。よろしくお願いいたします。
お礼
ありがとうございます。 If True Then の部分を実際の条件にあわせて書き換えればよろしいのですね? Range("A1")がTRUEであれば表示、FALSEなら非表示なので、以下のようにしてみたところ期待通りとなりました。 Private Sub UserForm_Initialize() Dim tmp As Boolean tmp = Sheets("TEST01").Range("A1").Value Call SetControlVisible(Me, "CommandButton", "TEST", tmp) End Sub ご回答を勘違いしてませんよね?