从 MS Access 启动 Excel 和引用用户窗体对象

Launch Excel and Reference UserForm object from MS Access

我这里有一个 MS Access 数据库应用程序,我想使用 VBA 启动一个 Excel 文件,并使用默认值填充此文件中 UserForm 对象上的字段。我正在努力寻找可用于从 Excel 应用程序外部引用 UserForm 对象的语法。

希望这是有道理的。到目前为止,这是我的简单代码。

Dim xlApp As Excel.Application
Dim xlWB As Excel.Workbook

Set xlApp = CreateObject("Excel.Application")
Set xlWB as xlApp.Workbooks.Open("[My file path goes here]")

xlApp.Visible = True

此时我试图做的是访问这个名为 UserForm1 的文件中的一个 UserForm 对象,其中包含一个名为 TextBox1 的文本框并设置它的值。

我可以在 Excel 到 UserForm1.TextBox1 = "Test" 之间使用 VBA 来做到这一点,这很有效。如果可以的话,尝试从 MS Access 外部执行此操作。我在这里遗漏了什么明显的东西吗?

我将在这里描述一种有效的方法,我不确定是否有其他方法可以实现这一点,但这个解决方案已经过测试并提供了一种通用机制来调用一个 VBA 应用程序中的表单另一个 VBA 申请。

1) 在excel 工作簿中,添加一个宏,例如调用它ShowFormWithParams(param1, param2 etc)。此宏以 非模态 模式(非阻塞)显示表单,以便您可以在表单显示时继续执行代码。

    ' placed in code Module1
    Sub showFormWithValues(lbl1 As String, txt1 As String, chk1 As Boolean)
        With UserForm1
            .Show False
            .Label1.Caption = lbl1
            .TextBox1.Text = txt1
            .CheckBox1.Value = chk1
        End With
    End Sub

2) 在其他应用程序中,例如 Word、Access,甚至另一个 Excel 工作簿,您可以调用此宏并按以下方式为其提供适当的参数:

Sub mySub()
    Dim xlApp As Excel.Application, xlWB As Excel.Workbook
    Set xlApp = CreateObject("Excel.Application")
    Set xlWB = xlApp.Workbooks.Open("C:\Test.xlsm") ' specify file
    xlApp.Visible = True
    xlApp.Run "Module1.showFormWithValues", "ABCD", "foooo", True
End Sub

现在表单出现并显示了所需的值。

我应该说必须有某种方法来获取用户窗体的句柄并从 VBA 代码中显式控制它,但这似乎是一项艰巨的任务,我还没有尝试过。希望这有帮助。

是的。您可以在 excel 中创建一个 public 过程,用于打开和设置 excel 窗体上控件的值。然后您可以从访问中调用此过程。
也许提供用于设置控件值的参数。

Sub ASubInAccess()


    Dim xlApp As Excel.Application
    Dim xlWB As Excel.Workbook

    Set xlApp = CreateObject("Excel.Application")
    Set xlWB = xlApp.Workbooks.Open("C:\Users\Harvey\OneDrive\My Tasks\Whosebug\testuserform.xlsm")

    xlApp.Visible = True

    xlWB.Application.Run "AnSubInExcel", "Hello"


End Sub

Public Sub AnSubInExcel(ValueFor_textBox1 as string )
    UserForm1.TextBox1 = ValueFor_textBox1

    UserForm1.Show
End Sub

排序了吗?

如果不是,还有另一种方法,请参阅答案 here 但这看起来比较狡猾。

另请参阅 here,其中包含有用的代码。最后一个 link 的好处是您可以使用芯片程序从访问中指定 excle 用户表单的名称:

Sub SetPropertyAtRunTime()

    Dim FormName As String
    Dim ControlName As String
    Dim ProcName As String
    Dim CallType As VbCallType
    Dim Res As Variant
    Dim Value As Variant

    FormName = "UserForm1"
    ControlName = "Label2"
    ProcName = "Caption"
    CallType = VbLet
    Value = "New Caption Text"

    Res = ControlValueByName(FormName:=FormName, ControlName:=ControlName, _
        ProcName:=ProcName, CallType:=CallType, Value:=Value)
    ShowAnyForm FormName

End Sub