根据用户选择隐藏Excel列

时间:2020-03-10 00:07:50

标签: vba excel-2010

我在B2单元中有一个验证列表,该列表从ROW 5(G5:BF5)获取列表。

我希望用户能够从“验证列表”中选择一个值,从而导致从G到BF的所有列都被隐藏,除了与单元格B2中的值匹配的列标题之外。

我使用了下面的代码,但始终收到应用程序定义或对象定义的错误。

我正在使用以下VBA:

工作表>>更改

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$B$2" Then
    Dim the_selection As String
    Dim week_in_review As String
    the_selection = Worksheets("SortHeatMap").Range("B2")
    Dim rep As Integer
    For rep = 8 To 25
    the_column = GetColumnLetter_ByInteger(rep)
    week_in_review = Worksheets("SortHeatMap").Range(column_letter & "5")
    If the_selection = week_in_review Then
    Worksheets("SortHeatMap").Range(the_column & ":" & the_column).EntireColumn.Hidden = False
    Else
    Worksheets("SortHeatMap").Range(the_column & ":" & the_column).EntireColumn.Hidden = True
    End If
    Next rep
    End If

End Sub

这是(常规)>>模块1中的>> GetColumnLetter_ByInteger。

Public Function GetColumnLetter_ByInteger(what_number As Integer) As String

    'This section obtains Column letter of selected week.

    GetColumnLetter_ByInteger = ""

    If MyColumn_integer <= 26 Then
    column_letter = Chr(64 + MyColumn_integer)
    End If

    If MyColumn_integer > 26 Then
    column_letter = Chr(Int((MyColumn_integer - 1) / 26) + 64) & Chr(((MyColumn_integer - 1) Mod 26) + 65)
    End If

    GetColumnLetter_ByInteger = column_letter

End Function

2 个答案:

答案 0 :(得分:0)

应该执行以下操作:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rep As Long, v
    If Target.Address = Me.Range("B2").Address Then
        v = Target.Value
        For rep = 8 To 25
            Me.Columns(rep).Hidden = (Me.Cells(5, rep).Value <> v)
        Next rep
    End If
End Sub

当您进入工作表代码模块时,可以使用Me来引用工作表。

将列号转换为字母是一件很痛苦的事,您根本不需要这样做。

答案 1 :(得分:0)

此代码将首先隐藏指定范围内的所有列,然后显示您在B2中指定的列。该系统的优势在于,先前显示的列将位于隐藏的列中。

Private Sub Worksheet_Change(ByVal Target As Range)

    Const TriggerCell As String = "B2"
    Const FirstColumnToHide As String = "G"
    Const LastColumnToHide = "BF"

    Dim Rng As Range
    Dim ClmToShow As Variant

    With Target
        If .Address = Range(TriggerCell).Address Then
            Application.ScreenUpdating = False
            ClmToShow = .Value
            On Error Resume Next
            ClmToShow = Columns(ClmToShow).Column
            If ClmToShow < Columns(FirstColumnToHide).Column Or _
               ClmToShow > Columns(LastColumnToHide).Column Then Exit Sub
            ' if TriggerCell doesn't contain a qualified column reference
            ' this would also be the case if an error occurred at this point

            On Error GoTo 0
            Set Rng = Range(Columns(FirstColumnToHide), Columns(LastColumnToHide))
            Rng.Columns.Hidden = True
            Columns(ClmToShow).Hidden = False
            Application.ScreenUpdating = True
        End If
    End With
End Sub

只要可行,请避免将常量散布在代码中。在这里很容易做到。所有常量都在代码顶部声明。如果将来有更改,可以在不更改代码本身的情况下进行。

相关问题