如果用户更改某个值,请避免使用Worksheet_Change事件

时间:2015-01-08 09:36:00

标签: excel vba excel-vba events worksheet-function

我想了解如何解决我的问题。 这是情况: 我在A2或B2领域输入值。在I2字段中,有一个公式应解析A2中的输入值:

=IF(LEFT([@[Value 1]];3) = "240";MID([@[Value 1]];4;9);IF(LEFT([@[Value 2]];3)="240";MID([@[Value 2]];4;9);""))

使用VBA我将值从I2复制到C2。我这样做是因为我想让用户更改该值,但因此不要删除字段中的公式。 问题是,当我在下面的行中输入值时,用户在C2中更改的值将再次从I2字段中复制。

我的代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    Dim LastRow1 As Integer
    Dim Row1 As Integer
    Dim LastRow2 As Integer
    Dim Row2 As Integer
    Dim LastRow3 As Integer

    Row2 = WorksheetFunction.Match(Target, Range("I:J"), 0)
    LastRow2 = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
    If Not Intersect(Target, Range("A1:A" & LastRow2)) Is Nothing Then
        For Row2 = 2 To LastRow2
          Cells(Row2, 3) = Range("I" & Row2).Value
        Next Row2
    End If
End Sub

程序示例:

A2值= 24089745312045697845 I2中的公式解析了这个= 897453120 并将此值复制到C2

C2中的用户更改值,所以我可以说他在那里写了MODIFIED。

下一步: A3值= 24053698712664234789 I3中的公式解析了这个= 536987126 并将此值复制到C3 但同时,C2中的值更改回897453120 - 我想在那里保持单词MODIFIED。

1 个答案:

答案 0 :(得分:0)

如果我理解正确的话......

    For Row2 = 2 To LastRow2
        'value has been already changed, do not recalculate
        If Cells(Row2, 3) <> Range("I" & Row2) Then GoTo SkipNext
        Cells(Row2, 3) = Range("I" & Row2)
SkipNext:
    Next Row2

注意:如果用户已将&#34; C1&#34; 清理为&#34; C&#34; &安培;第2行范围。

If Cells(Row2, 3) <> "" Then GoTo SkipNext