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

Posted

技术标签:

【中文标题】从 MS Access 启动 Excel 和引用 UserForm 对象【英文标题】:Launch Excel and Reference UserForm object from MS Access 【发布时间】:2015-10-05 17:23:56 【问题描述】:

我在这里有一个 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 外部执行此操作。我在这里遗漏了什么明显的东西吗?

【问题讨论】:

【参考方案1】:

我将在这里描述一个可行的方法,我不确定是否有其他方法可以实现这一点,但此解决方案经过测试并提供了一种通用机制,可以从另一个 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 代码显式控制它,但这似乎是一项艰巨的任务,我还没有尝试过。希望这会有所帮助。

【讨论】:

嘿,你写的和我一样的答案!我希望 SO 能显示有多少人正在输入答案! @HarveyFrench 是的......我一直在研究它,因为我在另一篇文章中被问到它...... :)。但我比你早了几分钟:P @HarveyFrench 通知我更喜欢在这里以非模态模式启动表单,以解除对原始应用程序中任何进一步代码的阻塞......但这取决于程序员想要做什么 我发现您可以使用 VBA 从另一个工作簿/访问中打开 xlsm 工作簿并在它存储的模块中运行 VBA 代码,这让我感到非常惊讶。当我手动打开同一个工作簿时,我的信任中心设置会导致发出安全警告,并且必须单击启用内容!这肯定不能保证! 是的,用户需要事先在信任中心进行一些设置,例如将保存 Excel 文件的位置添加到信任位置。但这将是另一个问题。【参考方案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\***\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

【讨论】:

感谢@HarveyFrench!感谢您的反馈。

以上是关于从 MS Access 启动 Excel 和引用 UserForm 对象的主要内容,如果未能解决你的问题,请参考以下文章

使用VB将数据从Excel导入Ms Access

通过中间处理从 MS Excel 导出到 MS Access

使用 Python 将数据从 MS Access 复制到 MS Excel

从 MS Access 中将交叉表查询结果导出到 Excel

将 Excel 中的动态和静态范围导入到 MS-Access 中,而不是从单元格 A1 开始

如何使用sql语句和vba将数据从MS-Access导入excel power查询?