更改单元格,如果其他单元格包含文本vba
我曾经有以下代码,它曾经工作但由于某种原因它不再有效。更改单元格,如果其他单元格包含文本vba
Private Sub Worksheet_Change(ByVal Target As Range)
Dim test As Range
Dim KeyCells As Range
Dim i As String
Set KeyCells = Range("AF3:AF5000")
test = Target.Rows.Count
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
For i = Target.Row To (Target.Row + (Target.Rows.Count - 1))
If Not ActiveSheet.Cells(i, 32) = "" Then
ActiveSheet.Cells(i, 20).Value = "Closed"
End If
Next
End If
End sub
基本上,如果有在列AF的任何单元中的数据,然后将所述细胞与在塔T的信息对准将标志着关闭。例如,如果AF65 <>“”那么T65.value =“关闭”
任何想法为什么它不再有效,或者如果有宏的另一种可能性?
摆脱冗余代码和非特定工作表引用。例如,当该工作表不是Activesheet时,可以触发一个Worksheet_Change;当不需要的时候放入Activesheet只会混淆问题。
你也没有禁用事件,所以你的子将尝试运行在自己之上。
这应该更接近你正在尝试执行。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("AF3:AF5000"), Target.Parent.UsedRange) Is Nothing Then
On Error GoTo safe_exit
Application.EnableEvents = False
Dim trgt As Range
For Each trgt In Intersect(Target, Range("AF3:AF5000"), Target.Parent.UsedRange)
If CBool(Len(trgt.Value2)) Then
trgt.Offset(0, -12) = "Closed"
Else
trgt.Offset(0, -12) = vbNullString
End If
Next trgt
End If
safe_exit:
Application.EnableEvents = True
End Sub
如果您的原始子只是“停止工作”然后把Application.EnableEvents = True
到VBE的立即窗口,然后点击[确定]。您的较早代码可能会因事件处理被禁用而崩溃。
真棒!这完美地工作@Jeeped。非常感谢:-)祝你有个美好的一天 –
我很好奇'交叉(目标,范围(“AF3:AF5000”),Target.Parent.UsedRange)' - 是否真的有任何方式,“目标”(即改变的单元格)不能成为'Target.Parent.UsedRange'的一部分? (例如,更改列的颜色是否触发更改事件?)(您可以告诉我不经常使用事件!) – YowE3K
@ YowE3K - 删除完整列或整行可以将Worksheet_Change丢到没有它的内容中。使用.UsedRange,至少您可以将Target内的单元格数量限制为工作表的.UsedRange。我在UDF中使用了一个类似的方法,以便可以在不处理每个单元格的情况下将完整的列引用传递到UDF中。 – Jeeped
我收集这是工作表的私人代码表中的Worksheet_Change事件子。这可能包括一些东西。 – Jeeped
嗨,是的,你是对的,我会在代码中添加。 –
它在什么时候起作用,什么时候起作用时发生了什么变化?例如你是否将代码复制到另一个工作簿(并将其放在错误的地方),你是否运行了其他一些禁用了“EnableEvents”的事件,并且您还没有可渲染的事件?你是否开始研究一个新的工作表(即不是那个有Change事件的工作表)?等等等等。 – YowE3K