MS Access 多控制 KeyPress CTRL+A 处理程序

Pat*_*Pat 1 ms-access vba ms-access-2016

我有一个包含 10 多个文本控件的 Access 数据库。我想要一些代码来处理 CTRL + A KeyPress 事件。通常,在 Access 中按 CTRL + A 时,这将选择所有记录。我的最终目标是让 CTRL + A 仅选择该控件的文本(例如在浏览器的 URL 栏中按 CTRL + A,它仅选择该文本),以便我只能删除该控件的文本。我检查了这篇文章,因为我想要一些可以处理任何文本框的东西(处理每个文本框的 KeyPress = 60+ 行代码)。有什么办法可以让我有一个 for-next 循环?

Function HandleKeyPress(frm As Form, KeyAscii As Integer, ByVal e As KeyPressEventArgs) 'should it be a function or a sub?
    For Each ctl In Me.Controls
        If KeyAscii = 1 Then    'I think this is CTRL + A?
            e.Handled = True    'Stop this keypress from doing anything in access
            focused_text_box.SelStart = 0
            focused_text_box.SelLength = Len(focused_text_box.Text)
        End If
    Next
End Function
Run Code Online (Sandbox Code Playgroud)

除此之外,我如何将文本框的名称传递给这个子/函数?

注意:如果您还没有注意到,我仍然是 VBA/Access 的菜鸟。

Eri*_*k A 6

您当前的方法将不起作用,因为它包含多种在 VBA 中不起作用的东西(如 June7 所指出的),并且由于表单 keydown 事件优先于 textbox keydown 事件

您可以改用以下代码(受SU 上此答案启发):

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyA And Shift = acCtrlMask Then 'Catch Ctrl+A
        KeyCode = 0 'Suppress normal effect
        On Error GoTo ExitSub 'ActiveControl causes a runtime error if none is active
        If TypeOf Me.ActiveControl Is TextBox Then
            With Me.ActiveControl
                .SelStart = 0
                .SelLength = Len(.Text)
            End With
        End If
    End If
ExitSub:
End Sub
Run Code Online (Sandbox Code Playgroud)

Form.KeyPreview使用 VBA 或仅使用属性窗格将属性设置为 True很重要,以允许此函数优先于默认行为。