Excel VBA onChange事件

时间:2018-11-22 05:32:19

标签: excel vba excel-vba

当我在A列中输入值时,我试图触发一个onChange事件。

现在我想要这样做,如果我在A列到AS列之间输入任何值,则会触发该事件,并且如果我从同一列中删除任何值,它将在编写代码时起作用。

此外,如果我复制并粘贴多个数据将无法正常工作,如果我删除多个数据也将无法正常工作。

有人可以帮忙吗?下面是代码。

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Dim currentRow As Integer

    If Not Intersect(Target, Columns("A")) Is Nothing Then

        If Target.Value <> "" Then
            currentRow = Target.Row
            Target.Parent.Range("A" & currentRow & ":AS" & currentRow).Interior.ColorIndex = 15
            Target.Parent.Range("A" & currentRow & ":AS" & currentRow).Borders.LineStyle = xlContinuous
        End If

        If Target.Value = "" Then
            currentRow = Target.Row
            Target.Parent.Range("A" & currentRow & ":AS" & currentRow).Interior.ColorIndex = 0
            Target.Parent.Range("A" & currentRow & ":AS" & currentRow).Borders.LineStyle = xlNone
        End If

    End If
End Sub

1 个答案:

答案 0 :(得分:1)

Target.Value仅在选择单个单元格时才有值。如果选择多个单元格,它将成为一个数组,并且您的If语句将始终为False

这是更改代码的一种方法。我有点着急,所以可能可以做得更好,但是应该让您入门。

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Not Intersect(Target, Columns("A")) Is Nothing Then
        If Application.WorksheetFunction.CountA(Target) = 0 Then
            ' Empty Range
            For Each rw In Target.Rows
                Target.Parent.Range("A" & rw.Row & ":AS" & rw.Row).Interior.ColorIndex = 0
                Target.Parent.Range("A" & rw.Row & ":AS" & rw.Row).Borders.LineStyle = xlNone
            Next rw
        Else
            ' Not Empty
            For Each rw In Target.Rows
                Target.Parent.Range("A" & rw.Row & ":AS" & rw.Row).Interior.ColorIndex = 15
                Target.Parent.Range("A" & rw.Row & ":AS" & rw.Row).Borders.LineStyle = xlContinuous
            Next rw
        End If
    End If
End Sub