Excel vba输入动态打印范围
我正在尝试编写一个代码,在其中可以使用inputbox/userform选择要打印的范围。我的工作簿包含一个必须始终以B2范围打印的通用部分;K&lrow。项目名称、开始日期、自动等可在此处找到 从L列开始到JL列是一年中的周数,包括周一至周五的天数。我每周都会给出一个rangename,例如weeknumber 1是范围为L2的week1;M&lrow,第2周为第2周,范围为N2;R&lrow等 我想让代码做的是打印一般部分和您在弹出框中输入的周数,例如inputbox/userform 本周开始: 一, 周末: 七, 代码现在将在第1周至第7周将通用零件打印到同一张图纸上。这可能吗 我现在使用的代码有效,但仅适用于1个范围:Excel vba输入动态打印范围,excel,vba,dynamic,range,Excel,Vba,Dynamic,Range,我正在尝试编写一个代码,在其中可以使用inputbox/userform选择要打印的范围。我的工作簿包含一个必须始终以B2范围打印的通用部分;K&lrow。项目名称、开始日期、自动等可在此处找到 从L列开始到JL列是一年中的周数,包括周一至周五的天数。我每周都会给出一个rangename,例如weeknumber 1是范围为L2的week1;M&lrow,第2周为第2周,范围为N2;R&lrow等 我想让代码做的是打印一般部分和您在弹出框中输入的周数,例如inputbox/userform 本周
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每次打印,无论选择哪周。 您希望用户能够一次选择多个星期。 第一部分 为了每次都有一定范围的打印,我建议使用Excel中的打印标题功能。要使用此功能,请转到页面布局->打印标题。在“工作表”选项卡下,键入$B:$K,使列在左侧重复。这将确保每次打印B列到K列中的信息,而不考虑选择 另外,如果你想在一页上打印所有内容,我建议将方向改为横向,并将比例中的宽度改为适合一页。这两个选项也位于“页面布局”选项卡下 第二部分 我不确定您的循环在输入框周围做了什么,但如果您使用Application.InputBox并更改类型,则可以使该框仅允许数字输入。然后可以有两个输入框:一个用于开始周,另一个用于结束周。将代码替换为以下内容:
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
不幸的是,我无法让打印预览功能正常工作,因此这将只是直接打印而没有预览
编辑
如果要通过代码添加打印标题,只需在打印输出行之前的任意位置添加SheetsSheet1.PageSetup.PrintTitleColumns=$B:$K,然后将Sheet1更改为引用您的工作表即可
编辑2
我已经编辑了打印行,以更改每次的打印区域,而不是依赖于选择。这样,您也可以使用打印预览。希望这将有助于缓解您的任何其他问题。如果您的周在不同的列中,您是否可以隐藏不需要打印的列?每周在周一到周五重叠5个非常小的列。选择一个特定的列几乎是不可能的,只有放大到150%才能选择正确的列。这就是为什么我宁愿在可能的情况下使用宏。你能帮忙吗?我就是这个意思。隐藏宏中的列,以便在打印时不显示这些列。打印完成后,您可以将其取消隐藏。这就引出了同样的问题,但反过来说,我如何选择要隐藏的列?假设我想使用宏隐藏第1周到第6周。如果可以使用inputbox/userform来完成,我想打印而不是隐藏也是可能的。非常感谢,这正是我想要的。只是一直需要打印的部分似乎不起作用,我照你说的做了,但在我选择打印的几周内没有出来。如何在宏中输入此通用部分?我已经试过了,但我似乎只完成了将一般部分打印到最后一周的数字。例如,如果我想要第5到10周,它将打印一般部分+第1到10周。所以包括第1到第4周。我已将该范围命名为proyectinfo。有什么建议吗?你手动测试过吗?在“打印标题”打开的情况下,选择要打印的区域,打开“打印”对话框,选择“打印内容”下的“选择”,然后单击“预览”。我不知道为什么它会在你只需要几个星期的时候打印出来,除非其中一个指定的范围没有引用正确的范围。@m.Bergh我已经在我的答案中添加了一行,如果你愿意,可以通过代码添加打印标题。谢谢!现在它完全按照我的想法工作,非常感谢你的帮助和时间。干杯!我刚刚添加了另一个编辑,每次都会更改打印区域,而不是依赖于选择。我认为这是一种更干净的方法,因为我尽量避免在宏中选择数据。如果你想让我把它改回原来的样子,请告诉我。