У меня есть этот макрос:

На листе 1 он выбирает все значения в столбце A, затем выбирает только константы, затем выбирает фильтр и копирует отфильтрованные значения в столбец A и вставляет его в другой список. Затем снова, но со следующим столбцом.

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

просто маленький быстрый пример

Здесь мой макрос будет копировать только столбец A и столбец B, и когда он попадет в столбец C, я получу ошибку, и он не будет продолжаться .. после фильтра

ОБНОВЛЕНО:

Ex. 1:

'   PO DC2 O
Sheets("Celkový harmonogram").Select
ActiveWorkbook.SlicerCaches("Průřez_dispečer32111").ClearManualFilter
Range("Tabulka141121518[13]").Select
Selection.SpecialCells(xlCellTypeConstants, 23).Select
With ActiveWorkbook.SlicerCaches("Průřez_dispečer32111")
    .SlicerItems("Bodnariucová Renáta").Selected = False
    .SlicerItems("Kajer Roman").Selected = True
End With

If Application.CountIf(Selection, "<>0") < 1 Then GoTo Line442
Application.CutCopyMode = False
Selection.Copy
Sheets("jednotlivci").Select
Range("Y6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

'   UT DC2 R
Line442:
Sheets("Celkový harmonogram").Select
ActiveWorkbook.SlicerCaches("Průřez_dispečer32111").ClearManualFilter
Range("Tabulka141121518[14]").Select
Selection.SpecialCells(xlCellTypeConstants, 23).Select
With ActiveWorkbook.SlicerCaches("Průřez_dispečer32111")
...

Ex. 2: (ошибка с пустыми ячейками)

If Application.CountIf(myRange, "<>0") > 0 Then
Application.CutCopyMode = False
Selection.Copy
Sheets("jednotlivci").Select
Range("Y6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Else: GoTo Line442
End If

Ex. 3: (ошибка несоответствия типов в строке «If ..»)

If Application.CountIf(Selection, "<>0") < 1 Then GoTo Line442

Application.CutCopyMode = False
Selection.Copy
Sheets("jednotlivci").Select
Range("Y6").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

1 ответ1

0

Я добавил три строки в ваш код. Они проверяют, является ли ваш выбор / диапазон пустым, и затем выходят из подпрограммы, если это так. Вам нужно запустить этот код и, возможно, удалить оператор if, который вы уже добавили (.Value не имеет особого смысла для меня). Кроме того, вам нужно проверить, какое if-утверждение, которое я добавил, устраняет исходную ошибку, о которой вы упоминали в своем вопросе первой (скорее всего, в итоге у вас будет только третья).

Sheets("Celkový harmonogram").Select
ActiveWorkbook.SlicerCaches("Průřez_dispečer32111").ClearManualFilter
Range("Tabulka141121518[13]").Select
Selection.SpecialCells(xlCellTypeConstants, 23).Select

'This is the part added (if you get the error in the following lines):
If Application.CountIf(Selection, "<>0") < 1 Then Exit Sub
'This will exit the sub; you can also "GoTo" a line as error handler or _
'Skip one step of a loop as you mentioned you are doing this for number of columns.

With ActiveWorkbook.SlicerCaches("Průřez_dispečer32111")
    .SlicerItems("Bodnariucová Renáta").Selected = False
    .SlicerItems("Kajer Roman").Selected = True
End With

'Also this cause it's not clear where you exactly get the error:
If Application.CountIf(Selection, "<>0") < 1 Then Exit Sub
'OR
If Application.CountIf(Sheets("Celkový harmonogram").Range("Tabulka141121518[13]") _
 , "<>0") < 1 Then Exit Sub


If Sheets("Celkový harmonogram").Range("Tabulka141121518[13]").Value <> "" Then
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("jednotlivci").Select
    Range("Y6").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
End If

Вместо Exit Sub вы можете перейти к следующей строке:

If Criteria Then 
isError = True
GoTo ErrorHandler
End If

'Rest of the code in case of no error
'...

ErrorHandler:
If IsError Then
'Code you want to be performed in case of error
End If

Примечание: добавляется второй оператор if, чтобы избежать запуска обработчика ошибок в случае отсутствия ошибки (VBA выполняет все и не пропускает блок ErrorHandler).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .