Вырезать и вставлять диапазон не работает при фильтрации - PullRequest
0 голосов
/ 16 октября 2018

У меня есть лист данных, и я хочу выполнить фильтрацию на основе начала номера политики, а затем я хочу переместить все политики BFL после политик PFL.Строка 1 содержит все заголовки.Мой номер политики начинается с PFL или BFL.

Причина, по которой я не могу отсортировать ZA напрямую, потому что необработанные данные начинаются с BFL001 до BFL999, а затем с PFL001 до PFL999, поэтому при сортировке ZA сначала будет PFL999, но я хочупросто переместить все с BFL001 на BFL999 после PFL001, например, просто вырезать и вставить.Мой диапазон меняется каждый месяц, поэтому я использую от 001 до 999, чтобы показать вам, как отображаются мои необработанные данные.

После запуска моего текущего модуля VBA он начинается со строки 1000 и с BFL001 до PFL999, а это не то, чтоЯ хочу.Мне нужно начать с PFL001 до PFL999, а затем с BFL001 до BFL999 и без пустых строк между ними.

Я не уверен, смогу ли я использовать частичный поиск или использовать текст, подобный для поиска политик, начинающихся с BFL, а затемвырезать и вставить до последнего ряда + 1. Не уверен, какой путь быстрее.

Sub test()
    Dim LR1 As Long
    LR1 = Range("A" & Rows.Count).End(xlUp).Row

    With Worksheets("Combined")
        With .Range("A2:AU" & LR1)
             .AutoFilter Field:=1, Criteria1:="BFL" & "*"
             .Cut Range("A" & LR1 + 1)
        End With
             .AutoFilterMode = False
    End With
End Sub

1 Ответ

0 голосов
/ 16 октября 2018

Отличный трюк с VBA в том, что вы можете ссылаться на определенные ячейки, которые имеют свойство, используя .SpecialCells, в вашем случае вы захотите использовать xlCellTypeVisible, но есть много других, которые можно использовать.

Хитрость заключается в том, чтобы сделать разрез вручную.Вы не можете вырезать ячейки, которые не находятся рядом друг с другом, но вы можете скопировать и вставить их.Таким образом, идея состоит в том, чтобы вставить ячейки BFL ниже ячеек PFL, а затем очистить исходные ячейки и очистить пробелы.После применения автофильтра вы можете сказать Excel, чтобы он смотрел только на видимые ячейки в том же диапазоне, который вы указали ранее, так что вы не получите ничего лишнего.Это важно, потому что когда вы собираетесь очистить все видимые ячейки, вы не хотите случайно очистить ячейки, которые вы только что вставили ниже.

Когда вы очищаете пустые ячейки, важно идти снизу вверх, потому что в противном случае вы можете столкнуться с проблемами индексации.Вы также заметите, что я использую .entirerow, чтобы он удалял всю строку, а не только первый столбец.

Чтобы показать все данные, вы просто идете Worksheet.showalldata, НО вам нужно проверить, есть ли на листе автофильтр.Время от времени, когда вы выполняете такие операции, как очистка ячеек, он отключает автофильтр, поэтому лучше проверить, работает ли он по-прежнему или нет, чтобы ваш макрос не выдавал ошибку.

Последний крошечныйвещь, хотя вы не ошибаетесь, нет необходимости объединять строку с подстановочным знаком *, вы можете просто поместить их в одну строку.например."BFL*" против "BFL" & "*" просто экономит немного времени при наборе текста.

Sub test()
    Dim LR1 As Long
    Dim BFLRange As Range
    LR1 = Range("A" & Rows.Count).End(xlUp).Row
    Dim i As Long

    With Worksheets("Combined")
        With .Range("A2:AU" & LR1)
             .AutoFilter Field:=1, Criteria1:="BFL" & "*"

             Set BFLRange = .SpecialCells(xlCellTypeVisible)
             BFLRange.Copy Destination:=Worksheets("Combined").Range("A" & LR1 + 1)
        End With
        BFLRange.Clear

        For i = LR1 To 2 Step -1
            If IsEmpty(.Cells(i, 1)) Then
                .Cells(i, 1).EntireRow.Delete shift:=xlUp
            End If
        Next i
        If .AutoFilterMode Then
            .ShowAllData
        End If
    End With
End Sub

Этот фрагмент следует предложению @ SJR, где вы удаляете всю используемую область, содержащую BFL.Причина, по которой я отключил оповещения, заключается в том, что появляется только небольшое текстовое поле с вопросом, действительно ли вы хотите удалить строки листа.Отключая его, он не требует никакого пользовательского ввода.Хорошо отметить, что, удаляя ячейки сразу, это значительно ускорит макрос, если вы работаете с большим количеством данных.Еще раз спасибо @ SJR.

Sub test()
    Dim LR1 As Long
    Dim BFLRange As Range
    LR1 = Range("A" & Rows.Count).End(xlUp).Row
    Dim i As Long

    With Worksheets("Combined")
        With .Range("A2:AU" & LR1)
             .AutoFilter Field:=1, Criteria1:="BFL" & "*"

             Set BFLRange = .SpecialCells(xlCellTypeVisible)
             BFLRange.Copy Destination:=Worksheets("Combined").Range("A" & LR1 + 1)
        End With

        Application.DisplayAlerts = False
        BFLRange.Delete
        Application.DisplayAlerts = True

'        For i = LR1 To 2 Step -1
'            If IsEmpty(.Cells(i, 1)) Then
'                .Cells(i, 1).EntireRow.Delete shift:=xlUp
'            End If
'        Next i
        If .AutoFilterMode Then
            .ShowAllData
        End If
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...