从 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 对象的主要内容,如果未能解决你的问题,请参考以下文章
通过中间处理从 MS Excel 导出到 MS Access
使用 Python 将数据从 MS Access 复制到 MS Excel
从 MS Access 中将交叉表查询结果导出到 Excel