蛇足その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
質問者
お礼
ありがとうございます。
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
ご回答を勘違いしてませんよね?
> 実は条件により、たとえば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
> 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
お礼
ありがとうございます。 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 ご回答を勘違いしてませんよね?