我在这里有一个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外部执行此操作。我错过了一些明显的东西吗?
答案 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