Excel VBA事件根据用户输入计算

时间:2017-03-31 15:09:06

标签: excel-vba vba excel

为了开始这种情况,我是VBA编程的新手,所以任何帮助都将不胜感激。

我有两列;一个用户可以输入美元值(“AL”),另一个用户可以输入百分比值(“AK”)。对象是使用户能够输入值(%或$)并计算其他值。例如,如果用户在“AL”中输入10%,则适用的$值将在“AK”中生成,反之亦然。

以下是我迄今为止提出的代码,但它不起作用。任何想法/建议将不胜感激!谢谢!

if (callback != null) {
    callback.onDoSomething(someArg);
}

2 个答案:

答案 0 :(得分:2)

您需要删除Exit Sub

Application.EnableEvents = True需要在if。

之外

第一次使用Application.EnableEvents = False行启用它时,它会关闭事件,因为您在将它们重新打开之前退出了子目录,所以它保持关闭状态,并且从未再次调用该子目录。

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim cell As Range
   Set cell = Range("AK9:AL50")
   Application.EnableEvents = False

   If Not Application.Intersect(cell, Range(Target.Address)) Is Nothing Then
    If Target.Column = 37 Then ' Value in first column changed
        Range("AL" & Target.Row).Value = Range("AK" & Target.Row).Value / Range("V" & Target.Row).Value

    ElseIf Target.Column = 38 Then ' value in second column changed
        Range("AK" & Target.Row).Value = Range("AL" & Target.Row).Value * Range("V" & Target.Row).Value

    End If
    Application.EnableEvents = True
  End If
End Sub

我的猜测是你的事件被禁用了。

将上面的正确代码放入工作表后运行此代码:

Sub foooo()
Application.EnableEvents = True
End Sub

这将重新启用事件。它只需要一次。

答案 1 :(得分:1)

您可以更好地使用Worksheet_Change参数,例如Target

1.而不是:

Range("AL" & Target.Row).Value 

你可以使用:

Target.Offset(, 1).Value

2.而不是:

Range("AK" & Target.Row).Value 

你可以使用:

Target.Value

3.另外Range(Target.Address)实际上是Target

<强>代码

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cell As Range
Set cell = Range("AK9:AL50")

Application.EnableEvents = False

If Not Application.Intersect(cell, Target) Is Nothing Then
    If Target.Column = 37 Then ' Value in first column changed
        Target.Offset(, 1).Value = Target.Value / Range("V" & Target.Row).Value
    ElseIf Target.Column = 38 Then ' value in second column changed
        Target.Offset(, 2).Value = Target.Value * Range("V" & Target.Row).Value
    End If
End If
Application.EnableEvents = True '<-- RESTORE SETTING OUTSIDE THE IF

End Sub