Вопрос:

Как перебрать много листов

excel vba

26 просмотра

1 ответ

1 Репутация автора

У меня есть следующий код.

Sub Journal()
    Dim ColL As Range, ColC  As Range
    Dim ws120 As Worksheet: Set ws120 = ThisWorkbook.Sheets("120")
    Dim ws121 As Worksheet: Set ws121 = ThisWorkbook.Sheets("121")
    Dim ws122 As Worksheet: Set ws122 = ThisWorkbook.Sheets("122")
    Dim ws123 As Worksheet: Set ws123 = ThisWorkbook.Sheets("123")
    Dim ws124 As Worksheet: Set ws124 = ThisWorkbook.Sheets("124")
    Dim ws125 As Worksheet: Set ws125 = ThisWorkbook.Sheets("125")
    Dim ws126 As Worksheet: Set ws126 = ThisWorkbook.Sheets("126")
    Dim ws127 As Worksheet: Set ws127 = ThisWorkbook.Sheets("127")
    Dim ws128 As Worksheet: Set ws128 = ThisWorkbook.Sheets("128")
    Dim ws220 As Worksheet: Set ws220 = ThisWorkbook.Sheets("220")
    Dim ws221 As Worksheet: Set ws221 = ThisWorkbook.Sheets("221")
    Dim ws402 As Worksheet: Set ws402 = ThisWorkbook.Sheets("402")
    Dim ws403 As Worksheet: Set ws403 = ThisWorkbook.Sheets("403")
    Dim wsLoc As Worksheet: Set wsLoc = ThisWorkbook.Sheets("Locker JE")
    Dim wsCof As Worksheet: Set wsCof = ThisWorkbook.Sheets("Coffee JE")
    Dim Eval, rw As Range
    Dim i As Long '<< use long in place on Integer

    With wsLoc
        Set ColL = .Cells(4, "O")
    End With
    With wsCof
        Set ColC = .Cells(4, "O")
    End With

    For i = 4 To 41
        Set rw = ws120.Rows(i)
        Temp = rw.Cells(31).Value
        Select Case rw.Cells(31).Value
            Case ""
            Case Else
                CopyLocker rw, ColL
        End Select
    Next i
End Sub

Я хочу сделать то же самое в цикле for для каждого из определенных рабочих листов. Возможно ли это с какой-то переменной?

Автор: B Sumner Источник Размещён: 08.11.2017 11:18

Ответы (1)


2 плюса

19147 Репутация автора

Вместо того, чтобы объявлять все из них как рабочие листы, можно было бы загрузить их в массив, а затем выполнить цикл по массиву.

Это не совсем ваш макрос, но он показывает, как вы можете использовать цикл по массиву, чтобы сделать то, что вы ищете:

Sub Journal()
Dim wsArray() As Variant
Dim k As Long, i As Long
Dim rw As Range, ColL As Range
Dim TempCel As Range
Dim wsLoc   As Worksheet: Set wsLoc = ThisWorkbook.Sheets("Locker JE")
Dim wsCof   As Worksheet: Set wsCof = ThisWorkbook.Sheets("Coffee JE")

wsArray = Array("120", "121", "122", "123", "124", "125", "126", "127", "128", "220", "221", "402", "403", "Locker JE", "Coffee JE")
Set ColL = wsLoc.Cells(4, "O")
Set ColC = wsCof.Cells(4, "O")

For k = LBound(wsArray) To UBound(wsArray)
    With ThisWorkbook.Worksheets(wsArray(k))
        ' Do things with the worksheet.
        For i = 4 To 41
            Set rw = .Rows(i)
            Set TempCel = rw.Cells(31)
            Select Case TempCel.Value
                Case ""
                     ' Do something...
                Case Else
                    CopyLocker rw, ColL
            End Select
        Next i
    End With
Next k
End Sub

Примечание. Все это предполагает, что у вас есть другие рабочие листы в рабочей книге, на которых вы не хотите, чтобы они запускались. В противном случае, вы можете просто For each ws in ActiveWorkbook.Worksheetsпропустить весь массив.

Автор: BruceWayne Размещён: 08.11.2017 11:27
Вопросы из категории :
32x32