1

には、セルをダブルクリックするとフォームが開くマクロがあります。

該当するセルがフォームが表示される範囲内にある場合、フォーム内で望ましくない選択が行われます。

どうすればこの選択を回避できますか?


barrowcの回答に関するhammejdpによる提案された編集から:

これ(つまり、BeforeDoubleClick イベント)を既に使用していますが、問題は解決しません。

Private Sub Workbook_SheetBeforeDoubleClick(ByVal sh As Object, ByVal target As Range, cancel As Boolean)

Call s_Click_DoubleClick(sh, target, cancel)

End Sub

Private Sub Workbook_SheetBeforeRightClick(ByVal sh As Object, ByVal target As Range, cancel As Boolean)

Call s_Click_DoubleClick(sh, target, cancel)

End Sub

Private Sub s_Click_DoubleClick(sh, target, cancel)

Application.ScreenUpdating = False

If sh.Name <> "Legende" Then
    cancel = True
    ' Maak gebruik van een range
    vRowCount = target.Rows.Count
    vColumnCount = target.Columns.Count
    f_Input.TextBox1.Value = vColumnCount
4

5 に答える 5

1

Cancel = True に設定しても問題は解決しません。エラーを再現するには、リスト ボックスを含むユーザー フォームを作成し、リスト ボックスの行ソースをセル範囲に設定します。ワークシートの BeforeDoubleClick イベントに、フォームを起動するコードを挿入します (例: frmMyform.Show)。ここで、フォームが表示される画面上の領域で、ワークシートの中央のどこかをダブルクリックします。ダブルクリックの 2 回目のクリックは、フォーム上で選択しようとしていると解釈されます。

問題を再現する別の方法を次に示します。上記と同じことを行いますが、ダブルクリック中に 2 回目のクリックを押したままにします。ご覧のとおり、ダブルクリックの 2 回目のクリックを離す前に、ユーザー フォームが表示されます。マウスを押したままマウスをドラッグすると、2 回目のクリックを離すと、マウス ポインタが置かれているリスト ボックス内の項目がマウスによって実際に選択されることがわかります。

要約すると、ポスターの意図は、セルをダブルクリックするとフォームが起動することです。その効果は、実際にフォームを起動することですが、ダブルクリックの 2 回目のクリックもそのフォームのクリックとして解釈します。Cancel = True に設定しても問題は解決しません。

于 2013-10-03T19:19:03.890 に答える
1

Cancel = True の設定は機能しません。この問題を解決するコードを次に示します。きれいではありませんが、機能します。まず、ユーザー フォームの初期化時に ListBox を無効にします。

Private Sub UserForm_Initialize()
    Me.listMyList.Enabled = False
End Sub

これにより、BeforeDoubleClick イベントからの 2 回目のクリックが、ユーザー フォームのリスト ボックスでの選択として解釈されなくなります (または、コントロールが有効になっていないため、2 回目のクリックがそのように解釈される機能がブロックされます)。次に、ユーザー フォームの MouseDown イベントで ListBox を有効にします。

Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Me.listMyList.Enabled = True
End Sub

きれいではありませんが、機能します。

于 2013-10-03T19:40:12.143 に答える
1

イベントを使用している場合は、イベント ハンドラ内で True にBeforeDoubleClick設定してみてくださいCancel

于 2012-10-28T02:13:38.450 に答える
0

これまでに見つけた最善の解決策は、フォームのコードの初期化ルーチンに小さな遅延を入れることです。

Private Sub UserForm_Initialize()

Application.Wait (現在 + #12:00:01 AM#)

サブ終了

時間の最小増分は 1 秒のようです。誰かがよりクリーンなソリューションを持っている場合、または遅延を 1 秒未満に短縮できる場合は、親切に共有してください。ここでは、フォームのクリックを防ぐために「スリープ」機能が機能しないことに注意してください (Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long))。

于 2016-05-02T19:52:41.853 に答える