Ошибка при использовании SpecialCells автофильтра для получения видимых ячеек в VBA

Моя основная цель - скопировать видимые ячейки автофильтра, а затем скопировать размеры видимых ячеек на новый лист. Я использую этот код:

Sheets(1).AutoFilterMode = False
Sheets(1).Range("A1:A1").AutoFilter Field:=columnaNumeroIntervalo, criteria1:=CDec(paramCantidadCriterio)
Sheets(1).Range("A1:A1").AutoFilter Field:=columnaNumeroIntervaloUnidades, Criteria1:=paramUnidadesCriterio

MsgBox AutoFilter.Range.SpecialCells(xlCellTypeVisible)(2, 11).Value

В последней строке я хочу проверить значение ячейки. Если я использую Cells(2,11) вместо SpecialCells, я вижу, что ячейки содержат все ячейки листа, видимые и невидимые. Итак, я хочу использовать SpecialCells.

Если я использую специальные ячейки, я получаю следующую ошибку:

error '-2147417848 (80010108) in runtime. Automatization error.

В то время как тип выполнения, кажется, входит в цикл и, наконец, выдает эту ошибку. Может быть, SpecialCells модифицируют автофильтр, а затем в каждой модификации заново запускают автофильтр?


person Álvaro García    schedule 25.04.2012    source источник
comment
Простите меня, если я чего-то упускаю, но я не понимаю, почему вы хотите использовать фильтр, если знаете, что всегда хотите вернуть Cells(2,11). Я что-то упускаю?   -  person markblandford    schedule 25.04.2012
comment
@SiddharthRout +1 спасибо, каждый день узнаешь что-то новое. :)   -  person markblandford    schedule 25.04.2012
comment
@creamyegg: В моем предыдущем комментарии была опечатка. Я удалил это и добавил как часть своего ответа ниже :)   -  person Siddharth Rout    schedule 25.04.2012
comment
@creamyegg: Cells (2,11) - это простая проверка, чтобы увидеть, что происходит. Я хотел знать, есть ли в ячейке (2,11) данные ячейки без фильтра или данные с фильтром. Я имею в виду, что если в данных без фильтра в ячейке (2,11) у меня есть, например, значение XXX, и оно уникально для всего листа, если я фильтрую и получаю значение (2,11) y, я получаю XXX то Cells содержит все ячейки, а не только отфильтрованные. Это мой случай, после автофильтра в ячейке (2,11) все еще есть значение XXX, поэтому я предполагаю, что в ячейках есть все ячейки, а не только отфильтрованные ячейки.   -  person Álvaro García    schedule 26.04.2012


Ответы (1)


Чтобы работать с видимыми ячейками автофильтра, вы должны использовать Offset, если вы планируете исключить заголовки. Вы получаете ошибку, потому что вам не хватает "." до Cells(2,11)

'~~> Remove any filters
ActiveSheet.AutoFilterMode = False

'~~> Filter, 
With rRange 
  .AutoFilter Field:=1, Criteria1:=strCriteria

  '~~> offset(to exclude headers)
  Debug.Print .Offset(1, 0).SpecialCells(xlCellTypeVisible).Cells(2,11).Value

  Debug.Print .SpecialCells(xlCellTypeVisible).Cells(2,11).Value
End With

'~~> Remove any filters
ActiveSheet.AutoFilterMode = False

Я решил добавить это как часть этого ответа, чтобы он мог помочь кому-то другому в будущем.

Допустим, наш диапазон

A1:F6

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

Когда вы запустите приведенный ниже код, в зависимости от того, используете ли вы Offset или нет, вы получите эти результаты.

Option Explicit

Sub Sample()
    '~~> Remove any filters
    ActiveSheet.AutoFilterMode = False

    Dim rRange As Range
    Dim Rnge As Range

    Set rRange = Sheets("Sheet1").Range("A1:F6")

    '~~> Filter,
    With rRange
      .AutoFilter Field:=1, Criteria1:="<>2"

      '~~> Offset(to exclude headers)
      Set Rnge = .Offset(1, 0).SpecialCells(xlCellTypeVisible)

      Debug.Print Range(Rnge.Address).Address
      Debug.Print ActiveSheet.Cells(3, 2).Address
      Debug.Print Range(Rnge.Address).Cells(3, 2).Address

      Debug.Print "--------------------------------------------------"

      '~~> To include headers
      Set Rnge = .SpecialCells(xlCellTypeVisible)

      Debug.Print Range(Rnge.Address).Address
      Debug.Print ActiveSheet.Cells(3, 2).Address
      Debug.Print Range(Rnge.Address).Cells(3, 2).Address

    End With

    '~~> Remove any filters
    ActiveSheet.AutoFilterMode = False
End Sub

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

HTH

person Siddharth Rout    schedule 25.04.2012