1

请帮助我更正以下 Excel 2007 的 VBA 代码。有人在适合我需要的论坛之一中为我提供了此代码。但是我在运行这段代码时遇到了一些问题。由于我不是程序员,因此无法纠正。所以请帮助克服这个问题。

问题是....消息从头到尾不断弹出。例如:如果单元格“P7”的值达到 0 到 1 以上,我会收到弹出消息,这很好。但有时单元格的值会在 0 以上波动,例如从 1 到 2、2 到 2.5 或 3....... 等等,因为单元格值是从其他单元格的计算中得出的(实时数据)。因此,对于单元格值的每次连续增加,我都会收到弹出消息。只有当单元格值超过 0 时才会弹出它,但不会出现从 0.5 到 1、1 到 2、2 到 2.5 或 3 的每一个进一步的增量..... 对于上述问题,我注意到,如果例如,单元格值“P7”超过 0 到 1.5 并停留在那里,随后“P8”或“P9”或两者的单元格值达到 0 以上,

以下是供您参考的代码。

Private Sub Worksheet_Calculate() 
    'Dimension variables
    Dim c As Range, Str1 As String

    'Set up a range to loop thru
    For Each c In Range("P7:P77,S7:S77")
        'Test if that cell contains a number >0
        If IsNumeric(c.Value) And c.Value > 0 Then
            'Which column are we in to calculate
            'The offset to column U and decide whether
            'to use Buy or Sell as our string
            Select Case c.Column
                Case Is = 16
                    Str1 = "Buy "
                    oset = 5
                Case Is = 19
                    Str1 = "Sell "
                    oset = 2
            End Select

           'Popup the message box
            MsgBox Str1 & c.Offset(, oset)
        End If
    Next
End Sub
4

1 回答 1

0

首先,我也不是程序员,但是这里希望对编码有一定程度的理解。为了解决这个问题,它将超越我担心的第一个基础知识。考虑到这一点,这是我对您问题的回答。

通过做两件事来解决这个问题:

  1. 在更改之前存储范围的状态
  2. 有一个状态表明您已经在此检查中,因此不希望再次激活它

PART 1 存储状态

通过将这些单元格复制到未使用的工作簿的一部分或将它们作为公共变量存储在 de VBA 代码中,将您检查的范围的状态存储在同一子例程中

然后除了检查之外,If IsNumeric(c.Value) And c.Value > 0您还需要检查上次存储它的数字是否<=0。因此,您的 If 语句将变为:

If IsNumeric(c.Value) And c.Value > 0 And d.Value <= 0 Then

d你的复制单元在哪里。您需要确定这些单元格的放置位置(最好使用固定偏移量,或者在完全相同的单元格中的隐藏工作表上!

或者使用尺寸为 7 到 77、16 到 19 的公共变量 pubVar(),可以在 Workbook_Open 中确定尺寸:

If IsNumeric(c.Value) And c.Value > 0 And pubVar(c.Row(), c.Column())<= 0 Then

现在,无论您采用哪种方式,都需要在脚本的末尾包含一个部分来实际存储单元格的状态,并使用 aRange("P7:P77,S7:S77").Copy 并将值粘贴到Range(<where you want it>).PasteSpecial .... 或者通过将值分配给变量,例如Variant

PART 2 拥有地位

获得一个状态,您可以使用一个公共变量,我会采用一个名为 booAlreadyChecking 的布尔值,并检查该布尔值 + 一个代码以更改其围绕当前代码的值:

If Not booAlreadyChecking Then 'Check if there is already another check running
    booAlreadyChecking = True 'Indicate that there is already a check so not another one will be started 
    For Each c In Range("P7:P77,S7:S77")
        ...
    Next
    booAlreadyChecking = False 'Enable a new check once this one is completed
End If
于 2013-03-14T16:05:26.993 回答