36個のボタンがあるvbauserFormがあります。スプレッドシートの1つの値が特定の数に達したときに、すべてのボタンを無効にしたいのですが。現在、ボタンをクリックするたびに、参照しているスプレッドシートの数値が1つずつ上がります。数が3に達したら、すべてのボタンを無効にします。
3 に答える
すべてのボタンをFrameオブジェクトに配置してから、フレーム全体を無効にします。これにより、フレーム内のすべてが無効になります。
または、最後の質問に基づいて、次のコードを使用できます。
Dim counter As Integer
Private Sub btn1_Click()
CaptureImage (btn1.Name)
End Sub
Private Sub btn2_Click()
CaptureImage (btn2.Name)
End Sub
Private Sub btn3_Click()
CaptureImage (btn3.Name)
End Sub
Private Sub UserForm_Activate()
counter = 1
End Sub
Private Sub CaptureImage(ByVal btnName As String)
Controls("capture" & counter).Picture = Controls(btnName).Picture
counter = counter + 1
If counter > 3 Then
DisableButtons
End If
End Sub
Private Sub DisableButtons()
Dim ctl As Control
For Each ctl In UserForm1.Controls
If Left(ctl.Name, 3) = "btn" Then
ctl.Enabled = False
End If
Next
End Sub
理想的には、Thomasが提案するように、コントロールオブジェクトをボタンにキャストすることをお勧めします。
Dim oCtrl As Control
Dim oButton As CommandButton
For Each oCtrl In MyForm.Controls
If oCtrl.Tag = "SomeValue" Then
Set oButton = oCtrl
oButton.Enabled = False
End If
Next
Set oCtrl = Nothing
Set oButton = Nothing
無効にしたくない他のボタンがある場合、解決策はTagプロパティを使用することです。一緒に有効または無効にするすべてのボタンのTagプロパティを同じ値に設定します。次に、その値を一目で確認し、それらを有効/無効にすることができます。別の方法は、それらに同じプレフィックスまたはサフィックスという名前を付けて、コードでそれを確認することです。
添加
ところで、ControlオブジェクトにはEnabledプロパティがありません。したがって、コマンドボタンに「キャスト」して無効にする必要があります。どうやらControlオブジェクトにはEnabledプロパティがありますが、インテリセンスでは表示されません。ただし、それでも、コントロールをコマンドボタンにキャストして、それが確実に機能するようにする必要があります。これが拡張バージョンです:
Dim oCtrl As Control
Dim oButton As CommandButton
For Each oCtrl In MyForm.Controls
If oCtrl.Tag = "SomeValue" Then
On Error Resume Next
Set oButton = oCtrl
On Error GoTo 0
If Not oButton Is Nothing Then
oButton.Enabled = False
End If
End If
Next
Set oCtrl = Nothing
Set oButton = Nothing
@マイク:試してみてください-
If Sheets("Sheet1").Range("A1").Value = 3 Then
UserForm1.CommandButton1.Enabled = True
Else
UserForm1.CommandButton1.Enabled = False
End If
Sheet1
( 、、をワークブックに適したものにA1
置き換えます)UserForm1
CommandButton1