#excel #vba
#excel #vba
Вопрос:
Я пытаюсь найти способ автоматизировать пользовательские фильтры, которые создаются для повседневных операций. По-настоящему изучать VBA я начал всего 24 часа назад, поэтому использовал комбинацию записи макросов, а также сочетание различных решений, которые я нашел в Интернете. Приведенный ниже код наиболее близок к тому, что мне было нужно, но есть некоторые странности, обстоятельства возникновения которых я не совсем понимаю, не говоря уже о том, чтобы каким-либо образом их исправить.
Я попытался компенсировать строки вместе с добавлением или удалением одной снизу с минимальным успехом, поскольку в ней всегда указывается, что ее часть недопустима (я предполагаю, потому что ее нужно где-то определить, но не совсем уверен, в каком формате). Что, казалось, работало лучше всего, так это комбинация обработки ошибок и специальных ячеек, где скрипт должен игнорировать добавляющую значение часть, если во 2-й строке ничего не заполнено. Если там что-то заполнено, то будет добавлено значение в последний столбец, но только для пустых ячеек.
Columns("A:H").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$H$800000").AutoFilter Field:=2, Criteria1:="=*",
_Operator:=xlAnd
ActiveSheet.Range("$A$1:$H$800000").AutoFilter Field:=8,
Criteria1:="=*In*", _Operator:=xlAnd
Предполагается, что это отфильтровывает то, что мне нужно для каждой вкладки в Excel. Я ищу
для любых документов, которые имеют значение во 2-м столбце (B), и любых документов
которые содержат «In» в 8-м столбце (H). Создаваемые отчеты могут сильно различаться
по длине я определил 800k как хороший порог.
On Error GoTo NoBlanks01
If Range("$A$2:$H$2").SpecialCells(xlCellTypeVisible).Count > 0 Then
Columns("I:I").Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "InsertValueHere"
Skip01:
On Error Resume NextEnd If
Я не уверен на 100%, что использование их таким образом является избыточным, но мое мышление здесь
было ли это, если во второй строке что-то есть, продолжайте. В противном случае ошибка приведет
будет создан и будет следовать до конца скрипта, затем перейдите к skip01 и
действуйте оттуда. По сути, минуя значение, добавляющее там, где оно будет
выделите все пустые ячейки в строке I и добавьте «Вставить значение здесь». Эта часть
в целом работает, но в Excel есть несколько вкладок, где будут элементы
во второй строке, однако скрипт не распознает их и переходит через
обработка ошибок. Это та часть, которую я не понимаю.
NoBlanks01:
Resume Skip01
«У меня есть 11 «пробелов», «Без пропусков» и «Возобновлений» в одном подразделе. Все в соответствии
на разные вкладки. Опять же, не уверен, имеет ли это значение, но решил заявить, что
на случай, если есть какой-то порядок операций, который я пропустил при изучении этого.
Я ожидаю, что скрипт должен выполнить фильтрацию в соответствии с указанными спецификациями, затем выполнить запрос, в котором он проверяет, содержит ли вторая строка какие-либо элементы. Если это так: тогда следует перейти к выбору последнего столбца на этой вкладке, выбрать только пустые ячейки на этой вкладке, затем закодировать для них значение. Если это не так: тогда следует пропустить добавление любого значения и перейти прямо к соответствующим «пробелам», за которыми следует соответствующее «Пропустить».
В нынешнем виде это завершает логику на некоторых вкладках, но не на других. Я понятия не имею, почему, когда вторая строка явно заполнена. Я понимаю, что наличие некоторых из этих отчетов пригодилось бы, поэтому при необходимости я могу их предоставить.
Комментарии:
1. Там много текста, но не совсем ясно, что именно вы хотите сделать с тем, что осталось видимым после фильтрации. Вы просто проверяете row2 на наличие видимых ячеек, но это только говорит вам, скрыта Row2 или нет, поэтому не очевидно, зачем этот тест…
2. Извините, старался быть как можно более описательным. После того, как скрипт проверит, есть ли какие-либо непустые ячейки в строке 2, я бы хотел, чтобы он либо пропустил следующую часть, где он ищет пустые ячейки в столбце I, либо, если произойдет ошибка (иначе строка 2 пуста), он продолжит, не пропуская указанную часть. Если это поможет, я могу опубликовать больше текста сценария. Но после этого раздела это в основном то же самое, но только для разных вкладок
3. Однако зачем проверять , скрыта ли строка 2 ? Это ничего не говорит вам о других строках.
4. В идеале нужно посмотреть, вернулось ли что-нибудь из результатов фильтрации во второй строке. Я думал, что эта специальная команда использовалась для проверки, содержат ли какие-либо ячейки во второй строке данные, а не то, что они скрыты. Я более чем открыт для предложений. * редактировать * думаю, я понимаю, что вы имеете в виду. Итак, способ его настройки, если фильтр ничего не выдает в строке 2, он не будет «видимым». Итак, мне нужно было бы включить все возможные строки, которые он мог бы найти?
5. Но что особенного в Row2? Почему это определяет следующие шаги?
Ответ №1:
Попробуйте что-то вроде этого:
Dim sht As Worksheet, rng As Range, rngVis As Range
Set sht = ActiveSheet
Set rng = sht.Range("a1").CurrentRegion '<< the range with data and headers
If Application.CountA(rng) = 0 Then Exit Sub '<< exit if have no data...
rng.AutoFilter
rng.AutoFilter field:=2, Criteria1:="=*"
rng.AutoFilter field:=8, Criteria1:="=*In*"
'Next line should not throw an error even if all data
' rows are filtered, since there's always the header row visible
Set rngVis = rng.Columns("I").SpecialCells(xlCellTypeVisible)
If rngVis.Count > 1 Then '<< ignore if only the header row...
rngVis.SpecialCells(xlCellTypeBlanks).Value = "InsertValueHere"
End If
Комментарии:
1. Спасибо, это сработало отлично. Единственный вопрос, который у меня сейчас возникает, могу ли я использовать тот же базовый синтаксис для фильтрации массивов расширенными фильтрами и значениями, превышающими или равными значениям? Я пробовал это, например, но, похоже, это не распознается:
rng.AutoFilter field:=1, Criteria1:=Array( _ ".00*", ".E0*", ".edb", ".L0*"), Operator:=xlFilterValues
2. Вам не хватает подстановочных знаков?
Array("*.00*", "*.E0*", "*.edb", "*.L0*")
3. Извините, следовало указать, что это расширения файлов. Так что нет, должно быть хорошо для подстановочных знаков. Моя ошибка заключалась в том, что я не редактировал номера полей, поэтому это было глупо. Итак, теперь он распознает их и фильтрует, но, если быть точным, фильтрует только последний элемент в массиве » .L0 «. Я дважды проверил отчет, который я использую для тестирования этого, и там действительно есть другие расширения, которые должны вернуться из фильтра. Код выглядит как:
Filter field:=4, Criteria1:=Array(".00*", ".E0*", ".edb", ".L0*")
4. Как насчет
Operator
?xlFilterValues
?5. Добавление этого устраняет все, кроме .edb. Код выглядит следующим образом:
rng.AutoFilter field:=4, Criteria1:=Array(".00*", ".E0*", ".edb", ".L0*"), Operator:=xlFilterValues
. Не могу сказать, что я слишком хорошо знаком с тем, что делают operator и xlfiltervalues. Я проведу исследование со своей стороны * Редактировать: я не думаю, что ему нравятся подстановочные знаки там. добавил подстановочный знак в edb в качестве подсказки, и это также устранило этот результат.