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
我希望我澄清了我的问题。谢谢你的时间
据我了解,您的问题分为两个部分:
- 您希望每次都能
("B2;K" & lrow)
打印,而不管 select 编辑了哪一周。
- 您希望用户能够一次 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。这样您也可以使用打印预览。希望这将有助于缓解您的任何其他问题。
我正在尝试编写一个代码,以便我可以使用 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
我希望我澄清了我的问题。谢谢你的时间
据我了解,您的问题分为两个部分:
- 您希望每次都能
("B2;K" & lrow)
打印,而不管 select 编辑了哪一周。 - 您希望用户能够一次 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。这样您也可以使用打印预览。希望这将有助于缓解您的任何其他问题。