IsEmpty + Deletefunction让我困惑……设置一个值

这是关于VBA的一个问题。

我发现了一个Event Worksheet_Change代码,我不能理解几点,下面我将提交整个macros:

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 

现在令我困惑的是这个看似简单的代码。 当我们把它放在一个事件驱动的编程macros中的时候,它的意义就变得更加复杂了:

 If IsEmpty(Target) Then Exit Sub 

这本书写道(而且让我迷惑):

按下Delete键将触发Change事件。 你可能想删除一个单元格的内容,并开始在一个空单元格中input一组新的数字,所以如果按下Delete键,让你自己可以退出Change事件

– >如果我把这个语句从macros(或评论它),我按删除我不能删除一个值按删除,因为书说,但如何工作。 就我所知,IsEmpty在单元格为空时返回True布尔值,当不是时则为False。 帮助说(按F1键,而光标闪烁在IsEmpty):

返回一个布尔值,指示variables是否已被初始化。

所以,如果我input一个数值(macros添加数值input)该值尚未初始化? 为什么当我们按删除时已经初始化了? 什么意思是什么意思呢? – 我可能不清楚帮助是什么意思…

进一步深入代码,我可以绝对理解,因为它是一个改变事件,当我们input一个数值,我可以完全理解,目标是单元格select和值是我们input的数字,但我们进一步禁用事件, 我们是再次分配给oldVal的target.value我怀疑,撤回放回的价值,旧的价值是在那里分配给oldVal(如果这种情况下,请确认)但我们怎么能真正把这个– >目标.Value? – 它仅代表它所做的更改

之后,我可以清楚地了解其余的代码。 我在我提到的第一行代码中的主要牛肉我不能得到如何创build此function的要点…

因为你有足够的好奇才能问。 但是,这里没有任何混淆。 上面macros的逻辑很简单。

  • 如果你正在修改A1 ,它将不会继续发射。
  • 如果不在列A中,或者突出显示的范围超过1列,则不会继续触发。
  • 如果你正在使用的单元格, 活动单元格是空的,那么它将不会继续触发,从而允许您为单元格input一个初始值。

如果以上所有都不满意(意思是FALSE ),macros将继续运行。 接下来的几个检查很简单。

  • 好的,所以活动单元不是空的。 但是用户input了一个数字吗? 如果是,继续运行。 否则,删除他的input并通知用户只使用数字。
  • 如果用户提供了有效的号码,请执行以下操作:
    • 获取用户的input,并将其存储为newVal
    • 撤消input,获取原始单元格的值并将其存储为oldVal
    • 把两个加在一起,放回到单元格中。

不要将自己与“ Deletebutton混淆。 作者的意思是这样的:

Worksheet_Change事件跟踪您在Worksheet_Change上进行的几乎每一项更改。 这包括从单元格input,编辑或删除值。 当突出显示一个单元格时,按下“ Deletebutton时,会导致上述macros发生。

现在,如果上面的行没有被注释掉,macros将最终到达第三个检查,即检查目标单元是否为空。 由于您刚刚删除了内容, 当然是空的 。 macros将退出,什么都不会发生。

如果你注释掉 ,这个检查将不会发生。 当你删除单元格的内容时,你将继续运行,macros将一次又一次地撤销你的工作。

检查它的方法很简单。 看到我的截图如下:

在这里输入图像说明

把我在上面三行上的断点放在一起。 请注意,我已将IsEmpty行注释掉了。 现在在A2input一个值。 尝试删除它。 你会看到它被删除,但macros中的第一个红线会突出显示。 这意味着它现在正在检查你的单元格的内容。 IsNumeric检查将计算为TRUE ,这将不会退出您的代码。 基本上它会持续到底部。

F5继续运行代码。

现在你将到达Application.Undo 。 在到达这里之前,请注意newVal将存储您的新值( 0 )。 现在,您的删除将被撤消Application.Undo行,并将0添加到它。 基本上, 你只是重复加0到单元格的值

不要让自己感到困惑的条款或帮助文件。 他们很好,很有帮助。 但在查看每件事情之前,先考虑代码的逻辑。 隔离ifs,thens和elses。 准备好一张纸,准备用手写或画出这个逻辑stream程。 当你不知道要找什么时,这比读取帮助文件要好得多。

让我们知道这是否会消除混乱。 🙂