IsEmpty + Delete功能让我感到困惑......设置一个值

时间:2014-01-29 19:06:24

标签: excel vba excel-vba 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事件

- &GT;如果我将这个语句从宏中抛出(或注释它)并按下删除,我不能通过按删除删除值,因为书中说但是如何工作。 据我所知,当单元格为空时,IsEmpty返回一个True布尔应答,而当它不是时,则返回False。帮助说(当光标在IsEmpty中闪烁时请按F1键):

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

因此,如果我输入一个数值(宏添加数值输入),该值是否尚未初始化?当我们按Delete时,为什么它已被初始化?具体到底是什么意思,他的意思是初始化? - 我可能没有清楚看到有什么帮助意味着......

进一步了解代码我完全可以理解,因为当我们输入数值时它是一个更改事件,我可以完全理解目标是选择的单元格,值是我们输入的数字,但我们进一步禁用事件on和我们再次向oldVal分配target.value 我怀疑undo会事先放回该值,而旧的值会被分配给oldVal(如果是这样的情况请确认)但是如何我们真的可以将此分配给 - &gt; Target.Value?-it仅代表它所做的更改

之后我可以清楚地理解剩下的代码。我提到的第一行代码的主要内容我无法得到如何创建此功能的要点......

1 个答案:

答案 0 :(得分:3)

投票,因为你很好奇地问。但是,这里没有什么令人困惑的。上面宏的逻辑很简单。

  • 如果您要修改A1,则不会继续触发。
  • 如果它不在A列中,或突出显示的范围超过1列,则不会继续触发。
  • 如果您所在的单元格 活动单元格 为空,则它将不会继续触发,允许您为单元格输入初始值

如果不满足以上所有条件(意味着FALSE),则宏继续运行。接下来的几项检查很简单。

  • 好的,活跃的细胞不是空的。但是用户输入了一个号码吗?如果是,请继续运行。否则,删除他的输入并通知用户仅使用数字。
  • 如果用户提供了有效的号码,请执行以下操作:
    • 获取用户的输入,将其存储为newVal
    • 撤消输入,获取原始单元格的值并将其存储为oldVal
    • 将两者放在一起,然后将其放回牢房。

请勿与Delete按钮混淆。作者的意思就是这样:

Worksheet_Change事件几乎跟踪您在工作表上执行的每一项更改。这包括键入,编辑或删除单元格中的值。当您突出显示一个单元格时按下Delete按钮,就会导致上面的宏发生。

现在,如果以上行被 NOT 注释掉,宏将最终进入第三次检查,即检查目标单元格是否为空。由于您刚刚删除了内容, 当然是空的 。宏将退出,不会发生任何事情。

如果您 将其评论 ,则此检查将永远不会发生。当您删除单元格的内容时,您将继续运行,宏将一次又一次地撤消您的作业。

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

enter image description here

在上面的三行中加上与我相同的断点。请注意,我已将IsEmpty行注释掉了。现在在A2中输入一个值。尝试删除它。您将看到它被删除但宏中的第一个红线将突出显示。这意味着它现在正在检查您的手机内容。 IsNumeric检查将评估为TRUE,但不会退出您的代码。基本上,它将继续到底部。

F5 继续运行代码。

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

不要让自己对术语或帮助文件感到困惑。他们很有帮助。但在查看每个事情的作用之前,首先考虑代码的逻辑。隔离ifs和thens以及elses。有一个方便的纸张,并准备手写或绘制这个逻辑流程。当你不知道要找什么时,这比阅读帮助文件要好得多。

如果这清除了混乱,请告诉我们。 :)