Excel VBA удалить одну строку выше числа в столбце - PullRequest
0 голосов
/ 04 января 2019

У меня есть числа в столбце A. Я пытаюсь разработать код VBA для поиска каждого номера в столбце A и удалить одну строку выше, если в столбце A есть число. Пример:

Число в A18-> удалить номер строки 17

номер в A21 -> удалить номер строки 20

номер в A33 -> удалить номер строки 32

Этот код предназначен для вставки одной строки вышезначение в столбце А. Я попытался изменить его для удаления:

Dim r6 As Range, r7 As Range
Set printareaP = ThisWorkbook.Worksheets("Pricelist")

With printareaP.Range("Print_Area")


   For Each r6 In .Range("A1", .Range("A" & Rows.Count).End(xlUp))
    If Not IsEmpty(r6.Value) Then
        If r7 Is Nothing Then
            Set r7 = r6
        Else
            Set r7 = Union(r7, r6)
        End If
    End If
Next r6

If r7 Is Nothing Then
Else
    r7.EntireRow.Delete
End If

Я получаю сообщение об ошибке:

Set r7 = Union(r7, r6)

----------------РЕДАКТИРОВАТЬ-----------------------------------------------

Я придумал этот код:

    With printareaP.Range("Print_Area")

    For Each Cell In .Range("A1", .Range("A" & Rows.Count).End(xlUp))
    If Not IsEmpty(Cell.Value) Then
        .Cells(Cell.Row - 1, 1).EntireRow.Delete
    End If
Next
End With

Ответы [ 2 ]

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

Удалить строку выше

Советы

  • При разработке кода для удаления лучше использовать .Hidden = True вместо .Delete.
  • Вы можете использовать Не (как вы сделали с Пустым), чтобы выбрать противоположное (Союз).
  • При удалении строки выше лучше начинать с A2 , потому что если это в A1 найдена ошибка.

Примечания

  • Вы забыли включить Числовой .
  • Вы забыли закрыть оператор With ( End WIth ).
  • Вы забыли установить строку Смещение .
  • Вы использовали самый быстрый подход, используя Union .

Код

Предполагается, что Print_Area содержит соответствующую часть столбца A . В противном случае удалите .Range("Print_Area") из кода.

Sub DeleteRowAbove()

    Dim r6 As Range, r7 As Range

    With ThisWorkbook.Worksheets("Pricelist").Range("Print_Area")

        For Each r6 In .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
            If Not IsEmpty(r6) And IsNumeric(r6) Then
                If r7 Is Nothing Then
                    Set r7 = r6.Offset(-1, 0)
                  Else
                    Set r7 = Union(r7, r6.Offset(-1, 0))
                End If
            End If
        Next

    End With

    If Not r7 Is Nothing Then
        r7.EntireRow.Delete ' .Hidden = True 
        Set r7 = Nothing
    End If

End Sub

Хороший подход. Продолжайте в том же духе.

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

Это мое предложение:

Option Explicit

Sub test()

Dim r6 As Range, r7 As Range
Dim ws As Worksheet
Dim LastRow As Long
Dim printareaP As Range, Cell As Range

Set ws = ThisWorkbook.Worksheets("Pricelist")



LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set printareaP = ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, 1))

For Each Cell In printareaP
    If IsNumeric(Cell.Value) Then
        ws.Cells(Cell.Row - 1, 1).EntireRow.Delete
    End If
Next Cell


End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...