使用条件在列表中显示表字段

时间:2014-05-23 16:12:42

标签: vba access-vba

我的表x包含id和name字段。 我想在列表中选择名称时显示id。

我写了这个,但它不起作用。 错误消息是:BOF或EOF或当前记录已被删除。 请求的操作需要当前记录。

我认为简单的默认记录是记录1,所以有什么不对?!

Dim con As Connection
Dim rs As New Recordset
Set con = CurrentProject.Connection

rs.Open "select id from tbl where namen = '" & list1.ListIndex & "'", con, adOpenDynamic, adLockOptimistic
ttt.SetFocus
ttt.Text = rs!id

非常感谢pteranodon的帮助 我把代码改成了这个

Private Sub list1_Click()
Dim strSQL As String
strSQL = "select id from tbl where namen = '" & list1.Value & "'"
ttt.SetFocus
ttt = DLookup("id", "tbl", "namen='" & list1.Value & "'")
rs.Open strSQL, con, adOpenDynamic, adLockOptimistic
End Sub

但我得到了这个消息 对象打开时不允许操作?

我没有使用vba代码将项目添加到list1我只是按照将list1添加到表单后显示的窗口cus我也有代码问题

如果您愿意,可以添加完整的代码1和2

1 个答案:

答案 0 :(得分:0)

您想要列表框的值,而不是ListIndex。 ListIndex包含一个数字,列表框中当前选择的从零开始的索引。您正在传递类似select id from tbl where namen = '13'的内容,因为没有记录匹配,您会收到该错误消息。

我真的建议使用字符串来保存任何构造的SQL,以便您可以轻松地调试它。如果你有

Dim strSQL As String
strSQL = "select id from tbl where namen = '" & list1.Value & "'"
Debug.Print strSQL
rs.Open strSQL, con, adOpenDynamic, adLockOptimistic

它更容易阅读,更容易调试。此外,您打算在打开记录集后立即检查rs.BOF和rs.EOF:

If Not (rs.BOF Or rs.EOF) Then
    'Do stuff
Else
    'No records in recordset
End

与VB文本框不同,除非文本框具有焦点,否则您无法在VBA文本框中使用.Text。使用ttt.Value(或仅使用ttt)。

如果您只查找这样的单个值,则可以替换所有代码:

Private Sub list1_Click()
    ttt = DLookup("id", "tbl", "namen='" & list1.Value & "'")
End Sub

使用DLookup而不是自己手动打开记录。我还将通过列表框向导返回。如果您将ID放在第一列中,而名称放在第二列中,则隐藏第一列(向导将帮助您执行此操作),列表将显示名称,但存储< / strong> id。那么你甚至不需要额外的文本框。该ID存储在List1.Value中,名称可用List1.Column(1)