【问题标题】:How to use Checkbox to print worksheets as one file Excel VBA如何使用复选框将工作表打印为一个文件 Excel VBA
【发布时间】:2018-02-15 06:06:55
【问题描述】:

我在 Excel 工作簿中有 11 个工作表(Sheet1、Sheet2、Sheet3 等)的列表。我需要能够从该列表中选择一组要作为一个文件打印的工作表。表格的名称不会改变。

所以如果我想一次打印所有 11 个,我会输入:

ThisWorkbook.Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet4","Sheet5","Sheet6","Sheet7","Sheet8","Sheet9","Sheet10","Sheet11",).PrintOut

但不是这个,我想选择 11 的任意组合打印出来。

ThisWorkbook.Sheets(Array("Sheet3", "Sheet5", "Sheet7,"Sheet9","Sheet11").PrintOut

我的目标是使工作簿对用户友好,因此我设置了复选框,如果复选框控制单元格为 TRUE,则这些复选框将取消隐藏这些特定工​​作表。快速说明:

If Sheets("ControlSheet").Range("A1").Value = TRUE then
Sheets("Sheet1").Visible = TRUE

'where ControlSheet Range A1 is the cell linked to the checkbox for that sheet. 

我希望能够使用相同的复选框来选择要打印的工作表。

  • 迄今为止,我已经能够单独打印每张纸,但我希望它们都作为一个文件打印。
  • 我尝试根据控制单元格值设置字符串名称或变量数组,并在我的 VBA 中将其作为打印数组引用,但出现“下标超出范围”错误

我的具体问题:我想根据工作表中的单元格值在 VBA 中生成一个动态数组,并能够使用该数组将特定工作表打印为一个文件。

如果您认为我可能会根据我的需要制作这个过于复杂的内容,我们非常愿意接受其他建议。感谢所有帮助!

【问题讨论】:

  • 所有Checkbox-es 都在同一张纸上吗?
  • 是的,它们都在同一张纸上。一个不会打印的

标签: arrays vba excel


【解决方案1】:

所以只打印 11 个列表中的非隐藏工作表?

Sub PrintVisibleSheets()

    Dim arr, s, lst, sep

    arr = Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", _
          "Sheet6", "Sheet7", "Sheet8", "Sheet9", "Sheet10", "Sheet11")

    For Each s In arr
        If ThisWorkbook.Sheets(s).Visible Then
            lst = lst & sep & s
            sep = "|" 'add separator after first pass
        End If
    Next s

    'any visible sheets?
    If Len(lst) > 0 Then ThisWorkbook.Sheets(Split(lst, "|")).PrintOut

End Sub

【讨论】:

  • 你的意思是s.Name
  • 否 - arr 是字符串数组,而不是工作表对象数组
  • 对不起,我忽略了它^^',下次会更加小心。
  • 这看起来奏效了!非常感谢!我会尽快跟进我的完整代码,与需要此解决方案的其他人分享
【解决方案2】:

下面的最终代码!希望这可以帮助别人!

Sub PrintVisibleSheets()

If Sheets("ControlSheet").Range("C32").Value = True Then

   Sheets("Sheet1").Visible = True

   End If

'next

If Sheets("ControlSheet").Range("C33").Value = True Then

   Sheets("Sheet2").Visible = True
   End If

'next

   If Sheets("ControlSheet").Range("C34").Value = True Then

   Sheets("Sheet3").Visible = True

   End If

'next

   If Sheets("ControlSheet").Range("C35").Value = True Then

   Sheets("Sheet4").Visible = True

    End If

'next

   If Sheets("ControlSheet").Range("C36").Value = True Then

   Sheets("Sheet5").Visible = True

   End If


'next

   If Sheets("ControlSheet").Range("C37").Value = True Then

   Sheets("Sheet6").Visible = True

   End If

'next

   If Sheets("ControlSheet").Range("C38").Value = True Then

   Sheets("Sheet7").Visible = True

   End If

   'next




''''''''''''
'''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


 'Hide Sheets if False




   If Sheets("ControlSheet").Range("C32").Value = True Then

   Sheets("Sheet1").Visible = True

   End If




'next

If Sheets("ControlSheet").Range("C33").Value = False Then

   Sheets("Sheet2").Visible = False
   End If



'next

   If Sheets("ControlSheet").Range("C34").Value = False Then

   Sheets("Sheet3").Visible = False

   End If

'next

   If Sheets("ControlSheet").Range("C35").Value = False Then

   Sheets("Sheet4").Visible = False


    End If

'next

   If Sheets("ControlSheet").Range("C36").Value = False Then

   Sheets("Sheet5").Visible = False


   End If


'next

   If Sheets("ControlSheet").Range("C37").Value = False Then

   Sheets("Sheet6 ").Visible = False


   End If

'next


   If Sheets("ControlSheet").Range("C42").Value = False Then

   Sheets("Sheet7").Visible = False


   End If



   Dim arr, s, lst, sep

   arr = Array("Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6", "Sheet7")

   For Each s In arr
       If ThisWorkbook.Sheets(s).Visible Then
               lst = lst & sep & s
               sep = "|"
               End If

               Next s

               If Len(lst) > 0 Then


               Application.Dialogs(xlDialogPrinterSetup).Show
               ThisWorkbook.Sheets("Sheet1").PageSetup.PrintQuality = 600
               ThisWorkbook.Sheets("Sheet2").PageSetup.PrintQuality = 600
               ThisWorkbook.Sheets("Sheet3").PageSetup.PrintQuality = 600
               ThisWorkbook.Sheets("Sheet4").PageSetup.PrintQuality = 600
               ThisWorkbook.Sheets("Sheet5").PageSetup.PrintQuality = 600
               ThisWorkbook.Sheets("Sheet6").PageSetup.PrintQuality = 600
ThisWorkbook.Sheets("Sheet7").PageSetup.PrintQuality = 600

                            ThisWorkbook.Sheets(Split(lst, "|")).PrintOut

               End If

End Sub

【讨论】:

    猜你喜欢
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多