Vba 根据用户选择隐藏Excel列
我在单元格B2中有一个验证列表,它从第5行获得一个列表(G5:BF5) 我希望用户能够从验证列表中选择一个值,这将导致从G到BF的所有列都被隐藏,但与单元格B2中的值匹配的列标题除外 我已经使用了下面的代码,但不断得到应用程序定义或对象定义的错误 我正在使用以下VBA: 工作表>>更改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
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威廉姆斯,谢谢,谢谢!我会让你知道结果的。