【问题标题】:How to create and save new workbook from UserForm?如何从用户窗体创建和保存新工作簿?
【发布时间】:2019-07-19 12:48:58
【问题描述】:

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

用户窗体模块:

Private Sub CommandButton1_Click()

    projname = UserForm2.TextBox1.Text
    projnum = UserForm2.TextBox2.Text
    Me.Hide
    Unload UserForm2

End Sub

【问题讨论】:

  • 您如何/在哪里打电话给createWB?还可以在createWB 中使用Debug.Print 来测试您的字符串是否包含文本。
  • 您应该能够通过放置断点并单步执行代码来确定错误来自何处。如果您不确定如何使用,可以咨询this guide

标签: vba


【解决方案1】:

解决方法很简单:不要写projname = UserForm2.TextBox1.Text,而是写projname = Me.TextBox1.Text

解释有点复杂。 VBA 中的用户窗体是一个类,如果要使用该类的实例,则需要创建它。您在 CreateWB 例程中使用语句 Dim uf2 As New UserForm2 创建一个用户表单对象(new 将创建它)。

大多数人都很懒惰,不会那样做,他们只会写UserForm2.show()。所以没有声明来创建表单对象,但无论如何都会显示表单。在后台发生的是 VBA 运行时将检查该类的所谓的 默认实例 是否存在。如果没有,它将即时创建它。您的程序可以通过类的名称访问此默认实例(例如,名称为 UserForm2,其中包含类型为 UserForm2 的对象)。

请记住,在您的createWB-例程中,您创建自己的对象,因此不需要(也未创建)默认实例

现在,只要您在一个类的代码中,就可以使用关键字Me 访问它的类成员(其他语言使用关键字this)。所以要访问控件TextBox1.text的文本,你可以写Me.TextBox1.text

如果您不在表单中(例如在createWB 中),您可以使用uf2.TextBox1.text 访问成员——但前提是uf2 的实例有效。如果你使用命令Unload,它会破坏对象,你会得到一个运行时错误。

在您的按钮单击事件中,您使用了UserForm2.TextBox1.Text,现在发生了一些意想不到的事情:UserForm2 的默认实例当时不存在,因此 VBA 创建了它。那是类的 new(不可见)实例,当然文本框没有被填充。所以你将空字符串写入projnameprojnum

【讨论】:

  • 非常感谢您的解释!我对 Java 比对 VBA 更熟悉,所以我熟悉类、this 等的概念……您的修复确实成功地将字符串分配给变量,但 SaveAs 行仍然提供所需的对象错误。有什么想法吗?
  • 你的意思可能是outputWorkbook.SaveAsWk 似乎未定义。顺便说一句:你的代码顶部有 Option Explicit 吗?
  • 我完全错过了!我正在将我的变量从 Wk 更改为 outputWorkbook 并忘记在那里更改它。我现在收到一个路径错误。我正在尝试将其保存到桌面。
  • 这就是将Option Explicit 放在顶部的原因 - 您会立即看到编译器会抱怨的错误。
  • 你对C:\Users\Public 有写权限吗(这是所有用户的桌面,通常是写保护的)?尝试使用 `Filename:=environ("userprofile") & "\Desktop\" & projname & ".xlsx" 来访问你自己的桌面
猜你喜欢
  • 2020-02-27
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2020-08-17
相关资源
最近更新 更多