2009-09-04 71 views
0

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

例如,如果我这样做

me.controls("Svc_Tag_Dim_Tag_Num").value 

我得到行的一个值在frm_Sub,有没有办法让所有的值?

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

回答

1

另一种选择是编写串接子窗体显示记录的的PKS的功能。假设您的主要表单是公司,您的子表单列出了员工。您将有子窗体控件的LinkMasterFields和LinkChildFields属性将CompanyID(公司表的PK,雇员表的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 

现在,你为什么会做这个,而不是通过一个already-走打开记录集(即子表单的RecordsetClone)?我不知道 - 只是可能有些情况下,您不希望将查找绑定到特定的表单/子表单。你可以通过让你的函数连接接受一个记录集,然后将它传递给一个如上所述的记录集,或者将它传递给子表单的RecordsetClone来解决这个问题。在这种情况下,您可以使用连接函数,而不必绑定到表单/子表单。

1

如果我理解其中x表示从0。例如启动控制的行的源列您的问题,你应该能够使用柱(x)将控制访问ID的值,如果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的列表。

+0

在Do While循环中添加一个MoveNext。否则,您将重复连接相同的值直到......繁荣! – HansUp 2009-09-06 14:41:43

+0

当你正在使用的记录集已经存在时,它也使得发送很少的数据来建立一个新的记录集指针。上面的代码可以使用“WITH Me!SubForm.Form.RecordsetClone”重写,并节省很多麻烦(比如需要清理你创建的记录集变量 - 可能不应该在上面的代码中关闭,因为你'真的在无法关闭的记录集上运行,即子表单的RecordsetClone)。 – 2009-09-06 22:21:24