Простые вырезать и вставлять не получится - PullRequest
0 голосов
/ 16 мая 2018

У меня есть простой макрос, который отказывается работать. Он попадает в отрезанную часть и окружает информацию походными муравьями; а потом ... ничего.

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

Рабочий лист состоит из тысяч строк информации, и число строк меняется каждый месяц. Столбцы постоянные.

Вот что у меня есть:

Sub MurrayTest()
    'Dim xRg As Range
    'Dim xTxt As String
    'Dim xCell As Range
    'Dim xEndRow As Long
    'Dim I As Long

    On Error Resume Next

    If ActiveWindow.RangeSelection.Count > 1 Then
      xTxt = ActiveWindow.RangeSelection.AddressLocal
    Else
      xTxt = ActiveSheet.UsedRange.AddressLocal
    End If

    Set xRg = Range("d:d")
    xEndRow = xRg.Rows.Count + xRg.Row

    Application.ScreenUpdating = False

    For I = xRg.Rows.Count To 1 Step -1
        If xRg.Cells(I) = "1050" Then
           xRg.Cells(I).EntireRow.Cut
           Rows(xEndRow).Insert Shift:=xlDown
        End If
    Next

    Application.ScreenUpdating = True
End Sub

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Если я прочитал это правильно, вы хотите найти значение 1050 в столбце D, если оно будет найдено, вы хотите, чтобы этот ряд был вырезан и вставлен в конец списка.

Sub MurrayTest()
    Dim xRg As Range
    Dim xEndRow As Long
    Dim i As Long

    Set xRg = Range("D:D")
    xEndRow = Cells(Rows.Count, 4).End(Excel.xlUp).Row + xRg.Row

    Application.ScreenUpdating = False
    For i = xEndRow To 1 Step -1
        If xRg.Cells(i) = "1050" Then
           xRg.Cells(i).EntireRow.Cut
           Rows(xEndRow).Insert Shift:=xlDown
        End If
    Next
    Application.ScreenUpdating = True
End Sub
0 голосов
/ 16 мая 2018

Ваша проблема в том, что вы пытаетесь вставить строки в последнюю строку листа +1. Это за пределами.

Вместо этого:

Set xRg = Range("d:d")
xEndRow = xRg.Rows.Count + xRg.Row

Сделайте это:

Set xRg = Range("d:d")
xEndRow = Range("d1").End(xlDown).Row + 1

Таким образом, вы просто смотрите на населенные клетки вместо всех возможных.

Примечание Я предпочитаю использовать что-то вроде xEndRow = Cells(Rows.Count, 1).End(xlUp).Row, потому что поиск последней строки сверху может иногда быть неправильным, если набор данных не завершен. Возможно, вам придется поиграть с разными подходами, чтобы определить, что лучше для вашей ситуации.

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