如何从 Access VBA 引用 Excel 用户窗体
How to reference an Excel UserForm from Access VBA
案例:
- 我已经创建了一个 Access 数据库。
- 使用 Access-VBA 我打开一个 Excel 工作簿来做一些事情。
- 此工作簿 (
xlWb
) 进行复杂计算并在打开时加载 Excel 用户窗体 (UserForm2
)。
- 到目前为止一切正常。我打开
xlWb
,UserForm2
负载,我做东西。
目标:
在此之后,我需要"refresh"Userform2
。
术语 "refresh" 我的意思是要么调用此用户窗体的自定义子项,要么卸载并重新加载 UserForm2
.
问题:
- 如何从我的 Access-VBA 代码中引用
UserForm2
?
我尝试了什么:
通过搜索我只找到了如何从
另一个工作簿。
- 第一个建议是使用
VBA.UserForms
获取已加载的用户窗体。
所以我尝试了以下参考:VBA.UserForms("UserForm2")
、VBA.UserForms.Item("UserForm2")
、VBA.UserForms(0)
、VBA.UserForms(1)
,所有这些都引发了错误:"subscript out of range",这意味着我正在写的不是该集合的成员。
- 另一个建议是创建一个加载和卸载对象的函数。
所以我在一个名为 Apps
的 xlWb
模块中写了这个:
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'
- 当我尝试第三个类似的建议来创建一个 returns 对象实例的函数时,也会产生同样的错误。
非常欢迎大家提出建议谢谢。
请尝试以下操作:
在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
希望这对您有所帮助
案例:
- 我已经创建了一个 Access 数据库。
- 使用 Access-VBA 我打开一个 Excel 工作簿来做一些事情。
- 此工作簿 (
xlWb
) 进行复杂计算并在打开时加载 Excel 用户窗体 (UserForm2
)。 - 到目前为止一切正常。我打开
xlWb
,UserForm2
负载,我做东西。
目标:
在此之后,我需要"refresh"
Userform2
。术语 "refresh" 我的意思是要么调用此用户窗体的自定义子项,要么卸载并重新加载
UserForm2
.
问题:
- 如何从我的 Access-VBA 代码中引用
UserForm2
?
我尝试了什么:
通过搜索我只找到了如何从 另一个工作簿。
- 第一个建议是使用
VBA.UserForms
获取已加载的用户窗体。
所以我尝试了以下参考:VBA.UserForms("UserForm2")
、VBA.UserForms.Item("UserForm2")
、VBA.UserForms(0)
、VBA.UserForms(1)
,所有这些都引发了错误:"subscript out of range",这意味着我正在写的不是该集合的成员。
- 另一个建议是创建一个加载和卸载对象的函数。
所以我在一个名为 Apps
的 xlWb
模块中写了这个:
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'
- 当我尝试第三个类似的建议来创建一个 returns 对象实例的函数时,也会产生同样的错误。
非常欢迎大家提出建议谢谢。
请尝试以下操作:
在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
希望这对您有所帮助