当小区D的值改变时,需要VBA代码来清除小区AQ的内容; Microsoft Excel for Office 365 MSO 32位


0

我会先说这个编程不是我的强项,但我会感激任何帮助。

当单元格D(在同一行上)的值发生变化时,我使用了以下公式来尝试清除单元格AQ的内容。目前,当单元格D中的值变为1时,内容仅在AQ中被清除(可能是由于“如果目标= 1然后”行。我使用什么代替“1”以便所有更改,任何值任何值,将启动单元格AQ的ClearContents指令?

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("D7:D506")) Is Nothing Then
        If Target = 1 Then
            Range("AQ" & Target.Row).ClearContents
        End If
    End If
End Sub

你为什么要测试If Target = 1?为什么不把它拿出去做If Not Intersect(Target, Range("D7:D506")) Is Nothing Then...... Range("AQ" & Target.Row).ClearContents
斯科特

嗨,斯科特,我只是想出来了。我应该在一小时前查看你的回复!回答你的问题:当一个人从网上的其他类似例子中抄袭所有人的代码时,问题就出现了。对于没有经验的人来说,简单的解决方案并不明显。虽然我有你,是否有我可以添加的代码,如果D的值更改为相同的值,将阻止AQ清除。(即D = 1,然后我再次输入D = 1)。目前,代码无法区分值的真实变化(即1到2)和仅重新输入相同的值(即1到1)。
MJS

有趣的问题。我的经验相当少Worksheet_Change。我假设您已通过实验验证,Worksheet_Change即使将单元格“更改”为其当前值,也会调用该例程?在那种情况下,我怀疑你运气不好(任何知道更好的人,随时纠正我!)。我可以建议的一件事是你保留Column的备份副本  D,并将“new”值与你保存的副本进行比较。
斯科特

谢谢@Christofer Weber。我的代码存在一些问题,但在此期间我在另一个论坛上收到了一个(看似可行的)解决方案,所以希望现在不需要这个。但是,谢谢你的时间和精力。
MJS

Answers:


0

为确保发生真正的更改,我们首先将所选单元格的值保存为公共变量。由于您可以一次选择多个单元格,因此我决定使用公共集合。

然后,当发生更改时,我们将该单元格的新值与集合中的旧值进行比较,并且只有在它们不匹配时才清除AQ的内容。就像是:

Public coll As New Collection

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cel As Range
    Set coll = New Collection
    If Not Intersect(Target, Range("D7:D506")) Is Nothing Then
        For Each cel In Target
            coll.Add cel.Value, cel.Address
        Next cel
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("D7:D506")) Is Nothing Then
        If Not Target.Value = coll(Target.Address) Then
           Range("AQ" & Target.Row).ClearContents
        End If
    End If
End Sub

编辑更新以在选择多个单元格时起作用。

显然,如果在Range("D7:D506")没有实际选择单元格的情况下更改值,则此代码将引发错误。

想想看,如果删除该值,可以一次编辑多个单元格。那么这段代码也会抛出一个错误。但我们可以通过使用与Worksheet_Change我们相同的方法来解决这个问题Worksheet_SelectionChange

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cel As Range
    If Not Intersect(Target, Range("D7:D506")) Is Nothing Then
        For Each cel In Target
            If Not cel.Value = coll(cel.Address) Then
                Range("AQ" & cel.Row).ClearContents
            End If
        Next cel
    End If
End Sub

1
(1)很好。我正在考虑在D工作表上的其他地方保留Column的副本  (例如,Column  AD); 将它保存在VBA内存中似乎更安全。(2)问题的标题和之间If Not Intersect(Target, Range("D7:D506")) Is Nothing Then线路,看来用户仅与有关的变化  列  D; 特别是在该范围内D7:D506。所以我建议你的例程应该做,不是For Each cel In Target,而是For Each cel In Intersect(Target, Range("D7:D506"))
斯科特

将交叉置于for循环条件下?没想到这一点。我喜欢!效率很高。
Christofer Weber
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.