这是关于VBA的问题。
我发现了一个很好的Event Worksheet_Change代码,我无法理解几点,下面我将提交整个宏:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then Exit Sub
If Target.Column <> 1 Or Target.Cells.Count > 1 Then Exit Sub
If IsEmpty(Target) Then Exit Sub ' diablo wrote this line!
If IsNumeric(Target.Value) = False Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
MsgBox "You entered a non-numeric value.", vbExclamation, _
"Please: numbers only in column A!"
Exit Sub
End If
Dim oldVal As Double
Dim newVal As Double
newVal = Target.Value
Application.EnableEvents = False
Application.Undo
oldVal = Target.Value
Target.Value = oldVal + newVal
Application.EnableEvents = True
End Sub
现在让我感到困惑的是这段看似简单的代码。当我们把它放在一个事件驱动的编程宏中时,这意味着我的想法:
If IsEmpty(Target) Then Exit Sub
这本书写道(并且让我感到困惑):
按Delete键会触发Change事件。您可能希望删除单元格的内容并开始在空单元格中输入一组新数字,因此如果按下Delete键,则允许自己退出Change事件
- &GT;如果我将这个语句从宏中抛出(或注释它)并按下删除,我不能通过按删除删除值,因为书中说但是如何工作。 据我所知,当单元格为空时,IsEmpty返回一个True布尔应答,而当它不是时,则返回False。帮助说(当光标在IsEmpty中闪烁时请按F1键):
返回一个布尔值,指示变量是否已初始化。
因此,如果我输入一个数值(宏添加数值输入),该值是否尚未初始化?当我们按Delete时,为什么它已被初始化?具体到底是什么意思,他的意思是初始化? - 我可能没有清楚看到有什么帮助意味着......
进一步了解代码我完全可以理解,因为当我们输入数值时它是一个更改事件,我可以完全理解目标是选择的单元格,值是我们输入的数字,但我们进一步禁用事件on和我们再次向oldVal分配target.value 我怀疑undo会事先放回该值,而旧的值会被分配给oldVal(如果是这样的情况请确认)但是如何我们真的可以将此分配给 - &gt; Target.Value?-it仅代表它所做的更改。
之后我可以清楚地理解剩下的代码。我提到的第一行代码的主要内容我无法得到如何创建此功能的要点......
答案 0 :(得分:3)
投票,因为你很好奇地问。但是,这里没有什么令人困惑的。上面宏的逻辑很简单。
A1
,则不会继续触发。如果不满足以上所有条件(意味着FALSE
),则宏继续运行。接下来的几项检查很简单。
newVal
。oldVal
。 请勿与Delete
按钮混淆。作者的意思就是这样:
Worksheet_Change
事件几乎跟踪您在工作表上执行的每一项更改。这包括键入,编辑或删除单元格中的值。当您突出显示一个单元格时按下Delete
按钮,就会导致上面的宏发生。
现在,如果以上行被 NOT 注释掉,宏将最终进入第三次检查,即检查目标单元格是否为空。由于您刚刚删除了内容, 当然是空的 。宏将退出,不会发生任何事情。
如果您 将其评论 ,则此检查将永远不会发生。当您删除单元格的内容时,您将继续运行,宏将一次又一次地撤消您的作业。
检查方法很简单。请参阅下面的屏幕截图:
在上面的三行中加上与我相同的断点。请注意,我已将IsEmpty
行注释掉了。现在在A2
中输入一个值。尝试删除它。您将看到它被删除但宏中的第一个红线将突出显示。这意味着它现在正在检查您的手机内容。 IsNumeric
检查将评估为TRUE
,但不会退出您的代码。基本上,它将继续到底部。
按 F5 继续运行代码。
现在你将到达Application.Undo
。在到达此处之前,请注意newVal
将存储您的新值(0
)。现在,您的删除将被Application.Undo
行撤消,0
将被添加到其中。基本上, 您只是将0
重复添加到单元格的值 。
不要让自己对术语或帮助文件感到困惑。他们很有帮助。但在查看每个事情的作用之前,首先考虑代码的逻辑。隔离ifs和thens以及elses。有一个方便的纸张,并准备手写或绘制这个逻辑流程。当你不知道要找什么时,这比阅读帮助文件要好得多。
如果这清除了混乱,请告诉我们。 :)