2014-10-10 2 views
1

У меня есть указанный ниже код, я пытаюсь загрузить отфильтрованные ячейки только в список, но я не знаю, почему приведенный ниже код не работает.VBA Excel: Показать видимые ячейки только в списке

Легенда:

  • PatternSearchButton находится кнопка
  • PatternTextBox является текстовым полем, с помощью которого пользователь вводит значение которой лист будет фильтровать.
  • WsLookup является функцией, которая выбирает лист (полностью функциональный)

    Private Sub PatternSearchButton_Click() 
    
        Dim PatternInput As String, PatternCounter As Double, WsSelector As Worksheet 
         PatternInput = PatternTextBox.Value 
    
        Set WsSelector = WsLookup(GSMListType.Value) 
         WsSelector.Range("F:F").AutoFilter Field:=1, Criteria1:=PatternInput 
    
         PatternCounter = Application.WorksheetFunction.Subtotal(4, WsSelector.Range("F:F")) 
    
         With AvailableNumberList 
          .Clear 
          For k = 2 To PatternCounter + 1 
           .AddItem WsSelector.Range("A" & k).SpecialCells(xlCellTypeVisible).Value 
          Next k 
         End With 
    
    
    
    End Sub 
    
+0

Является ли 'AvailableNumberList' глобальным объектом? Если да, каков его тип? Если нет, какой класс должен быть? –

+0

@ cst-link 'AvailableNumberList' является самим списком –

+0

Является ли код, дающий ошибки в строке' .AddItem WsSelector [...] '? И, поскольку мы здесь, используете ли вы код «On Error Resume Next» в своем коде? –

ответ

1

Вы используете PatternCounter в качестве верхнего предела в вашем For .. Next, но это время устанавливается с помощью MAX (например) подфункция SUBTOTAL. Это может работать с последовательными номерами в нефильтрованном списке, но вряд ли будет точным в отфильтрованном списке. Использование COUNT (2/102) или COUNTA (3/103) Подфункция может быть более подходящей.

Вы использовали SUBTOTAL(4, ...), поэтому я бы предположил, что вы имеете дело с числами. Используйте прямой подсчет чисел в видимых ячейках в столбце F и измените оставшуюся часть кода, чтобы это было похоже.

PatternCounter = Application.WorksheetFunction.Subtotal(2, WsSelector.Range("F:F")) 
    With WsSelector.cells(1,1).currentregion.offset(1,0).SpecialCells(xlCellTypeVisible) 
     AvailableNumberList.Clear 
     For k = 1 To PatternCounter 
      AvailableNumberList.AddItem .cells(k, 1).Value 
     Next k 
    End With 
+0

Это то, что мне нужно. Я также хочу отфильтровать строку, что бы вы предложили использовать вместо counta, она не кажется функциональной. –

+1

@mario R. - вышеприведенный фрагмент был предназначен для включения в код, который у вас был в исходном вопросе, который включал бы оператор '.AutoFilter'. До сих пор не так много, как «фильтровать строку» *. Не могли бы вы исправить свой первоначальный вопрос или начать новый с достаточной дополнительной информацией для предоставления решения? – Jeeped

+0

Уверенная вещь :) @jeeped –

1

Проблема может возникнуть из-за того, что вы добавляете в поле списка значение специальной ячейки, которое может не существовать, если ячейка скрыта.

Try для тела цикла For:

' ... previous code ' 
If Not WsSelector.Rows(k).EntireRow.Hidden Then 
     .AddItem WsSelector.Cells(k, 1).Value 
End If 
' rest of the code ... ' 

Кроме того, убедитесь, что AvailableNumberList указывает на правильный объект в вашем коде.

Смежные вопросы