在 VBA 中显示 Me.ComBox.Value 和 Me.ComboBox.RowSource 属性的设置

Posted

技术标签:

【中文标题】在 VBA 中显示 Me.ComBox.Value 和 Me.ComboBox.RowSource 属性的设置【英文标题】:Setting showing Me.ComBox.Value and Me.ComboBox.RowSource properties in VBA 【发布时间】:2015-05-13 08:11:13 【问题描述】:

我正在尝试在 Microsoft Access 中创建搜索表单。搜索表单将从客户端表中查找值。 我在 ComboBox 的 OnUpdate 事件中有以下代码,它被设置为在更新后自动更新表单数据。

Private Sub firstname_combo_Change()
Dim stringSQL As String
Dim RecordSt As Recordset
Dim dBase As Database
Dim strWhere As String
Dim varLname As Variant
Dim varClientID As Database
If Not IsNull(Me.firstname_combo.Column(1)) Then
    strWhere = "WHERE [Client_Data].[firstname]='" & Me.firstname_combo.Column(1) & "'"
    Me.lastname_cmbo.RowSource = "SELECT [Client_Data].[clientid], [Client_Data].[lastname] FROM Client_Data " & strWhere & ";"
    stringSQL = "SELECT TOP 1 [Client_Data].[lastname] FROM Client_Data " & varWhere & " ORDER BY [Client_Data].[lastname];"
    Set RecordSt = CurrentDb.OpenRecordset(stringSQL)
    RecordSt.MoveFirst
        'PLease note there would be multiple rows in the recordset but I need to select only the first row. However, varLname is populated correctly
    varClientID  = RecordSt.Fields("cleintid").Value
    varLname  = RecordSt.Fields("lastname").Value
    Me.lastname_cmbo.Value = varLname
         'MsgBox (varLname)
End If
End Sub

我在这里尝试做的是:

    firstname 中的OnChange,VBA 将查找与firstname 匹配的所有lastnames,并将其显示为lastname 字段中的可用选项。

    RecordSet 中取出第一行并将lastname_combo.value 填充到其中。

Access 当前正确设置了RowSource 属性,但拒绝填充控件的.Value 属性。所以我在 ComboBox 中得到一个空白的lastname(使用正确的 RowSource)。 请注意,每个 ComboBox 都已设置为“根据在我的组合框中选择的值在我的 From 上查找记录”。

【问题讨论】:

别忘了在RecordSt.MoveFirst 之前检查EOF 并且您可以使用stringSQL = "SELECT TOP(1) [Client_Data].[lastname] FROM Client_Data " & varWhere & " ORDER BY [Client_Data].[lastname];" 使您的自定义排序顺序只有一个有效的行;)。 @shA.t 我认为使用TOP 是个好主意。对问题进行了适当的更改。我认为这将是TOP 1 而不是TOP(1) 但是对于主要问题,循环遍历每个组合框可能需要做很多工作。我有 7 个组合框,需要为每个组合框执行此操作。有没有别的办法。 @shA.t 我发现了问题。这是解决方案:我的RowSource 查询选择了两个字段 - [Client_Data].[clientid][Client_Data].[lastname] 所以ComboBox 中每个索引的值不是lastname,而是clientid。将 Me.lastname_cmbo.Value = varLname 更改为 Me.lastname_cmbo.Value = varClientID - 添加此作为答案。 【参考方案1】:

看来我发现了问题。 我的RowSource 行是这样的

Me.lastname_cmbo.RowSource = "选择 [Client_Data].[clientid], [Client_Data].[lastname] FROM Client_Data " & strWhere & ";"

现在这意味着访问使用[Client_Data].[clientid] 字段作为ComboBox 中每个元素的值

替换

Me.lastname_cmbo.Value = varLname
Me.lastname_cmbo.Value = varClientID

现在它可以按预期工作了。

【讨论】:

以上是关于在 VBA 中显示 Me.ComBox.Value 和 Me.ComboBox.RowSource 属性的设置的主要内容,如果未能解决你的问题,请参考以下文章

VBA - Excel 中显示的 API 调用

如何在 VBA 中使用 wdBorderBottom,它显示为 Empty

如何在 VBA 访问的子窗体中显示 Select SQL 语句的结果?

如何在 VBA 中显示选择查询的行和列值

使用 VBA 在 Access 2010 中的表单上显示记录集

在访问 vba 的 excel 文件中未启用显示警报