繁体   English   中英

Excel VBA结合2个目标地址的工作表_更改代码

[英]Excel VBA combining Worksheet_Change codes for 2 target addresses

我是VBA的新手,想知道如何结合使用2个worksheet_change脚本,或者是否应该使用其他东西。

我有一个下拉列表,当选择该列表时会给另一个下拉列表带来依赖性。

对于第一个下拉菜单,我有用于过滤列的代码,以便其他列被隐藏。 第3行中有几列具有相同的文本,从而使多个列与第一个下拉列表相关联。 下面的代码对B2正常工作。

用户可以在第一个下拉菜单处停止,但是如果他们然后选择第二个下拉菜单,则我需要电子表格来进一步过滤列,因此仅显示一个列。 标题位于第4行。

目前,我有:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$2" Then
Dim the_selection As String
Dim the_group As String
the_selection = Sheet1.Range("B2")
    Dim Rep as Integer
    For Rep = 5 to 100
        the_column = GetColumnLetter_ByInteger(Rep)
        the_group = Sheet1.Range(the_column & "3")
            If the_selection = the_group Then
            Sheet1.Range(the_column & ":" & the_column).EntireColumn.Hidden = False
            Else
              Sheet1.Range(the_column & ":" & the_column).EntireColumn.Hidden = True
            End If
     Next Rep
End If

End Sub

如果我尝试为C2下拉列表创建一个Worksheet_SelectionChange,则可以正常工作,但是我必须单击该单元格之外的位置,然后再次单击才能对其进行正确过滤。 这是不理想的。 有没有一种方法可以将代码合并到Worksheet_change中。

另外,第二种选择是否也可能过滤行,以便仅显示具有值的行而隐藏空白的行? 第二个过滤器将始终过滤到一列,并且永远不会超过一列。 当用户选择另一个下拉菜单时,我将添加什么代码来重置行过滤器?

任何帮助表示赞赏。

兰多:)

您的原始代码可以改写为

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim the_selection As String
    Dim the_group As String
    Dim Rep As Long

    If Target.Address = "$B$2" Then
        the_selection = Sheet1.Range("B2") 'If this code is in Sheet1 you can just use "the_selection=Target".
        For Rep = 5 To 100
            the_group = Sheet1.Cells(3, Rep)
            Sheet1.Columns(Rep).Hidden = (the_selection <> the_group)
        Next Rep
    End If

End Sub  
  • Sheet1.Columns(Rep).Hidden需要TRUE或FALSE才能隐藏/显示列。
  • 如果the_selectionthe_group不同,则(the_selection <> the_group)将返回TRUE,否则返回FALSE。

您的组合代码可能是:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim the_selection As String
    Dim the_group As String
    Dim Rep As Long

    If Not Intersect(Target, Range("B2:C2")) Is Nothing Then
        the_selection = Target

        'Unhide all columns if B2 is changed.
        If Target.Address = "$B$2" Then
            Sheet1.Columns.Hidden = False
        End If

        For Rep = 5 To 100
            the_group = Sheet1.Cells(Target.Column + 1, Rep)
            Select Case Target.Address
                Case "$B$2"
                    Sheet1.Columns(Rep).Hidden = (the_selection <> the_group)
                Case "$C$2"
                    If Not Sheet1.Columns(Rep).Hidden Then
                        Sheet1.Columns(Rep).Hidden = (the_selection <> the_group)
                    End If
            End Select
        Next Rep
    End If

End Sub  
  • 该代码将从B2或C2中获取值( the_selection=Target )。
  • B2查看第3行,C2查看第4行-B列也是第2列,C列也是第3列,因此代码只添加了一个以获取正确的行号( the_group = Sheet1.Cells(Target.Column + 1, Rep) )。
  • 如果要更改的值为C2,则您不希望取消隐藏B2已隐藏的任何列,因此代码会在尝试隐藏该列之前检查该列是否尚未隐藏( If Not Sheet1.Columns(Rep).Hidden Then

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM