Автофильтр - фильтрация данных и копирование в заданную строку c, затем изменение фильтра и копирование в строку ниже первого набора - PullRequest
0 голосов
/ 28 апреля 2020

Я создаю книгу Excel, которая будет использовать VBA для применения двух фильтров к листу запрошенных элементов. Столбец Q содержит либо «Оборудование», либо «Смартфон», а столбец «R» - «Да» или «Нет». Содержимое других полей не имеет значения. Фильтр будет применен к столбцу Q для «Аппаратного обеспечения» и столбцу R для «Нет». Для каждого элемента, который соответствует обоим критериям, они будут вставлены в указанную строку c, A11, на другой вкладке, которая содержит строку заголовка в A10. Ниже вставленных строк я бы хотел две пустые строки, затем строку текста «Ваш текст здесь», и строка заголовка будет повторена. Наконец, фильтр Column R будет переключен на «Да», а фильтр Column Q останется на «Hardware». Строки, созданные этим фильтром, будут скопированы ниже этой второй строки заголовка.

Вкладка «Оборудование» будет содержать следующее:

  • A1-A9 - пусто, содержимое будет добавлено позже.
  • A10 - строка заголовка для данных,
  • A11-A (X) - строки данных со столбцом Q = "Hardware" и столбцом R = "No",
  • A (X + 1) -A (X + 2) - пустые строки,
  • A (X + 3) - «Ваш текст здесь»,
  • A (X + 4) - заголовок строка для данных,
  • A (X + 5) - строки данных со столбцом Q = "Аппаратное обеспечение" и столбцом R = "Да".

Я адаптировал сценарий VBA который я нашел здесь на этом сайте, большое спасибо Сиддхарту Рауту. Как скопировать строку в Excel, используя указанное c слово и вставив ее в другой лист Excel?

Когда я запускаю макрос, он правильно применяет два фильтра и копирует правильные строки на вкладку «Оборудование». Однако я хочу, чтобы он был вставлен в ячейку A11 под строкой заголовка, но данные фактически перезаписывают это и копируют в ячейку A10.

Поскольку я не могу перестать перезаписывать строку заголовка или получить первый набор в нужном месте, я не уверен, как затем добавить то, что мне нужно, под ним, а также как определить, где находится второй набор будет go.

Я попытался изменить значение в 'After: =. Range ("A11"), _', но я, вероятно, неправильно понимаю, что он делает. Я хочу, чтобы он всегда go начинался со строки A11 и не касался ничего в строках 10 и выше, даже если они не заполнены.

    Dim wb1 As Workbook
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim copyFrom As Range
    Dim lRow As Long

    Set wb1 = ThisWorkbook
    Set ws1 = wb1.Worksheets("Raw")

   With ws1

        .AutoFilterMode = False

        lRow = .Range("Q" & .Rows.Count).End(xlUp).Row

        With .Range("Q1:R" & lRow)
            .AutoFilter Field:=1, Criteria1:="Hardware" '-> Hardware Items
            .AutoFilter Field:=2, Criteria1:="No" '-> Not Business Continuity
            Set copyFrom = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
        End With

        .AutoFilterMode = False
    End With

    '-> Destination
    Set ws2 = wb1.Worksheets("Hardware")

    With ws2
        If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
            lRow = .Cells.Find(What:="*", _
                          After:=.Range("A11"), _
                          Lookat:=xlPart, _
                          LookIn:=xlFormulas, _
                          SearchOrder:=xlByRows, _
                          SearchDirection:=xlPrevious, _
                          MatchCase:=False).Row
        Else
            lRow = 1
        End If

        copyFrom.Copy .Rows(lRow)
    End With

    wb1.Save
End Sub

Большое спасибо всем, кто может ответить, и приносит извинения, если моё резюме будь лучше.

1 Ответ

0 голосов
/ 28 апреля 2020

Если вы знаете, что вам нужно вставить диапазон в A11, вы можете напрямую вставить его туда. Вместо использования find для lrow, внутри With ws2 do

With ws2
        copyFrom.Copy .Range("A11")
        lRow = .Cells(.Rows.Count, 1).End(xlUp).Row

Это вставит диапазон в строке A11, после чего вы можете получить следующую последнюю строку. Получить X (определите его как Dim lrow как Long).

Теперь у вас есть последняя строка, содержащая данные (X). Как вы сказали, следующая строка данных - X + 5. Сначала очистите начальный фильтр с помощью

ActiveSheet.AutoFilter.ShowAllData

. Так что отрегулируйте код, чтобы сделать другой фильтр с критерием «Да», а затем вставьте его с помощью

 With ws2
         copyFrom.Copy .Range("A" & lrow + 5)
...