我目前正在尝试在VBA中编写代码,该代码可根据用户输入创建并保存新的工作簿。我有一个宏来创建工作簿,并且我有用户窗体上的命令按钮的代码。我目前收到“需要对象”错误,似乎projname和projnum变量甚至都没有被分配我想要的值。似乎变量分配和文件保存都存在问题。
模块1:
Public projname As String
Public projnum As String
Sub createWB()
Dim uf2 As New UserForm2
uf2.Show
Set outputWorkbook = Workbooks.Add(xlWBATWorksheet)
Application.DisplayAlerts = False
Wk.SaveAs Filename:="C:\Users\Public\Desktop\" & projname & ".xlsx"
Application.DisplayAlerts = True
End Sub
UserForm模块:
Private Sub CommandButton1_Click()
projname = UserForm2.TextBox1.Text
projnum = UserForm2.TextBox2.Text
Me.Hide
Unload UserForm2
End Sub
答案 0 :(得分:0)
解决方法很简单:写projname = UserForm2.TextBox1.Text
代替projname = Me.TextBox1.Text
解释有些复杂。 VBA中的一个用户窗体是一个类,如果要使用该类的实例,则需要创建它。您可以在CreateWB
例程中使用语句Dim uf2 As New UserForm2
创建一个userform对象(new
将创建它)。
大多数人都是懒惰的,不那么做,相反,他们只是写UserForm2.show()
。因此,没有 create 语句可以创建表单对象,但是无论如何都会显示该表单。在后台发生的事情是VBA运行时将检查该类的所谓的默认实例是否存在。如果没有,它将动态创建它。您的程序可以通过类的名称(例如,名称为UserForm2
,其中包含类型为UserForm2
的对象)访问此默认实例。
请记住,在您的createWB
例程中,您创建了自己的对象,因此不需要(也不创建)默认实例。
现在,只要您在类的代码中,就可以使用关键字Me
(其他语言使用关键字this
)访问其类成员。因此,要访问控件TextBox1.text
的文本,您可以编写Me.TextBox1.text
。
如果您不在表单中(例如,在createWB
中),则可以使用uf2.TextBox1.text
访问成员-但前提是uf2的实例有效。如果使用命令Unload
,它将破坏对象,并且会出现运行时错误。
在按钮单击事件中,您使用了UserForm2.TextBox1.Text
,现在发生了意外情况:UserForm2
的默认实例当时不存在,因此VBA会创建它。那是该类的 new (无形)实例,当然文本框不会被填充。因此,您可以将空字符串写入projname
和projnum
。