通过键入单个字母

时间:2015-08-10 12:31:59

标签: vba access-vba ms-access-2013

我正在寻求通过接受用户输入的单个字母来对Access(2013)表单的数据源进行排序的建议。这个问题更多的是关于设计策略而不是实际代码,尽管代码示例也可能有用。

我为客户开发的系统有一个带有数据集的表单,该数据集按照我定义的一组参数进行排序。所有工作和我为用户提供了一些实时求助方法,可以根据需要动态地重新排序绑定数据集。再一次,一切正常。

然而,他们之前使用的系统(绿屏终端应用程序是否相信)有一个功能,他们仍然非常想念,应该很容易实现。例如,该功能是在客户的屏幕上查看数据(这是一个非常长的列表),并且能够(1)键入姓氏的第一个字母以自动“向下滚动”到该部分列表的列表或(2)过滤第一个字母的数据集所有通过打字只是字母。我建议创建一个他们可以鼠标指向的未绑定字段,键入一个字母并按Enter键,但反馈是鼠标指向,单击,键入并按Enter键需要时间。我建议他们可以点击每个字母的按钮来实现相同的目标,但同样的反馈。

此功能确实有意义。如果您有一个包含8,000个客户的列表,并且您希望快速找到姓氏以字母“R”开头的人,那么将鼠标移动到滚动条并拖动对于整天这样做的用户来说会变得乏味。相反,如果他们只需按下R键直接进入那里就不错了。

我怀疑答案很简单,但我还没找到。是否在某处设置了一个keydown事件?

2 个答案:

答案 0 :(得分:1)

将表单的KeyPreview属性设置为True,以便在任何击键时为其提供第一个镜头,然后向表单添加KeyDown事件处理程序,如下所示(未经测试):

Private Sub Form_KeyDown(ByVal KeyCode As Integer, ByVal Shift As Integer)
    Dim NoTextBoxFocused As Boolean
    ' Make sure we're not stealing text from focused control
    NoTextBoxFocused = TypeName(ActiveControl) <> "TextBox" And _
                       TypeName(ActiveControl) <> "ComboBox"
    If KeyCode >= vbKeyA And KeyCode <= vbKeyZ And NoTextBoxFocused Then    
        ' PSEUDOCODE: Sort here, presumably case-insensitive;
        '   otherwise, check for capitals with this:
        '   If (Shift And acShiftMask) <> 0 Then

        KeyCode = 0     ' Turns off further handling
    End If
    ' Otherwise, fall through without doing anything else
End Sub

您可能还希望将此扩展为完整增量搜索,只有在用户输入他们想要的前几个字母时逐步搜索哪些过滤器时才会显示标签或文本框。如果显示文本框,请确保开始新的增量搜索(使用 Esc 或可能只是超时)。这应该有助于他们避免错过旧计划。

答案 1 :(得分:0)

只需使用任何控件(组合框,列表框,文本框,按钮),并在AfterUpdate或OnClick事件中使用ApplyFilter子句运行SQL LIKE嵌入式宏或vba RunCommand:

ComboBox: Letter Filter
Row Source: "A";"B";"C"; ... "Z"
Row Source Type: Value List

ApplyFilter
   Filter Name: <blank>
   Where Condition: ="[LastName] LIKE '" & [Forms]![Customers]![LetterFilter] & "*'"
   Control Name: <blank>

或者,使用相同的控件和触发事件,更新表单的recordsource:

 Recordsource: SELECT * FROM [Customers] 
              WHERE [LastName] LIKE [Forms]![Customers]![LetterFilter] & '*'

使用Left()

的OR同义查询
 Recordsource: SELECT * FROM [Customers] 
                  WHERE Left([LastName], 1) = [Forms]![Customers]![LetterFilter] 

VBA中的OR SQL查询:

 Forms!Customers.Form.RecordSource = "SELECT * FROM [Customers] 
                  WHERE [LastName] LIKE '" & [Forms]![Customers]![LetterFilter] & "*'"

请记住,设置RecordSource不在VBA中,而是在查询窗口中