これは問題なく動作するように見えますが、マウスのクリックを検出するためだけに多くのコードのように見えます。たとえば、すべてのフォーム コントロールを含むクラスを作成できるはずだと考えたので、各種類のコントロールを個別にチェックすることなく、それらのいずれかのクリックを一度に検出できました。私はそれを機能させることができませんでした。誰かがこれを改善できることを願っています。
ユーザーフォームでは、mapFrame という名前の大きなフレームは、任意の数の他のフレームとラベルを保持し、含まれているすべてのフレームは、任意の数の他のフレームとラベルを保持できますが、ネストが進むほど深くなります。ループを開始し (この場合、ループはコントロールを点滅させますが、他のループである可能性があります)、ユーザーが含まれているフレームまたはラベルのいずれかをクリックしてループからの終了を通知するのを待ちます。 . クリックされたコントロールの名前も取得したいと思います。
私は therealmarv の提案を受け、クリックを使用して、ループ内でテストされるパブリック ブール値を設定しました。
新しいクラス モジュール:
Option Explicit
Public WithEvents classLabels As msForms.Label
Private Sub classLabels_Click()
clickedControlName = "" '<== Public String
With classLabels
If .Parent.Name = "mapFrame" Or _
.Parent.Parent.Name = "mapFrame" Then
isClickDetected = True '<== Public Boolean
clickedControlName = .Name
End If
End With
End Sub
別の新しいクラス モジュール:
Option Explicit
Public WithEvents classFrames As msForms.Frame
Private Sub classFrames_Click()
clickedControlName = "" '<== Public String
With classFrames
If .Name = "mapFrame" Or _
.Parent.Name = "mapFrame" Or _
.Parent.Parent.Name = "mapFrame" Then
isClickDetected = True '<== Public Boolean
clickedControlName = .Name
End If
End With
End Sub
フォーム モジュール内:
Option Explicit
Dim frames() As New clsFrames
Dim labels() As New clsLabels
Private Sub createFrameListeners()
Dim ctl As msForms.Control
Dim frameCount as Long
For Each ctl In Me.Controls
' Debug.Print TypeName(ctl): Stop
If TypeName(ctl) = "Frame" Then
frameCount = frameCount + 1
ReDim Preserve frames(1 To frameCount)
'Create the Frame Listener objects
Set frames(frameCount).classFrames = ctl
End If
Next ctl
End Sub
Private Sub createLabelListeners()
Dim ctl As msForms.Control
Dim LabelCount as Long
For Each ctl In Me.Controls
' Debug.Print TypeName(ctl): Stop
If TypeName(ctl) = "Label" Then
LabelCount = LabelCount + 1
ReDim Preserve labels(1 To LabelCount)
'Create the Label Listener objects
Set labels(LabelCount).classLabels = ctl
End If
Next ctl
End Sub
Function blinkThisControl(ctrl As Control, ByVal blinkCount As Long)
isClickDetected = False
Dim i As Integer
For i = 1 To blinkCount
' <blink ctrl twice>
DoEvents
If isClickDetected Then Exit Function
'name of clicked control will be in clickedControlName
Next i
End Function
Private Sub userform_initialize()
Call createFrameListeners
Call createLabelListeners
' do other stuff
End Sub