如果其他单元格包含文本vba则更改单元格

时间:2017-04-02 19:30:57

标签: excel vba excel-vba event-handling worksheet

我曾经拥有以下代码并且它曾经工作但由于某种原因它不再有效。

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 =“Closed”

知道为什么它不再有用或者是否有其他宏的可能性?

1 个答案:

答案 0 :(得分:2)

删除冗余代码和非特定工作表引用。例如,当工作表不是活动表时,可以触发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的立即窗口,然后点击[输入]。您的早期代码可能会因禁用事件处理而崩溃。