Как распечатать диапазон листов? - PullRequest
1 голос
/ 21 января 2020

У меня есть код VBA, который добавляет новые рабочие листы с метками «Калькуляция (2)», «Калькуляция (3)» и др. c. между листами Line Item Summary (Лист 7) и Comparison Job (Лист17). Я не знаю, сколько из этих листов будет добавлено, это определяется пользователем.

Как можно распечатать листы, которые добавляются между ними? По сути, я хотел бы, чтобы Line Item Summary плюс любые «Листы калькуляции» печатались НЕ Comparison Job (только листы до этого).

** РЕДАКТИРОВАТЬ: приведенный ниже код используется для добавления новых листов

Sub NewSheet()

Worksheets("Costing Sheet").Copy After:=Worksheets("Line Item Summary")
Worksheets(Worksheets("Costing Sheet").Index + 1).Activate

'Active Tab
ActiveSheet.Tab.ColorIndex = xlColorIndexNone

End Sub

Ответы [ 2 ]

3 голосов
/ 21 января 2020

Вот еще одна версия, использующая LIKE и Wildcard (*). Это будет проверять только те листы, которые необходимо для печати. ​​

Sub Sample()
    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        If ws.Name = "Line Item Summary" Or ws.Name Like "Costing Sheet*" Then
            ws.PrintOut
        End If
    Next ws
End Sub

Будет иметь это в виду! Можно ли изменить этот код для выполнения противоположного, как это было предложено в предыдущем коде? Пользователи могут изменить названия этих «Таблиц калькуляции (*)», но они по-прежнему будут находиться между «Сводкой позиции» и заданием сравнения - icalderon 31 мин. go

Это то, что вы пытаетесь? Я позаботился о нескольких проверках . Возможно, вам придется отредактировать его, чтобы сделать его более надежным.

Option Explicit

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim wsStartIndex As Long, wsEndIndex As Long
    Dim i As Long
    Dim wsName As String

    '~~> Loop through the sheet and get the positions of the sheets
    For i = 1 To ThisWorkbook.Worksheets.Count
        wsName = ThisWorkbook.Sheets(i).Name
        If wsName = "Line Item Summary" Then wsStartIndex = ThisWorkbook.Sheets(i).Index
        If wsName = "Comparison Job" Then wsEndIndex = ThisWorkbook.Sheets(i).Index

        If wsStartIndex <> 0 And wsEndIndex <> 0 Then Exit For
    Next i

    '~~> Do necessary checks
    If wsStartIndex = 0 Then
        MsgBox "Line Item Summary Sheet not found"
    ElseIf wsEndIndex = 0 Then
        MsgBox "Comparison Job Sheet not found"
    ElseIf wsEndIndex < wsStartIndex Then
        MsgBox "Comparison Job is before Line Item Summary. Sheets cannot be printed"
    '~~> If everything is ok then print
    ElseIf wsStartIndex <> 0 And wsEndIndex <> 0 Then
        For i = wsStartIndex To (wsEndIndex - 1)
            If ThisWorkbook.Sheets(i).Name <> "Costing Sheet" Then
                ThisWorkbook.Sheets(i).pritnout
            End If
        Next i
    End If
End Sub
1 голос
/ 21 января 2020

L oop все листы по имени, затем сделайте a Если он не начинается с вашего имени 2 листов

Sub WorksheetLoop()

         Dim WS_Count As Integer
         Dim I As Integer

         ' Set WS_Count equal to the number of worksheets in the active
         ' workbook.
         WS_Count = ActiveWorkbook.Worksheets.Count

         ' Begin the loop.
         For I = 1 To WS_Count


           If ActiveWorkbook.Worksheets(I).Name = "Line Item Summary" Or ActiveWorkbook.Worksheets(I).Name = "Comparaison Job" then

          'Don't print

         Else 

           ActiveWorkbook.Worksheets(I).PrintOut

         Next I

         End If

      End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...