我的表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
答案 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)
。