使用查找方法来取消隐藏列

问题描述 投票:0回答:1

我试图通过多选列表框使用用户的输入来取消隐藏列。

我正在运行一个循环来查找是否有一个特定的条目被选中,并使用所选条目的值在一个范围内找到它,然后取消隐藏特定的列。

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:对象变量或与块变量未设置。

我使用Debug.Print而不运行sel.Entirecolumn.Hidden来查找列的索引,每次都能正确地显示出来。但是,当我把它和该命令行一起运行时,我又得到了这个错误。

请让我知道是什么原因导致的,我如何纠正它。

谢谢你。

EDIT:对于第一个选定的值,这工作很好,我能够取消隐藏该列,但对于后续的值,它显示错误。

excel vba listbox
1个回答
0
投票

尝试不隐藏列,直到你已经执行了查找的 。

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    

0
投票

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

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)。如果关系是另一种,则需要根据你工作表中的实际情况调整代码。

© www.soinside.com 2019 - 2024. All rights reserved.