vba - IsEmpty + Delete 功能让我感到困惑......因为设置了一个值

标签 vba excel target

这是一个关于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 ,它不会继续发射。
  • 如果它不在 A 列中,或者突出显示的范围超过 1 列,则不会继续触发。
  • 如果您所在的单元格,事件单元为空,则它不会继续触发,允许您向单元格输入初始值。

  • 如果以上所有条件都不满足(意思是 FALSE ),宏会继续运行。接下来的几项检查很简单。
  • 好的,所以事件单元格不是空的。但是用户输入了一个数字吗?如果是,继续运行。否则,删除他的输入并通知用户只使用数字。
  • 如果用户提供了有效号码,请执行以下操作:
  • 获取用户输入,存储为newVal .
  • 撤消输入,获取原始单元格的值并将其存储为oldVal .
  • 将两者加在一起,然后将其放回单元格中。

  • 不要将自己与 Delete 混淆按钮。 作者的意思很简单:
    Worksheet_Change事件几乎可以跟踪您在工作表上所做的每一个更改。这包括在单元格中输入、编辑或删除值。当您按下 Delete按钮,同时突出显示一个单元格,您正在导致上面的宏发生。

    现在,如果上面的行是 不是 注释掉后,宏最终会进行第三次检查,即检查目标单元格是否为空。由于您刚刚删除了内容,当然是空的 .宏将退出,什么都不会发生。

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

    检查的方法很简单。请参阅下面的屏幕截图:

    enter image description here

    在上面的三行中放置与我相同的断点。请注意,我有 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/

    相关文章:

    java - Netbeans 中的 Ant : overriding run target doesn't work

    excel - 在两列a/o行之间查找最大的重复字母

    vba - 从 Excel VBA 将巨大数据集发布到 Web 服务

    excel - 我们是否无法在 .NET 4.0 中的通用对象中使用 Interop 对象?

    java - 如何为数组列表中的变量分配名称?

    android - 针对 Android 中的特定运营商

    javascript - 如何发送 Angular 值 (id) 以及重复数据目标来运行函数

    excel - 显示 1/8 英寸的 VBA 用户定义函数显示空白

    java - Apache POI 在编辑后保留预定义的宏

    获取类似excel的列名的Javascript算法