在另一个数据库中设置组合框的rowsource属性?

时间:2016-06-02 13:43:13

标签: vba ms-access combobox access-vba

我为此寻找了所有地方,我找不到它;我看了ADO和DAO。

有没有办法使用VBA编辑另一个.mdb文件中表单上的组合框的行源属性?我必须对一堆.mdb文件进行此更改,我宁愿使用脚本来执行此操作,而不是一次只执行一次。

1 个答案:

答案 0 :(得分:1)

使用COM自动化创建Access应用程序会话,您可以在其中打开数据库,在设计模式下打开目标表单,然后更改目标组合框的行源

Public Sub AlterComboRowSource(ByVal pDb As String, _
        ByVal pForm As String, _
        ByVal pCombo As String, _
        ByVal pRowSource As String, _
        Optional ByVal pEdit As Boolean = False)

    Dim objAccess As Access.Application
    Dim frm As Form
    Dim cbo As ComboBox

    Set objAccess = New Access.Application
    objAccess.Visible = True '<- useful while debugging
    objAccess.OpenCurrentDatabase pDb, True
    objAccess.DoCmd.OpenForm pForm, acDesign
    Set frm = objAccess.Forms(pForm)
    Set cbo = frm.Controls(pCombo)
    Debug.Print cbo.RowSource

    If pEdit = True Then
        cbo.RowSource = pRowSource
        objAccess.DoCmd.Close acForm, pForm, acSaveYes
    End If
    objAccess.Quit acQuitSaveNone
End Sub

这是我的测试程序,演示了如何使用第一个程序:

Public Sub test_AlterComboRowSource()
    Const cstrCombo As String = "cmbEmployeeName"
    Const cstrForm As String = "frmLogin"
    Dim strDbPath As String
    Dim strSelect As String

    strDbPath = "C:\Users\hans\Documents\Access\Scratch.accdb"
    strSelect = "SELECT e.EmployeeID, e.FirstName & ' ' & e.LastName AS [Employee Name] " & _
        "FROM tblEmployees AS e " & _
        "WHERE e.Inactive=False ORDER BY 2;"

    AlterComboRowSource strDbPath, cstrForm, cstrCombo, strSelect, True
End Sub

在Access 2010中测试时,这些过程按预期工作。

只需执行Set objAccess = New Access.Application一次,然后重新使用objAccess,打开每个数据库,更改组合行来源,然后更高效关闭数据库。

然而,由于这可能是一次性的情况,也许你并不关心执行速度。