我有两种访问表单。 frm_Main和frm_Sub,根据主窗体的选择有条件地显示数据。我需要为frm_Sub中显示的项目编写一个select all函数。在VBA中有一种方法可以获取当前在frm_Sub中显示的id列表吗?
例如,如果我这样做
me.controls("Svc_Tag_Dim_Tag_Num").value
我在frm_Sub中获取其中一行的值,有没有办法获取所有值?
也许我可以用不同的方式提问。我有一个显示为列表视图的表单,在VBA中,有没有办法从特定列中获取所有值?
答案 0 :(得分:1)
如果我理解你的问题,你应该能够使用Column(x)访问控件中的ID值,其中x表示控件的行源列从0开始。例如,如果ID在列0中,宽度为0它将被隐藏起来,但VBA可以“看到”它作为me.controls。[“Svc_Tag_Dim_Tag_Num”]。column(0)。
要直接从表单的类模块外部获取子表单的记录源,您可以创建一个类似的函数:
Public Function test_get_sub_form_record_set() As String
Dim dbs As Database
Dim rst As Recordset
Dim xcat As String
Set dbs = CurrentDb()
Set rst = [Forms]![Your Main Form Name]![Your Sub-form Name].[Form].RecordsetClone
If rst.RecordCount > 0 Then
rst.MoveFirst
xcat = rst!ID
rst.MoveNext
Do While Not rst.EOF
xcat = xcat & ", " & rst!ID
Loop
Else
xcat = ""
End If
test_get_sub_form_record_set = xcat
rst.Close
Set dbs = Nothing
End Function
这将被包含在一个单独的模块中,并且在被调用时将返回一个以逗号分隔的连接ID列表。
答案 1 :(得分:1)
另一种选择是编写一个连接子窗体显示的记录集的PK的函数。假设您的主要表单是公司,您的子表单列出了员工。您有一个LinkMasterFields和子窗体控件的LinkChildFields属性将是CompanyID(Company表的PK,Employees表的FK)。
因此,当父项位于特定公司记录上时,获取与子表单中显示的记录相同的记录集:
Dim db As DAO.Database
Dim strSQL As String
Dim rst As DAO.Recordset
Dim strEmployeeIDList As String
Set db = CurrentDB
strSQL = "SELECT Employees.* FROM Employees WHERE CompanyID="
strSQL = strSQL & Me!CompanyID & ";"
Set rs = db.OpenRecordset(strSQL)
If rs.RecordCount > 0 Then
With rs
.MoveFirst
Do Until .EOF
strEmployeeIDList = strEmployeeIDList & ", " & !CompanyID
.MoveNext
Loop
End With
strEmployeeIDList = Mid(strEmployeeIDList, 3)
End If
rs.Close
Set rs = Nothing
Set db = Nothing
现在,为什么要这样做而不是遍历已经打开的记录集(即子窗体的RecordsetClone)?我不知道 - 只是可能存在您不希望将查找绑定到特定表单/子表单的情况。你可以通过使你的连接函数接受一个记录集,并将它传递给我在上面声明的记录集,或者传递子表单的RecordsetClone来解决这个问题。在这种情况下,您可以使用串联函数,而不必与表单/子表单绑定。