根据对另一个单元格的更改在单元格中添加值

时间:2016-05-17 21:27:25

标签: vba excel-vba excel

我需要一些关于我在下面的代码中做错的建议。我想要做的是,如果用户在"Add"中输入Range ("V"V")任何单元格,然后在范围("R:R")中的相应单元格中输入任何值,那么Range T (=r.offset (0,2))中相应单元格的值{1}}获取与R:R中的单元格相同的值,Range U (=r.offset (0,3))中的相应单元格与R:R单元格的值相同,但小写。

通过取出所有额外的东西来修改下面的代码。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
Dim A As Range, B As Range, Inte As Range, r As Range, r1 As Range, Inter As Range

    Set KeyCells = Range("A9:E9")
    Set A = Range("R:R")
    Set B = Range("V:V")
    Set Inte = Intersect(A, Target)
    Set Inter = Intersect(B, Target)
     Application.EnableEvents = True

    If Inter Is Nothing Then Exit Sub
    Application.EnableEvents = False
        For Each r In Inte
        For Each r1 In Inter
        If r1.Value = "Add" Then
            r.Offset(0, 2).Value = r.Value
            r.Offset(0, 3).Value = LCase(r.Value)
            End If
        Next r1
        Next r
    Application.EnableEvents = True
End Sub

1 个答案:

答案 0 :(得分:1)

这里有一些事情发生。我不确定你要做什么,但我会解释你的代码在做什么,也许这会有所帮助。

首先,您在评论中提到事件未触发。这是因为您已禁用事件,然后未捕获任何错误。因此,如果代码中有错误然后停止运行,则不会重新启用事件。关闭此代码中的事件是没有意义的。在此事件代码完成运行之前,Excel不会捕获任何其他事件。如果您认为必须,则添加错误处理程序并在发生错误时重新打开事件或记得手动执行。

您遇到的第二个问题是您的代码在逻辑上不起作用。您已将“Inte”设置为R列和目标的交集,但是您将“Inter”设置为V列和目标的交集。目标是刚刚更改的任何单元格,因此除非您一次更改多个单元格,否则只有一个单元格具有值,另一个单元格将为Nothing。

如果'Inte'为Nothing,语句“For Each r In Inte”将抛出错误,如果'Inter'为Nothing,则以下语句“For Each r1 In Inter”将抛出错误,因此您将获得在这里错了。你已经检查过'Inter'什么都没有,但是还需要检查'Inte'是否为空。

话虽如此,即使你有这个检查,你也永远不会运行这个代码,因为其中一个总是没有。

假设这两个单元格中都有某些东西,你编写的代码将遍历每个“Inte”单元格,对于每个“Inte”单元格,它将遍历“Inter”中的每个单元格。然后,每当'Inter'为'Add'时,它将运行代码,设置一些值。因此,如果任何单元格在第V列中具有“添加”值,则将更新范围“Inte”中的每一行。我怀疑这是出于什么目的。

我认为您不太了解“Worksheet_Change”事件的作用。每次更换单元格时都会触发。因此,如果您更改Cell V15,它将以Target为单元格V15运行。然后,如果更改单元格R15,它将再次运行,目标是单元格R15。因此,它一次仅触发一个单元格(除非您在同一时间更改多个单元格)

也许,这就是你要做的事情:

 Private Sub Worksheet_Change(ByVal Target As Range)
     Dim KeyCells As Range
     Dim A As Range, B As Range, Inte As Range, r As Range, r1 As Range, Inter As Range
     Dim ws As Worksheet

     Set ws = Target.Worksheet
     Set KeyCells = Range("A9:E9")
     Set A = Range("R:R")
     Set B = Range("V:V")
     Set Inte = Intersect(A, Target)
     Set Inter = Intersect(B, Target)

     If Inter Is Nothing Then
          'Do nothing
     Else
          For Each r In Inter
                If r.Value = "Add" Then
                     r.Offset(0, -2).Value = r.Offset(0,-4).Value
                     r.Offset(0, -1).Value = lCase(r.Offset(0,-4).Value)
                End If

          Next r
      End If
      If Inte Is Nothing Then
          'Do Nothing
      Else
           For Each r In Inte
                 If ws.Range("V" & r.Row) = "Add" Then
                      r.Offset(0, 2).Value = r.Value
                      r.Offset(0, 3).Value = LCase(r.Value)
                 End If
           Next r
      End If

 End Sub