G'day Nikki,
Добро пожаловать в мир VBA! В Интернете есть множество полезных ресурсов, которые помогут вам в вашем путешествии.
Часто проще и быстрее работать с диапазоном внутри кода, а не читать и записывать на лист и выбирать ячейки, чтобы имитировать то, что вы обычно делали бы, если бы выполняли работу вручную.
Это хорошая идея, чтобы на ранних стадиях обвести голову. Это удобно для работы с несколькими листами.
Следующее является хорошим началом для диапазонов в Excel:
https://excelmacromastery.com/excel-vba-range-cells/
Еще одна удобная вещь - это коллекция. Если вам нужно было сохранить кучу вещей для работы позже, вы можете добавить их в коллекцию, а затем выполнить итерацию по ним, используя цикл «Для каждого». Это хорошее объяснение коллекций:
https://excelmacromastery.com/excel-vba-collections/
Я быстро взглянул на ваш код и, используя концепцию Ranges и Collections, я изменил его, чтобы сделать то, что, по вашему мнению, вы пытались сделать. Я должен был сделать несколько предположений, так как я не видел вас. Я запустил код на нескольких случайных строках на своем компьютере, чтобы убедиться, что он работает. Учтите следующее:
Dim MissingShipping As Worksheet
Dim NewSetup As Worksheet
Dim rangeToCheck As Range
Dim cellsToCheck As Range
Dim targetRange As Range
Dim rw As Range 'rw is a row
Dim cl As Range 'cl is a cell
Dim rowColl As New Collection
Dim i As Long
Set NewSetup = Worksheets("NKItemBuildInfoResults")
Set MissingShipping = Worksheets("MissingShipping")
'Get the range of data to check
Set rangeToCheck = NewSetup.Range("A1").CurrentRegion
'For each row in the range
For Each rw In rangeToCheck.Rows
'For the last four cells in that row
Set cellsToCheck = rw.Cells(1, 29).Resize(1, 4)
For Each cl In cellsToCheck.Cells
'If the cell is empty
If cl.Value = "" Then
'Add the row to our collection of rows
rowColl.Add rw
'Exit the for loop because we only want to add the row once.
'There may be multiple empty cells.
Exit For
End If
'Check the next cell
Next cl
Next rw
'Now we have a collection of rows that meet the requirements that you were after
'Using the size collection of rows we made, we now know the size of the range
'we need to store the values
'We can set the size of the new range using rowColl.Count
'(that's the number of rows we have)
Set targetRange = MissingShipping.Range("A1").Resize(rowColl.Count, 32)
'Use i to step through the rows of our new range
i = 1
'For each row in our collection of rows
For Each rw In rowColl
'Use i to set the correct row in our target range an make it's value
'equal to the row we're looking at
targetRange.Rows(i) = rw.Value
'Increment i for next time
i = i + 1
Next rw
End Sub
Удачи! Надеюсь, это поможет.