【问题标题】:Dynamic SelectionChange based on current active row基于当前活动行的动态选择更改
【发布时间】:2021-12-08 22:17:49
【问题描述】:

我为自己创建了一个包含多个相关下拉列表的工作表。 基本上,我希望在某个范围内发生更改时清除一个范围。 因此,我编写了下面的代码,它按预期工作,但它远非整洁。

这是代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = Range("D13").Address Then
Range("D13:H13").Value = ""
ElseIf Target.Address = Range("D14").Address Then
Range("D14:H14").Value = ""
ElseIf Target.Address = Range("D15").Address Then
Range("D15:H15").Value = ""
ElseIf Target.Address = Range("D16").Address Then
Range("D16:H16").Value = ""
ElseIf Target.Address = Range("D17").Address Then
Range("D17:H17").Value = ""
ElseIf Target.Address = Range("D18").Address Then
Range("D18:H18").Value = ""
ElseIf Target.Address = Range("D19").Address Then
Range("D19:H19").Value = ""
ElseIf Target.Address = Range("D20").Address Then
Range("D20:H20").Value = ""
ElseIf Target.Address = Range("D21").Address Then
Range("D21:H21").Value = ""
ElseIf Target.Address = Range("D22").Address Then
Range("D22:H22").Value = ""
ElseIf Target.Address = Range("D23").Address Then
Range("D23:H23").Value = ""
ElseIf Target.Address = Range("D24").Address Then
Range("D24:H24").Value = ""
ElseIf Target.Address = Range("D25").Address Then
Range("D25:H25").Value = ""
ElseIf Target.Address = Range("D26").Address Then
Range("D26:H26").Value = ""
ElseIf Target.Address = Range("D27").Address Then
Range("D27:H27").Value = ""
ElseIf Target.Address = Range("D28").Address Then
Range("D28:H28").Value = ""
ElseIf Target.Address = Range("D29").Address Then
Range("D29:H29").Value = ""
End If
End Sub 

现在我想要实现的是这样的:

If Target.Address = Range("D13:D29").Address Then
Range("D Target.Address.Row : H Target.Address.Row").Value = ""
End If
End Sub

如果有人能让我在如何使用 Target.Address 在范围选择或更合适的解决方案/选项中的正确方向上,我会非常感谢 :)

【问题讨论】:

    标签: excel vba excel-formula


    【解决方案1】:

    代码可以简化成这样。

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
        If Not Intersect(Target, Range("D13:D29")) Is Nothing Then
            Target.Resize(, 5).Value = ""
        End If
       
    End Sub
    

    【讨论】:

    • 如果Target 是一系列非连续单元格,这将不起作用。请参阅我解决此问题的答案。
    【解决方案2】:

    您可以使用循环和Resize,这样您就不必一遍又一遍地重复相同的代码:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim AffectedRange As Range  'check wich target cells are affected
        Set AffectedRange = Intersect(Target, Me.Range("D13:D29"))
    
        If Not AffectedRange Is Nothing Then
            Dim Cell As Range
            For Each Cell in AffectedRange ' clear range for each affected cell
                Cell.Resize(ColumnSize:=5).Value = vbNullString
            Next Cell
        End If
    End Sub
    

    【讨论】:

    • 谢谢,它就像一个魅力。你能解释一下 Resize(ColumnSize:=5) 到底是什么,做什么?其余的对我来说很有意义,感谢您的 geat 解决方案,它看起来好多了:) 这是否意味着从单元格 5 以及更远的单元格(6、7、8 等)都设置为 null?
    • @Mr.NeedHelpAlot Cell 始终是 D 列中的一个 Range("D13:D29")Cell.Resize(ColumnSize:=5) 调整为 5 列:从 D 列到 H 列。这是否回答了您的问题?
    • @peh 确实如此,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多