如何从UserForm创建和保存新工作簿?

时间:2019-07-19 12:48:58

标签: vba

我目前正在尝试在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

1 个答案:

答案 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 (无形)实例,当然文本框不会被填充。因此,您可以将空字符串写入projnameprojnum