从MS Access启动Excel和引用UserForm对象

时间:2015-10-05 17:23:56

标签: excel vba excel-vba access-vba ms-access-2013

我在这里有一个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中的VBA到UserForm1.TextBox1 = "Test"这样做,这样可行。如果可以,尝试从MS Access外部执行此操作。我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:3)

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

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

    ' 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代码中显式地控制它,但这似乎是一项艰巨的任务,我还没有尝试过。希望这会有所帮助。

答案 1 :(得分:2)

是肯定的。您可以在Excel中创建一个公共过程,打开并设置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\StackOverflow\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,其中包含有用的代码。最后一个链接的好处是你可以使用芯片的程序从访问中指定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