2016-11-26 114 views
0

我想弄清楚如何打印“ActiveSheet”或Sheet1与“Sheet5”(行1-6,A:M)一起显示在底部的2行Sheet1结束和Sheet5数据开始之间的空间。我一直试图查找类似的问题,并阅读关于“联盟”的内容,但我不确定它会如何适合这里。从多个工作表结合打印范围VBA EXCEL

Private Sub CommandButton1_Click() 
Dim Sel_Manager As String 
'Headers repeated at the top 
Application.PrintCommunication = False 
With ActiveSheet.PageSetup 
     .PrintTitleRows = "$2:$2" 
     .PrintTitleColumns = "$B:$M" 
     .Orientation = xlLandscape 
     .Zoom = False 
     .FitToPagesWide = 1 
     .FitToPagesTall = 1 
End With 

'Manager selection through ComboBox dropdown 
Sel_Manager = ComboBox1 
'Inserting autofilters for worksheet 
Cells.Select 
Selection.AutoFilter 
'Manager defined in the dropdown ComboBox 
ActiveSheet.Range("B2", Range("M2").End(xlDown)).AutoFilter Field:=1, Criteria1:=Sel_Manager 
ActiveSheet.Range("B2", Range("M2").End(xlDown)).AutoFilter Field:=2, Criteria1:="A" 
'Here I select range to be printed and specify manager in filename 
ActiveSheet.Range("B2", Range("M2").End(xlDown)).Select 

Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ 
Sel_Manager + ".pdf", Quality:=xlQualityStandard, _ 
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True 

ActiveSheet.ShowAllData 
Application.PrintCommunication = True 
End Sub 
+1

'设置Rng3 =联合(Rng1,Rng2)'将创建包含Rng1和Rng2的组合范围。 Rng1和Rng2不必是连续的,但它们必须位于同一工作表内。所以'联合'不会帮助打印两个工作表的位。您必须创建一个新的临时工作表并从Sheet1和Sheet5复制所需的数据,打印临时工作表,然后删除临时工作表。 –

+0

如果我将参考单元粘贴到Rng1底部的Rng2,是否可以将Rng2设置为动态命名范围?它需要是动态的,因为用户可以将行添加到Rng1中,这会将底部的Rng2参考向下移动。我尝试使用命名的范围,但它锁定范围内的任何行你先设置它,并不会调整时插入行。 –

+0

我不完全理解你的问题。用户如何在宏运行时添加更多的行?一个“联盟”可以结合多达30个范围:“联盟(Rng1,Rng2,...,Rng30)”。 “联盟”是一种智能功能;如果两个范围是连续的,它将合并它们。你可以在用'Union'创建的范围上使用'Union'。 Set Rng1 = Union(Rng2,Rng3)''Set Rng1 = Union(Rng1,Rng4)'是有效的。 –

回答

0

这可能会给你一些想法。

我创建了两个工作表。一个名为“Main”的数据包含B列中的“名称”和C列中的某些As。另一个名为“Extra”的数据包含出现在过滤数据底部的六行。

我在引用工作表时不使用Excel的标识符。第一张纸将具有Sheet1的标识符和“Sheet1”的名称。如果您立即创建另一个工作表,它将具有Sheet2的标识符和名称“Sheet2”。但是,如果在创建第二个工作表之前重命名Sheet1,它将具有Sheet2的标识符和名称“Sheet1”。它可能会变得非常混乱。

我已将所选管理器硬编码为“Aaaaa”,而不是将其作为用户输入的参数。我准备了用于打印的工作表“Main”,但没有输出。

Option Explicit 
Sub Test() 

    Dim Manager As String 
    Dim RngFiltered As Range 
    Dim RowSht1Last As Long 

    Manager = "Aaaaa" 

    With Worksheets("Main") 

    .AutoFilterMode = False ' Switch off auto filtering if on 

    ' Find last row containing a value 
    RowSht1Last = .Cells.Find("*", .Range("A1"), xlFormulas, , xlByRows, xlPrevious).Row 

    With .Range("B2:M2") 
     .AutoFilter Field:=1, Criteria1:=Manager 
     .AutoFilter Field:=2, Criteria1:="A" 
    End With 

    Set RngFiltered = .Cells.SpecialCells(xlCellTypeVisible) 

    ' Just to show the filtered range. Note, I cannot find a documented limit 
    ' on the number of sub-ranges within a range. If there is a limit, I have 
    ' never managed to reach it. However Range.Address has a limit which is a 
    ' little under 255. 
    Debug.Print Replace(RngFiltered.Address, "$", "") 

    Worksheets("Extra").Range("A1:M6").Copy Destination:=.Cells(RowSht1Last + 2, "A") 

    ' ###### Output visible rows 

    ' Delete rows copied from Sheet5 
    .Rows(RowSht1Last + 2 & ":" & RowSht1Last + 8).Delete 

    End With 

End Sub 
+0

谢谢!我会试试这个。 –

相关问题