Как я могу циклично выполниться через подмножество рабочих листов?

Используя TFS 18 месяцев назад, я нашел это багги, медленные, раздражающие, очень ограниченные критерии поиска и это имели чувство продукта, выбежавшего командой незаинтересованных, под заплаченным, по обработанному techs, вынуждаемому использовать Sharepoint и другие технологии MS, потому что это - то, что хотел маркетинг. Серьезно это была собака, я буду скорее использовать SourceSafe!

SVN, с другой стороны, является разрядным техником, интеграция IDE является болью, и это может иногда запутываться, но база пользователей значительна, и большая часть вопроса может быть решена с быстрым ТАК quesition.

Вы рассмотрели Хранилище ? Работы хорошо, и не слишком дороги.

7
задан Community 9 July 2018 в 19:34
поделиться

4 ответа

Если это не особо изменяемая рабочая книга (т.е. рабочие листы не добавляются и не удаляются все время), вы можете сохранить имена рабочих листов в диапазоне на скрытом листе и выполнить цикл их по имени.

Однако похоже, что они хранятся в книге последовательно, поэтому, основываясь на решении Матиаса, вы можете использовать функцию для возврата индексов начального и конечного рабочих листов, а затем выполнить цикл:

Public Function GetStartIndex() As Integer
    On Error Resume Next
    GetStartIndex = ThisWorkbook.Worksheets("MyStartingWorksheet").Index + 1
End Function

Public Function GetEndIndex() As Integer
    On Error Resume Next
    GetEndIndex = ThisWorkbook.Worksheets("MyEndingWorksheet").Index - 1
End Function

Sub LoopThrough()

    Dim wks As Worksheet
    Dim i As Integer
    Dim iStart As Integer
    Dim iEnd As Integer

    iStart = GetStartIndex()
    iEnd = GetEndIndex()

    If iStart > 0 And iEnd > 0 And iEnd > iStart Then
        For i = iStart To iEnd
            Set wks = ThisWorkbook.Worksheets(i)
            MsgBox wks.Name
        Next i
    End If

End Sub
2
ответ дан 7 December 2019 в 14:34
поделиться

I believe that if you use "foreach" you won't have any control over the starting sheet. For that matter, I am not even sure you are guaranteed the order in which the iteration will take place.
I think what you should do is first, get the index of the sheet you are interested in (get the sheet by name, and get its index), and then iterate using a for loop, over the indexes of the sheets starting at the flag sheet index.
[Edit: I hacked through a quick example]

Sub Iterate()

Dim book As Workbook
Dim flagIndex As Integer
Dim flagSheet As Worksheet

Set book = ActiveWorkbook
Set flagSheet = book.Worksheets("Sheet3")
flagIndex = flagSheet.Index

Dim sheetIndex As Integer
Dim currentSheet As Worksheet

For sheetIndex = flagIndex To book.Worksheets.Count
    Set currentSheet = book.Worksheets(sheetIndex)
Next

End Sub
2
ответ дан 7 December 2019 в 14:34
поделиться

Имеют ли листы, которые вы перебираете, общий формат имени?

Пример)

Sheets(0).name > "Reports"
Sheets(1).name > "Start Here"
Sheets(2).name > "emp.0001"
Sheets(3).name > "emp.0002"
Sheets(4).name > "emp.0003"
Sheets(5).name > "emp.0004"
Sheets(6).name > "End Here"

Если да, то в каждом цикле для каждого просто выполните Left (ThisWorkSheet.name , 4) = "emp" , чтобы проверить, хотите ли вы ссылаться на лист.

0
ответ дан 7 December 2019 в 14:34
поделиться

How about?

For Each ThisWorkSheet In Worksheets  
    If ThisWorkSheet.Name = "FlagStart" Then output = true 
    If ThisWorkSheet.Name = "FlagEnd" Then Exit For   
    If output = true Then MsgBox "This worksheet name is: " & ThisWorkSheet.Name
Next

This code might not be quite right. I'm writing it in the SO editor not VBA, but you get the idea.

1
ответ дан 7 December 2019 в 14:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: