#excel #vba
Вопрос:
Я пытаюсь создать подраздел VBA для добавления строк из «дочерней» книги в «мастер-файл» excel, только если строки содержат «несоответствие» в 4-х ячейках (идея представлена здесь: рисунок) Дочерний элемент рабочей книги-wkUP, а главный-wkDW, и пока мой цикл не работает, он добавляет неправильные строки…
Я предполагаю, что моя проблема в i и длине таблицы ?
Dim i, iLastRow As Integer
Dim oLastRow As ListRow Dim srcRow As Range iLastRow = wkUP.Sheets("DATA").ListObjects("TAB1").ListRows.Count For i = 1 To iLastRow If wkUP.Sheets("DATA").Cells(i, 4).Value = "nonconformity" Then Set srcRow = wkUP.Sheets("DATA").ListObjects("TAB1").ListRows(i).Range Set oLastRow = wkDW.Worksheets("NC").ListObjects("tbl_NC").ListRows.Add srcRow.Copy oLastRow.Range.Cells(9).PasteSpecial Paste:=xlPasteValues End If Next
Конец, Если
Если кто-то увидит, где код неправильный, я был бы очень признателен, я вроде как потерялся.. :'(
Ответ №1:
Вы используете i
в двух разных контекстах:
- По отношению к листу:
.Cells(i, 4)
- По отношению к таблице:
.ListRows(i)
Вам нужно быть последовательным; вот один подход, который используется i
только в отношении таблицы.
Dim tbl As ListObject Set tbl = wkUP.Sheets("DATA").ListObjects("TAB1") Dim lastRow As Long, i As Long lastRow = tbl.ListRows.Count For i = 1 To lastRow If tbl.ListColumns("Answer").DataBodyRange.Cells(i).Value = "nonconformity" Then Set srcRow = tbl.ListRows(i).Range ... End If Next
Комментарии:
1. Ах да ! Мне нужно сменить wkUP. Листы(«ДАННЫЕ»). Ячейки(i, 4).Значение, чтобы i работал внутри таблицы, а не на всем листе.
2. Черт, пока я выяснял твою точку зрения, ты все исправил ! Большое вам спасибо !
3. Другой вариант-использовать
AutoFilter
вместо зацикливания строку за строкой.