EXCEL VBA как сбросить переменную в for .. do loop - PullRequest
0 голосов
/ 17 октября 2019

Кто-нибудь знает, как сбросить оставшуюся переменную в 0 в цикле do? переменная, которую я хотел бы сбросить, - это idx.

IDX представляет количество искомых подпапок. Например, всего есть 100 подпапок, поэтому idx max = 100. когда макрос нашел папку для поиска, например50. он сохранил idx = 50 в макросе. Таким образом, для нового поиска idx не будет идти с самого начала, вместо этого он продолжит новый поиск с 51, 52,53 ... 100. Таким образом, если соответствующая подпапка idx равна 20, поскольку макрос не прошел через 0-50, он будет обрабатывать его как не найденный и выходить из цикла.

Ребята, вы знаете, где я могу сбросить эту переменную? Спасибо за тонну !!

    Dim idx As Integer
    For idx = 0 To UBound(Array_SubFolders)
        Dim fileName As String
        fileName = Dir(Array_SubFolders(idx) & "/*.xlsb")
        On Error Resume Next
        Do While fileName <> ""
            FullPathFileName = Array_SubFolders(idx) & "\" & fileName
            If (Left(fileName, 12) = "Ass_Sheet_") Then
                Dim prodName As String
                prodName = ThisWorkbook.Sheets("Master").Cells(MasterRow, 1).Value
                If (InStr(fileName, prodName) > 0) Then
                    Call prc_Import_Values(fileName)
                    MasterRow = MasterRow + 1
                End If
            End If
            fileName = Dir()
        Loop

    Next

    MsgBox "--- finished ---"

1 Ответ

0 голосов
/ 17 октября 2019

Прежде всего, я бы настоятельно предложил бы удалить On Error Resume Next, так как оставив его, это приведет к страданиям и душевной боли только тогда, когда что-то сломается, и вы не получите никакого сообщения об ошибке. Если вы получаете сообщение об ошибке с его удалением, вы должны отследить источник ошибки и либо исправить его, либо обработать его с помощью соответствующих защитных предложений или обработки ошибок.

Во-вторых, я думаю Вы хотите многократно искать во всем Array_SubFolders файл с prodName в имени любого из файлов в каждой подпапке. Если это так, я бы предложил что-то вроде этого:

Dim index As Integer
index= 0
Do While index < UBound(Array_SubFolders) 
    Dim fileName As String
    fileName = Dir(Array_SubFolders(index) & "\*.xlsb")
    Do While fileName <> ""
        FullPathFileName = Array_SubFolders(index) & "\" & fileName
        If (Left(fileName, 12) = "Ass_Sheet_") Then
            Dim prodName As String
            prodName = ThisWorkbook.Sheets("Master").Cells(MasterRow, 1).Value
            If (InStr(fileName, prodName) > 0) Then
                Call prc_Import_Values(fileName)
                MasterRow = MasterRow + 1
                index = 0
            End If
        End If
        fileName = Dir()
    Loop
    index = index+ 1
Loop

Вместо использования цикла For...Next и попытки сброса индекса (который обычно рекомендуется использовать), здесь используется Do While...Loopи сбрасывает индекс, когда находит совпадение в строке If (InStr(fileName, prodName) > 0) Then. Если это неправильное место, вы можете переместить index = 0 туда, где происходит фактическое сопоставление.

Также обратите внимание, что я изменил idx на index. Гласные дешевы, и я считаю, что непостоянные переменные делают их более читабельными. Кроме того, благодаря автоматическому заполнению VBIDE, набрав in<ctrl-space>, вы, вероятно, получите тот же результат при том же количестве нажатий клавиш.

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