これはうまくいくようですが、マウスクリックを検出するだけのコードがたくさんあるようです。たとえば、すべてのフォームコントロールを含むクラスを作成することができるはずだと思ったので、それぞれのコントロールを別々にチェックする必要はありません。私はその仕事をすることができず、私は誰かがこれを改善することを望んでいます。
ユーザーフォームでは、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
出典
2011-08-15 06:55:47
Roy
これはあるものの視力検査のいずれかのように聞こえます特定の番号が表示された場合は、マウスをクリックするように求められます。p – aevanko
これは良い質問です。 API関数がトリガーなどを設定している可能性があります。実際には、良い答えを楽しみにしています。ところで、最初の答えに対するあなたのコメントは、私の考えでは、問題をクリアするためにもあるかもしれません。 – Oneide