这是一个关于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 事件
--> 如果我将这个语句从宏中抛出(或注释它)并且我按下删除,我无法通过按下删除来删除一个值,正如书中所说,但这是如何工作的。
据我所知,当单元格为空时,IsEmpty 返回一个 True bool 答案,而当它不是时返回 False。帮助说(当光标在 IsEmpty 中闪烁时请按 F1):
返回一个 bool 值,指示变量是否已初始化。
所以如果我输入一个数值(宏添加数值输入)这个值没有被初始化?为什么按Delete的时候已经初始化了?更具体地说,他的意思是初始化是什么意思?-我可能不清楚帮助的含义...
进一步深入代码我完全可以理解,因为当我们输入数值时它是一个更改事件,我可以完全理解目标是选择的单元格,值是我们输入的数字,但我们进一步禁用事件和 我们再次将 target.value 分配给 oldVal 我怀疑 undo 会预先放回该值,并且旧值是要分配给 oldVal 的(如果是这种情况,请确认)但是我们如何才能真正将其分配给 - -> Target.Value?-它只代表它所做的更改 。
之后我可以清楚地理解其余的代码。我对我提到的第一行代码的主要不满 我只是无法理解如何创建此功能的要点......
最佳答案
投了赞成票,因为你好奇地问。但是,这里没有什么令人困惑的地方。上面宏的逻辑很简单。
A1
,它不会继续发射。 如果以上所有条件都不满足(意思是
FALSE
),宏会继续运行。接下来的几项检查很简单。newVal
. oldVal
. 不要将自己与
Delete
混淆按钮。 作者的意思很简单:Worksheet_Change
事件几乎可以跟踪您在工作表上所做的每一个更改。这包括在单元格中输入、编辑或删除值。当您按下 Delete
按钮,同时突出显示一个单元格,您正在导致上面的宏发生。现在,如果上面的行是 不是 注释掉后,宏最终会进行第三次检查,即检查目标单元格是否为空。由于您刚刚删除了内容,当然是空的 .宏将退出,什么都不会发生。
如果你 注释掉 ,这个检查永远不会发生。当您删除单元格的内容时,您将继续运行,宏将一次又一次地撤消您的工作。
检查的方法很简单。请参阅下面的屏幕截图:
在上面的三行中放置与我相同的断点。请注意,我有
IsEmpty
行注释掉了。现在在 A2
中输入一个值.尝试删除它。您会看到它被删除,但宏中的第一条红线将突出显示。这意味着它现在正在检查您的单元格的内容。 IsNumeric
检查将评估为 TRUE
这不会退出您的代码。基本上,它会持续到底部。按 F5 继续运行代码。
现在您将到达
Application.Undo
.在到达这里之前,请注意 newVal
将存储您的新值 (0
)。现在,Application.Undo
将撤消您的删除操作。行和 0
将被添加到其中。基本上,您只是添加 0
重复到单元格的值 .不要被条款或帮助文件弄糊涂。他们很好,很有帮助。但在查找每件事的作用之前,请先考虑代码的逻辑。隔离 ifs 和 thens 和 elses。手边有一张纸,准备手写或画出这个逻辑流程。这比在您不知道要查找什么时阅读帮助文件要好得多。
让我们知道这是否消除了困惑。 :)
关于vba - IsEmpty + Delete 功能让我感到困惑......因为设置了一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21440289/