如何从 Access VBA 引用 Excel 用户窗体

How to reference an Excel UserForm from Access VBA

案例:

目标:

问题:

我尝试了什么:

通过搜索我只找到了如何从 另一个工作簿。

所以我尝试了以下参考:VBA.UserForms("UserForm2")VBA.UserForms.Item("UserForm2")VBA.UserForms(0)VBA.UserForms(1),所有这些都引发了错误:"subscript out of range",这意味着我正在写的不是该集合的成员。

所以我在一个名为 AppsxlWb 模块中写了这个:

Public Sub Refresh_UserForm()
    Unload Userform2
    Userform2.Show
End Sub

并在访问子中:

Application.Run "'" & xlWb.Name & "'!Apps.Refresh_UserForm"

这会抛出一个

Run-time error 2517 cannot find the procedure 'calc_8.4.xls'!Apps.Refresh_UserForm'

非常欢迎大家提出建议谢谢。

请尝试以下操作:

在userform2中,添加一个"Refresh"按钮和以下程序:

Private Sub CommandButton_Refresh_Click()
    Me.Repaint
End Sub

如果您有 UserForm_Initialize sub 和 UserForm_Terminate sub ,您可以包含模拟卸载-重新加载操作的过程。

Private Sub CommandButton_Refresh_Click()
    Call UserForm_Terminate
    Call UserForm_Initialize
    Me.Repaint
End Sub

如果您需要卸载表单并稍后手动调用它,那么您将不得不从实际加载的表单中调用它 Excel window(例如,使用工作表上的表单按钮),但不能来自 Access 或 xlWb 挂钩。

所以这对我有用:


注意:出于演示目的,我创建了一个名为 "Map1.xlsm" 的 xlsm 文件和一个名为 "UserForm1" 的用户窗体。此外,您需要打开 "Microsoft Excel 16.0 Object Library" 引用。


首先,如上所述,我在 Module1 中使用以下宏创建了一个 Excel 文件:

1). 第一次打开用户窗体(并刷新):

Sub Refresh_UserForm()
    Unload UserForm1
    UserForm1.Show False
End Sub

在 Access-VBA 中,我创建了以下两个宏(基于 ):

1). 打开并使用 Excel UserForm

Option Compare Database
Dim xlApp As Excel.Application, xlWB As Excel.Workbook

Sub mySub()
    Set xlApp = CreateObject("Excel.Application")
    Set xlWB = xlApp.Workbooks.Open("C:\...Path...\Map1.xlsm") 'Specify Path
    xlApp.Visible = True
    xlApp.Run "Map1.xlsm!Refresh_UserForm"
End Sub

2). 刷新 Excel 用户窗体

Sub Refrsh()
    Set xlApp = GetObject(, "Excel.Application")
    xlApp.Run "Map1.xlsm!Refresh_UserForm"
End Sub

希望这对您有所帮助