VBA - 访问值集合

时间:2009-09-04 07:57:40

标签: ms-access vba access-vba

我有两种访问表单。 frm_Main和frm_Sub,根据主窗体的选择有条件地显示数据。我需要为frm_Sub中显示的项目编写一个select all函数。在VBA中有一种方法可以获取当前在frm_Sub中显示的id列表吗?

例如,如果我这样做

me.controls("Svc_Tag_Dim_Tag_Num").value

我在frm_Sub中获取其中一行的值,有没有办法获取所有值?

也许我可以用不同的方式提问。我有一个显示为列表视图的表单,在VBA中,有没有办法从特定列中获取所有值?

2 个答案:

答案 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来解决这个问题。在这种情况下,您可以使用串联函数,而不必与表单/子表单绑定。