VBA Excel:仅在列表框中显示可见单元格

时间:2014-10-10 09:47:39

标签: excel vba excel-vba listbox

我有下面提到的代码,我试图只将过滤后的单元格加载到列表框中,但我不知道为什么下面提到的代码不起作用。

图例:

  • 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
    

2 个答案:

答案 0 :(得分:1)

您正在使用 PatternCounter 作为For .. Next的上限,但这是使用MAX设置的(例如 4 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

答案 1 :(得分:1)

问题可能源于这样一个事实:您向列表框中添加了一个特殊单元格的值,如果该单元格被隐藏,则该值可能不存在。

尝试For循环的正文:

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

另外,请确保AvailableNumberList指向代码中的正确对象。