Не удается найти верхнюю строку после автофильтрации - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть одна рабочая тетрадь с двумя рабочими листами. Я пытаюсь сделать автофильтр через ряд уникальных значений, которые я извлек и поместил в столбец в дальних пределах обоих листов. Затем я пытаюсь скопировать и вставить значения в первые три столбца первой видимой строки того, что было отфильтровано. Я включил приведенный ниже код, поскольку попробовал несколько способов приблизиться к этому, но независимо от того, какой метод я использую, нужно ли найти номер строки первой строки после фильтрации, используя приведенный ниже код с union приложения или их комбинации, то, что, кажется, происходит, когда я запускаю фильтр ниже для «Slate Data», а затем копирую и вставляю его на второй лист («Placement Outlook»), всегда получается то, что находится в строке 2 на «Данные сланца» действительны для копирования и вставки в строки в «Outlook Placement».

Интересная и расстраивающая часть этого заключается в том, что я получу желаемый результат, когда вручную go через автофильтр и отдельно запустите код для копирования и вставки ниже, только когда этот код взаимодействует с кодом автофильтра, он продолжает всегда только копировать и вставлять строку 2 рабочей таблицы «Slate Data» в рабочую таблицу «Placement Outlook».

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

Dim lastrowuic, lastrowarray As Long
lastrowuic = Cells(Rows.Count, "C").End(xlUp).Row
lastrowarray = Cells(Rows.Count, "BP").End(xlUp).Row
Dim uniquesarray As Variant
uniquesarray = Range("C2:C" & lastrowuic)
Dim sdws As Worksheet
Set sdws = ActiveWorkbook.Sheets("Slate Data")
Dim pows As Worksheet
Set pows = ActiveWorkbook.Sheets("Placement Outlook")
Dim firstcell, middlecell, lastcell As Range
Set firstcell = sdws.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 1)
Set middlecell = sdws.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 2)
Set lastcell = sdws.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 3)
Set homeport_command_uic = Application.Union(firstcell, middlecell, lastcell)
Dim uic As Integer
uic = 2

Do While sdws.Cells(uic, 68).Value <> ""
    sdws.Range("A1").CurrentRegion.AutoFilter Field:=3, Criteria1:=sdws.Cells(uic, 68)
        If lastcell <> "" Then
        homeport_command_uic.Copy pows.Cells(uic, 2).Offset(1, 0)
        End If

uic = uic + 1
Loop

End Sub



1 Ответ

0 голосов
/ 16 февраля 2020

Ваш код делает именно то, что вы объясняете, он делает ...

Я имею в виду, он все время копирует диапазон, извлеченный только из ЛИСТ SpecialCells(xlCellTypeVisible).

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

Итак, вы должны использовать (если это диапазон, который вам нужно отфильтровать, как я только предполагаю):

uniquesarray.AutoFilter field:=1, Criteria1:="=your criteria", Operator:=xlFilterValues

, а затем установите необходимые ячейки для копирования следующим образом:

Set firstcell = uniquesarray.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 1)
Set middlecell = uniquesarray.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 2)
Set lastcell = uniquesarray.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 3)

Установка первой ячейки так, как вы это сделали, возвращает ее со ссылкой на диапазон листа, а не на тот, который (я понял) вам нужен ...

Не забудьте изменить "ваши критерии" с вашими реальными критериями фильтрации!

Помимо всего этого, это хорошая привычка всегда ставить Optin Explicit поверх кода модуля и правильно объявлять ВСЕ ваши переменные. Это избавит вас от многих неприятностей, когда / если код станет пушистым.

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