Правильно ли я использую On Error и SpecialCells (пустые строки) в Excel VBA? - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь найти способ автоматизировать пользовательские фильтры, которые создаются для повседневных операций.Начав только действительно изучать VBA 24 часа назад, я использовал комбинацию записи макросов, а также смесь различных решений, которые я нашел в Интернете.Приведенный ниже код ближе всего подходит к тому, что мне было нужно, но есть некоторые странности, которые я не совсем понимаю, почему они происходят гораздо реже, чем их исправить.

Я пыталсясмещение строк вместе с добавлением или удалением одной снизу с минимальным успехом, поскольку в нем всегда указывается, что его раздел недопустим (я предполагаю, что его нужно где-то определить, но не совсем уверен, в каком формате).То, что, казалось, работало лучше всего, было комбинацией Обработки ошибок и specialCells, где скрипт должен игнорировать часть добавления значения, если во 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), и любые документы, содержащие «В» в 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 «NoBlanks», «No Skips» и «Resumes» в одной и той же подпункте.Все по разным вкладкам.Опять же, не уверен, что это имеет значение, но подумал, что я бы сказал, что в случае, если есть какой-то порядок операций, который я пропустил при исследовании этого.

Я ожидаю, что скрипт должен отфильтровать в соответствии с данными спецификациями, затем выполнить череззапрос, где он проверяет, содержит ли вторая строка какие-либо элементы.Если это так: тогда он должен перейти к выбору последнего столбца на этой вкладке, выбрать только пустые ячейки на этой вкладке, а затем кодировать их значение.Если это не так, то он должен пропустить добавление любого значения и перейти прямо к соответствующему «NoBlanks», за которым следует соответствующее «Skip».

Как есть, он завершает логику на некоторых вкладках, но нена других.Я понятия не имею, почему, когда второй ряд четко заполнен.Я понимаю, что некоторые из этих отчетов пригодятся, поэтому при необходимости я могу их предоставить.

1 Ответ

0 голосов
/ 28 марта 2019

Попробуйте что-то вроде этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...