【问题标题】:Userform CommandButton to Populate based on CheckBox True/False基于复选框 True/False 填充的用户窗体命令按钮
【发布时间】:2014-06-21 23:36:43
【问题描述】:

我的工作簿有 sheet1 = Overview(包含启动 UserForm1 的按钮)。我的用户窗体有 24 个 CheckBox 和 2 个 CommandButton(确定和取消)。

每个 CheckBox 都与工作簿中的一个工作表相关联。随后的每个工作表都标记为 PQC 1001、PQC 1002 等,其中包含数据(每张工作表的 A1 中的图像被推到左上角)。

我的目标是让用户检查他们想要使用的每个项目的复选框,然后选择“确定”(CommandButton1)让它将数据复制到一个新的工作簿中以便他们打印出来。

稍后,我打算定义打印参数以对项目进行分页,但我需要先了解基础知识。

目前我有以下代码(使用第一个和第二个 CheckBox 以确保它们工作,然后我打算通过复制代码并修改正确的工作表/CheckBox 来扩展):

Sub CommandButton1_Click()

 Dim WB As Workbook

 If CheckBox1.Value = True Then
    sheets("PQC 1001").Copy
    Set NewBook = Workbooks.Add
        With NewBook
        End With
    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
    Else: CheckBox1.Value = False
  End If

 If CheckBox2.Value = True Then
 sheets("PQC 1002").Copy
     Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
    Else: CheckBox2.Value = False
  End If

End Sub

Sub CommandButton2_Click()
 Unload Me
 End
End Sub

运行此代码时触发错误(仅检查了 CheckBox1):范围类的 PasteSpecial 方法失败。除了代码问题,我还生成了 2 个工作簿;第一个只有 PQC 1001 表,第二个工作簿是空白的(除非我复制了其他任何内容,例如,当我在修改之前复制/粘贴代码时,我复制的代码粘贴到第二个工作簿的单元格 A1 中)。

老实说,我不知道从这里去哪里。我花了一些时间在 Google 上搜索可能的解决方案,并尝试在 Stack Overflow 的搜索栏中寻找一些术语/短语。我想我可能正在查找不正确的术语名称,因此可能会有所不同(“粘贴到新书的命令按钮”就是其中之一)。

作为一般说明,这基本上是我尝试编写的第三件事;我的教育背景包含零编码。我的编码技能范围来自对我编写的代码的一些阅读和反馈,这些代码来自比我知识渊博的人。

【问题讨论】:

  • 我认为问题在于您对Selection 的依赖。改为尝试明确说明目标范围,例如NewBook.Sheets(1).Range("A1").PasteSpecial...
  • 谢谢你,大卫;纠正了方法范围的问题(我在 PasteSpecial 之后删除了所有“东西”以使其工作)。不过,仍然打开了 2 个工作簿。
  • 呃,我以为解决了;我的剪贴板上有一些东西要粘贴到第二个工作簿中,这似乎是“pasteSpecial”错误。
  • 好的。我知道是什么原因造成的。让我给你写一个答案。

标签: excel vba checkbox paste commandbutton


【解决方案1】:

对于您的第一个问题,请避免依赖Selection。相反,您应该明确说明目标范围,例如:

NewBook.Sheets(1).Range("A1").PasteSpecial...

现在,您将打开多个工作簿,因为如果您没有在 Copy 语句中明确指定目标,Sheets(_name_).Copy 方法将始终返回一个新工作簿。

http://msdn.microsoft.com/en-us/library/office/ff837784(v=office.15).aspx

相反,使用Copy 方法的BeforeAfter 参数指定复制工作表的目的地:

试试这个:

Dim NewBook as Workbook
Set wb = ActiveWorkbook 'Or ThisWorkbook, or Workbooks("workbookname.xlsx")
'#Create the new book outside of the If blocks.
Set NewBook = Workbooks.Add
'# Get rid of excess sheets
Do Until NewBook.Sheets.Count = 1
    NewBook.Sheets(1).Delete
Loop
If CheckBox1.Value = True Then
'Creates exact copy of the sheet PQC 1001 in the NEW workbook.
    wb.sheets("PQC 1001").Copy After:=NewBook.Sheets(1)
Else: CheckBox1.Value = False
End If
If CheckBox2.Value = True Then
     wb.sheets("PQC 1002").Copy After:=NewBook.Sheets(NewBook.Sheets.Count)
Else: CheckBox2.Value = False
End If

【讨论】:

  • 运行时错误“9”,下标超出范围。它突出显示使用“之前”的评论下方的行。当我尝试输入时,我应该得到一个弹出窗口吗?有时当我输入单词时,我会得到一个小菜单,告诉我如何为其提供语法。我提到这一点,因为我不知道我是否没有该论点的正确参考(我以前听说过这个短语,实际上并不知道它的意思)。
  • 啊啊啊。范围不当。等一下……我会修改的。
  • 已修订。在添加新书之前,使用WB 变量设置活动工作簿的句柄。添加新书时,不合格的Sheets("PQC 1001").Copy... 将引发错误,因为NewBook(当前为活动书)中没有此类工作表。
  • 这简直是奇迹。测试仅选中 CheckBox1 或 CheckBox2 的表单,并注意必须在 NewBook 上定义工作表。有没有办法将副本发送到第一个可用的、未使用的工作表上?或者,我可能会在事务结束时删除 NewBook 中的所有“未使用”工作表。附加:感谢您迄今为止的帮助。这对我来说似乎是压倒性的,所以真的很感激。
  • 好的;我可以通过录制宏并删除未使用的页面来清除未使用的页面。这很好,尽管每个复选框都在创建自己的工作簿。我的想法是错误的,但我认为将“NewBook”定义为工作簿意味着如果使用该术语,则只能生成 1?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多