Цикл макросов VBA индексирует только один раз

#excel #vba #loops

#excel #vba #циклы

Вопрос:

У меня есть некоторый код VBA, который должен обновлять прогнозируемые часы для каждого сотрудника в проекте. Имена сотрудников указаны в ячейках B10: B32 и на основе количества заполненных ячеек в диапазоне предполагается получить уникальный идентификатор для сотрудника и проекта (хранятся в именованных ячейках employee1, employee2 и т. Д.) И вставить новые часы и тарифную ставку в соответствующую строку таблицы данных («wsDest»). Если сотрудник является новым, предполагается, что он вставит всю информацию о проекте в последнюю строку таблицы данных.

Макрос завершается, но, похоже, влияет только на первого сотрудника в списке. Что-то не так с тем, как я определяю цикл?

 
For i = 1 To WorksheetFunction.CountA(Worksheets("Edit Project").Range("B10:B32"))

    'Fill string variable with string of text to be matched
    uniqueid = Range("employee" amp; i)
     
    'Loop through each cell in range
    For Each c In rng
    'Check if cell value matches the string to be matched
        If UCase(c.Value) = UCase(uniqueid) Then
    'Check if this is the first match (new range hasn't been filled yet)
            If myRng Is Nothing Then
    'Fill new range with cell
                Set myRng = c
            Else
    'Join new matching cell together with previously found matches
                Set myRng = Application.Union(myRng, c)
            End If
        End If
    Next c
     
    If myRng Is Nothing Then
        DestRow = wsDest.Cells(wsDest.Rows.Count, "B").End(xlUp).Offset(1).Row
        wsCopy.Range("C3").Copy
            wsDest.Range("B" amp; DestRow).PasteSpecial Paste:=xlPasteValues
        wsCopy.Range("C4:D4").Copy
            wsDest.Range("C" amp; DestRow).PasteSpecial Paste:=xlPasteValues
        wsCopy.Range("E4").Copy
            wsDest.Range("F" amp; DestRow).PasteSpecial Paste:=xlPasteValues
        wsCopy.Range("G4:K4").Copy
            wsDest.Range("H" amp; DestRow).PasteSpecial Paste:=xlPasteValues
        wsCopy.Range("staff" amp; i).Copy
            wsDest.Range("E" amp; DestRow).PasteSpecial Paste:=xlPasteValues
        wsCopy.Range("rate" amp; i).Copy
            wsDest.Range("M" amp; DestRow).PasteSpecial Paste:=xlPasteValues
        wsCopy.Range("newrate" amp; i).Copy
            wsDest.Range("O" amp; DestRow).PasteSpecial Paste:=xlPasteValues
        wsCopy.Range("newhours" amp; i).Copy
            wsDest.Range("R" amp; DestRow).PasteSpecial Paste:=xlPasteValues
        wsCopy.Range("F5").Copy
            wsDest.Range("G" amp; DestRow).PasteSpecial Paste:=xlPasteValues
            
    Else
        DestRow = myRng.Row
        
        Range("newrate" amp; i).Copy
            wsDest.Range("O" amp; DestRow).PasteSpecial Paste:=xlPasteValues
            
        Range("newhours" amp; i).Copy
            wsDest.Range("R" amp; DestRow).PasteSpecial Paste:=xlPasteValues
    End If
Next i
  

Комментарии:

1. вы должны начать с проверки того, что WorksheetFunction.CountA(Worksheets("Edit Project").Range("B10:B32")) оценивается. Вероятно, есть гораздо лучший способ получить верхнюю границу для итерации.

Ответ №1:

Я не очищал объект «myRng» в конце каждой итерации, поэтому он не искал новую строку.