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

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

<code>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
</code>

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

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

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

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

 markblandford25 апр. 2012 г., 17:54
Простите, если я что-то упустил, но я не понимаю, почему вы хотите использовать фильтр, если вы знаете, что всегда хотите вернутьсяCells(2,11), Я что-то пропустил?
 markblandford25 апр. 2012 г., 18:06
@SiddharthRout +1 спасибо, вы узнаете что-то новое каждый день. :)
 Álvaro García26 апр. 2012 г., 10:08
@creamyegg: Cells (2,11) - простая проверка, чтобы увидеть, что происходит. Я хотел знать, есть ли в ячейке (2,11) данные ячейки без фильтра или данные с фильтром. Я имею в виду, что если в данных без фильтра в ячейке (2,11) у меня есть, например, значение XXX, и оно уникально для всех листов, если я фильтрую и получаю значение (2,11) y, я получаю XXX тогда ячейки имеют все ячейки, а не только отфильтрованные ячейки. Это мой случай, после автофильтрации в ячейке (2,11) все еще есть значение XXX, поэтому я предполагаю, что ячейки имеют все ячейки, а не только отфильтрованные ячейки.
 Siddharth Rout25 апр. 2012 г., 18:22
@creamyegg: в моем предыдущем комментарии была опечатка. Я удалил это и добавил как часть моего ответа ниже :)

Ответы на вопрос(1)

Решение Вопроса

Offset если вы планируете исключить заголовки. Ошибка, которую вы получаете, заключается в том, что вы пропускаете & quot;. & Quot; до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

enter image description here

Когда вы запускаете приведенный ниже код, в зависимости от того, используете ли вы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

enter image description here

НТН

 Álvaro García01 мая 2012 г., 20:28
это хороший пример. Большое спасибо.

Ваш ответ на вопрос