Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 根据用户选择隐藏Excel列_Vba_Excel 2010 - Fatal编程技术网

Vba 根据用户选择隐藏Excel列

Vba 根据用户选择隐藏Excel列,vba,excel-2010,Vba,Excel 2010,我在单元格B2中有一个验证列表,它从第5行获得一个列表(G5:BF5) 我希望用户能够从验证列表中选择一个值,这将导致从G到BF的所有列都被隐藏,但与单元格B2中的值匹配的列标题除外 我已经使用了下面的代码,但不断得到应用程序定义或对象定义的错误 我正在使用以下VBA: 工作表>>更改 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$2" Then Dim the_selec

我在单元格B2中有一个验证列表,它从第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
公共函数GetColumnLetter\u ByInteger(什么数字作为整数)作为字符串
'此部分获取所选周的列字母。
GetColumnLetter_ByInteger=“”
如果MyColumn_整数为26,则
列字母=Chr(Int((MyColumn_integer-1)/26)+64)和Chr((MyColumn_integer-1)Mod 26)+65)
如果结束
GetColumnLetter\u ByInteger=列字母
端函数

像这样的东西应该可以做到:

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
Private子工作表\u更改(ByVal目标作为范围)
长,v
如果Target.Address=Me.Range(“B2”).Address,则
v=目标值
代表=8至25
Me.Columns(rep.Hidden=(Me.Cells(5,rep.Value v)
下一个代表
如果结束
端接头
当您在工作表代码模块中时,可以使用
Me
引用工作表


将列数字转换为字母是一件痛苦的事情,您永远不需要这样做。

此代码将首先隐藏指定范围内的所有列,然后显示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
Private子工作表\u更改(ByVal目标作为范围)
Const TriggerCell As String=“B2”
Const FirstColumnToHide As String=“G”
Const LastColumnToHide=“BF”
变暗Rng As范围
Dim ClmToShow作为变型
有目标
如果.Address=范围(TriggerCell).Address,则
Application.ScreenUpdating=False
ClmToShow=.Value
出错时继续下一步
ClmToShow=列(ClmToShow).Column
如果ClmToShow<列(FirstColumnToHide)。列或_
ClmToShow>列(LastColumnToHide)。列,然后退出子列
'如果TriggerCell不包含限定的列引用
'如果此时发生错误,也会出现这种情况
错误转到0
设置Rng=范围(列(FirstColumnToHide)、列(LastColumnToHide))
Rng.Columns.Hidden=True
列(ClmToShow).Hidden=False
Application.ScreenUpdating=True
如果结束
以
端接头

只要实现起来可行,就避免在代码中插入常量。在这里很容易做到。所有常量都在代码顶部声明。如果将来有更改,可以在那里完成,而无需触及代码本身。

谢谢!我会告诉您结果如何。@Tim Williams不需要使用
Me
标识符,因为如果未指定工作表,将使用活动工作表,并且活动工作表不能是触发更改事件的工作表以外的任何工作表。鉴于您的丰富经验,我想知道您是否遇到过不在工作表事件过程中指定选项卡(无论是使用
Me
还是其他方式)会产生有害影响的情况。@Variatus-我通常使用
Me
是因为它更明确,而不是因为它是必需的。类似地,我通常添加
,或者依赖
范围的默认属性
。然而,“激活的不能是触发更改事件的以外的任何一个”并不总是正确的:更改可能是宏的结果,不需要激活工作表。幸运的是,尽管图纸模块总是默认为自身,而不是ActiveSheet@Tim威廉姆斯,谢谢,谢谢!我会让你知道结果的。