Excel vba 输入动态打印范围

Excel vba enter dynamic printranges

我正在尝试编写一个代码,以便我可以使用 inputbox/userform 选择要打印的范围。我的工作簿包含范围为 ("B2;K" & lrow) 的常规部分(必须始终打印)。可以在此处找到项目名称、开始日期、作者等。

从 L 列开始到 JL 列是一年中的周数,包括天数(周一至周五)。我每周都会给一个范围名称,例如周数 1 是 "week1",范围 ("L2;M" & lrow),周数 2 是 "week2",范围 ("N2;R" & lrow)

我希望代码执行的操作是打印您在弹出框中输入的一般部分和周数(例如 inputbox/userform)。

周(开始): 1

周(结束): 7

代码现在将把一般部分 + 第 1 周到第 7 周打印到同一个 sheet 上。这可能吗?

我现在的代码有效,但仅适用于 1 个范围:

Dim PrintRange As String
Dim lrow As Long

lrow = Range("G" & Rows.Count).End(xlUp).row + 1
    ActiveSheet.PageSetup.PrintArea = Range("B2:K" & lrow).Address(1, 1)

    Do
      PrintRange = InputBox("Enter weeknumbers ...", "Determine range")
      If PrintRange = "" Then Exit Sub
    Loop Until Val(PrintRange)

PrintRange = "week" & Trim(PrintRange)

With Application
    .ScreenUpdating = False
    On Error Resume Next
    .Goto Range(PrintRange)

    If Err Then
        MsgBox "Range " & Chr(34) & PrintRange & _
               Chr(34) & " doesn't exit", vbExclamation
        Exit Sub
    End If

    .ScreenUpdating = True
End With
Selection.PrintOut Copies:=1, Preview:=True

我希望我澄清了我的问题。谢谢你的时间

据我了解,您的问题分为两个部分:

  1. 您希望每次都能 ("B2;K" & lrow) 打印,而不管 select 编辑了哪一周。
  2. 您希望用户能够一次 select 多个星期。

第 1 部分

为了每次打印一定范围,建议使用Excel中的打印标题功能。要使用此功能,请转至页面布局 -> 打印标题。在 "Sheet" 选项卡下,为 "Columns to repeat at left" 输入 $B:$K。这将确保每次打印 B 到 K 列中的信息,而不管 selection.

此外,如果您无论如何都希望所有内容都打印在一页上,我建议您将 "Orientation" 更改为 "Landscape" 并更改 [=58= 中的 "Width" ] 到“1 页”。这两个也在页面布局选项卡下。

第 2 部分

我不确定你的循环在你的输入框周围做了什么,但如果你使用 Application.InputBox 并更改 Type,你可以让输入框只允许数字输入。然后您可以有两个输入框:一个用于起始周,一个用于结束周。将您的代码替换为:

Sub PrintWeeks()

Dim PrintRangeStart As Long
Dim PrintRange1     As Range
Dim PrintRangeEnd   As Long
Dim PrintRange2     As Range
Dim ErrorCheck      As Long

PrintRangeStart = Application.InputBox("Enter the starting week number...", "Determine range start", Type:=1)
PrintRangeEnd = Application.InputBox("Enter the ending week number...", "Determine range end", Type:=1)

On Error GoTo Error_Handling
ErrorCheck = 1
Set PrintRange1 = Range("week" & PrintRangeStart)
ErrorCheck = 2
Set PrintRange2 = Range("week" & PrintRangeEnd)
On Error GoTo 0

Application.ScreenUpdating = False
ActiveSheet.PageSetup.PrintArea = Range(PrintRange1.Address(1, 1), PrintRange2.Address(PrintRange2.Rows.Count, PrintRange2.Columns.Count)).Address
ActiveSheet.PrintPreview

Error_Handling:
    If ErrorCheck = 1 And Err.Number <> 0 Then
        MsgBox "Range ""week" & PrintRangeStart & """ doesn't exist.", vbExclamation
    ElseIf ErrorCheck = 2 And Err.Number <> 0 Then
        MsgBox "Range ""week" & PrintRangeEnd & """ doesn't exist.", vbExclamation
    ElseIf Err.Number <> 0 Then
        MsgBox Err & ": " & Error(Err)
    End If

Application.ScreenUpdating = True

End Sub

不幸的是,我无法使打印预览功能正常工作,所以这将直接打印而不预览。

编辑

如果您想通过代码添加打印标题,只需在 PrintOut 行之前的任意位置添加 Sheets("Sheet1").PageSetup.PrintTitleColumns = "$B:$K",然后更改 "Sheet1" 以引用您的 sheet。

编辑 2

我每次都编辑打印行来更改打印区域,而不是依赖 selection。这样您也可以使用打印预览。希望这将有助于缓解您的任何其他问题。