Пропуск одной строки кода в цикле: wholerow.delete в другой книге - PullRequest
0 голосов
/ 18 января 2019

Довольно плохо знаком с VBA, но я пытаюсь импортировать (копировать / вставлять) данные из выбранной рабочей книги в основную рабочую книгу (содержит код), но сначала необходимо удалить неиспользуемые строки в выбранной рабочей книге.

Если столбец C пуст, то я хочу удалить всю строку, используя нижнюю часть верхнего цикла, прежде чем копировать данные в основную рабочую книгу (следовательно, необходимо более явно ссылаться на каждый wb).

В настоящее время он пропускает строку кода "wb.Sheets (1) .Rows (r) .EntireRow.Delete" в моем цикле, но выполняет цикл правильное количество раз.Пожалуйста, помогите, все еще учусь.

Раньше некорректно удалялась каждая строка: когда в предложении my if then была указана другая ячейка (одна со значением, а не пустая).

Dim wb As Workbook
Dim r As Integer

With wb.Sheets(1)       
     For r = wb.Sheets(1).UsedRange.Rows.Count To 1 Step -1
         If wb.Sheets(1).Cells(r, "C") = "0" Then
             wb.Sheets(1).Rows(r).EntireRow.Delete 
         End If
     Next

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Удалить строки (столбец критериев)

Версия объединения

Sub DelRows()

    Const cSheet As Variant = 1     ' Worksheet Name/Index
    Const cFirst As Long = 1        ' First Row Number
    Const cColumn As Variant = "C"  ' Criteria Column Letter/Number

    Dim rngU As Range   ' Union Range
    Dim LastUR As Long  ' Last Used Row
    Dim r As Long       ' Row Counter

    With ThisWorkbook.Worksheets(cSheet)

        ' Check if worksheet is empty.
        If .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 1) _
                Is Nothing Then Exit Sub
        ' Calculate Last Used Row.
        LastUR = .Cells.Find("*", , , , , 2).Row

        ' Add found criteria first (can be any) column cells to Union Range.
        For r = cFirst To LastUR ' Rows
             If IsEmpty(.Cells(r, cColumn)) Then
                 If Not rngU Is Nothing Then
                     Set rngU = Union(rngU, .Cells(r, 1))
                   Else
                     Set rngU = .Cells(r, 1)
                 End If
             End If
        Next

    End With

    ' Delete rows in one go.
    If Not rngU Is Nothing Then
        rngU.EntireRow.Delete ' .Hidden = True
        Set rngU = Nothing
    End If

End Sub
0 голосов
/ 18 января 2019

Нечто подобное должно работать. Вы использовали блок With для кода, но фактически не использовали его. Вам не нужны дополнительные ссылки на тот же объект. В этом я проверил, пуста ли ячейка или не используется IsEmpty

Dim wb As Workbook
Dim r As Integer

With wb.Sheets(1)
    For r = .UsedRange.Rows.Count To 1 Step -1
        If IsEmpty(.Cells(r, 3)) Then
            .Rows(r).Delete
        End If
    Next
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...