Excel vba输入动态打印范围

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 本周

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

从L列开始到JL列是一年中的周数,包括周一至周五的天数。我每周都会给出一个rangename,例如weeknumber 1是范围为L2的week1;M&lrow,第2周为第2周,范围为N2;R&lrow等

我想让代码做的是打印一般部分和您在弹出框中输入的周数,例如inputbox/userform

本周开始: 一,

周末: 七,

代码现在将在第1周至第7周将通用零件打印到同一张图纸上。这可能吗

我现在使用的代码有效,但仅适用于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每次打印,无论选择哪周。 您希望用户能够一次选择多个星期。 第一部分

为了每次都有一定范围的打印,我建议使用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我已经在我的答案中添加了一行,如果你愿意,可以通过代码添加打印标题。谢谢!现在它完全按照我的想法工作,非常感谢你的帮助和时间。干杯!我刚刚添加了另一个编辑,每次都会更改打印区域,而不是依赖于选择。我认为这是一种更干净的方法,因为我尽量避免在宏中选择数据。如果你想让我把它改回原来的样子,请告诉我。