#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» в конце каждой итерации, поэтому он не искал новую строку.