функция базы данных excel в сочетании с vba, а что, если нет записей?

Я использую функцию базы данных excel. см. пример изображения

введите описание изображения здесь

Я использую vba для выбора записей, которые имеют «да»,

Selection.AutoFilter Field:=2, Criteria1:="yes" Range("B3").Select Range(Selection, Selection.End(xlDown)).Select 

Затем я скопирую его, чтобы вставить его в другое место. например:

 Selection.Copy Range("B12").Select ActiveSheet.Paste 

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

Я пробовал такие вещи, как графство, но не добился успеха.

Ваша помощь очень ценится! 🙂

Мне нравится делать это так, потому что вам не нужно проверять ошибку. Если результатов нет, он просто вставляет пустую ячейку:

 Sub tgr() With Range("B2").CurrentRegion .AutoFilter 2, "yes" Intersect(.Offset(1), Columns("B")).Copy Range("B12") .AutoFilter End With End Sub 

В качестве альтернативы, если у вас есть только один критерий, вы можете использовать Countif для проверки наличия критериев перед выполнением фильтра:

 Sub tgr() Dim strCriteria As String strCriteria = "yes" With Range("B2").CurrentRegion If WorksheetFunction.CountIf(Intersect(.Cells, Columns("C")), strCriteria) > 0 Then .AutoFilter 2, strCriteria Intersect(.Offset(1), Columns("B")).Copy Range("B12") .AutoFilter Else MsgBox "No cells found to contain """ & strCriteria & """", , "No Matches" End If End With End Sub 

Это будет проверять количество видимых ячеек после применения AutoFilter:

 Selection.AutoFilter Field:=2, Criteria1:="yes" If ActiveSheet.AutoFilter.Range.Rows.Offset(1, 0).SpecialCells(xlCellTypeVisible).Count - ActiveSheet.AutoFilter.Range.Columns.Count > 0 Then Range("B3").Select Range(Range("b3"), Range("b2").End(xlDown)).Select Selection.Copy Range("B12").Select ActiveSheet.Paste End If 

Часть - ActiveSheet.AutoFilter.Range.Columns.Count – это вычесть ячейки заголовка из счета.

FWIW, когда я прошел свой исходный код, я получил 1004, потому что область копирования была от B7 до нижней части листа (эффект xlDown в пустом выборе).

Вы можете использовать функцию рабочего листа SUBTOTAL для подсчета видимых строк и только копировать и вставлять, если есть видимые строки. Вот пример.

 Sub CopyFiltered() Dim rToFilter As Range Dim rToCopy As Range Dim rToPaste As Range Set rToFilter = Selection Set rToPaste = rToFilter.Cells(1).Offset(10, 0) 'paste it 10 rows down rToFilter.AutoFilter 2, "yes" 'Use subototal to count the visible rows in column 1 If Application.WorksheetFunction.Subtotal(2, rToFilter.Columns(1)) > 0 Then 'Copy excluding the header row Set rToCopy = rToFilter.Columns(1).Offset(1, 0).Resize(rToFilter.Rows.Count - 1) rToCopy.Copy Destination:=rToPaste End If End Sub 
Давайте будем гением компьютера.