使用 Find 方法取消隐藏列

Using Find method to Unhide columns

我正在尝试使用用户通过多选列表框输入的内容来取消隐藏列。

我正在 运行循环以查明是否已选择特定条目,并使用所选条目的值在范围内找到它,然后取消隐藏特定列。

Private Sub CommandButton1_Click()
Dim sel As Range
Dim TagDump As Range
Dim strng As String
Dim lRow As Long

ThisWorkbook.Sheets("Tag Dump").Range("A:AQ").EntireColumn.Hidden = True
Set TagDump = ThisWorkbook.Sheets("Tag Dump").Range("A1:AR1")

With Me.ListBox1
    For lRow = 0 To .ListCount - 1
        If .Selected(lRow) Then
            strng = .List(lRow, 0)
            With TagDump
                Set sel = .Find(What:=strng, after:=.Cells(1, 1))
                Debug.Print sel.Column
                sel.EntireColumn.Hidden = False
            End With
        End If
    Next lRow
End With
End Sub

但是,当我 运行 它时,我收到错误 91:未设置对象变量或块变量。

我在不使用 运行ning sel.Entirecolumn.Hidden 的情况下使用 Debug.Print 来查找列的索引,它每次都正确地显示给我。但是,当我 运行 它与该命令行一起使用时,我再次收到错误。

请告诉我是什么原因造成的,我该如何纠正。

谢谢。

编辑:这对于第一个选定值工作正常,我能够取消隐藏该列,但对于后续值,它显示错误。

在执行查找之前尽量不要隐藏列:

Private Sub CommandButton1_Click()
Dim sel As Range, rngVis As Range
Dim TagDump As Range
Dim strng As String
Dim lRow As Long, ws As Worksheet

Set ws = ThisWorkbook.Sheets("Tag Dump")    
Set TagDump = ws.Range("A1:AR1")

With Me.ListBox1
    For lRow = 0 To .ListCount - 1
        If .Selected(lRow) Then
            strng = .List(lRow, 0)
            With TagDump
                Set sel = .Find(What:=strng, after:=.Cells(1, 1))
                If not sel is nothing then 
                    Debug.Print strng, sel.Column
                    BuildRange rngVis, sel
                End If 
            End With
        End If
    Next lRow
End With

ws.Range("A:AQ").EntireColumn.Hidden = True
If Not rngVis is nothing then rngVis.entirecolumn.hidden = false 'unhide matches  

End Sub

Sub BuildRange(rngTot as Range, rngAdd As Range)
    If rngTot is nothing then
        Set rngTot = rngAdd
    Else
        Set rngTot = application.Union(rngTot, rngAdd)
    End If
End Sub    

此代码将显示所有选定的列并隐藏指定范围内的所有其他列。请尝试一下。

Private Sub CommandButton1_Click()
    ' 013

    Dim Ws As Worksheet
    Dim VisClm As String
    Dim TagDump As Range
    Dim C As Long

    Set Ws = ThisWorkbook.Worksheets("Tag Dump")
    Set TagDump = Ws.Range("A1:AR1")

    With Me.ListBox1
        For C = 0 To .ListCount - 1
            If .Selected(C) Then VisClm = VisClm & .List(C, 0) & "|"
        Next C
    End With

    Application.ScreenUpdating = False
    With TagDump
        For C = 1 To .Columns.Count
            Ws.Columns(.Columns(C).Column).EntireColumn.Hidden _
                    = (InStr(1, VisClm, .Cells(1, C).Value, vbTextCompare) = 0)
        Next C
    End With
    Application.ScreenUpdating = True
End Sub

我构建此代码的前提是 TagDump 范围内的标题与 ListBox1 中的项目相同(甚至是 RowSource)。如果是另一种关系,则需要根据工作表中的实际情况调整代码。