消息框vba

时间:2013-03-14 15:28:02

标签: excel vba

请帮我修改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以上,我就是同时获取“P7”的弹出消息以及“P8”和“P9”而不是“P8”或“P9”。

以下是供您参考的代码。

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

1 个答案:

答案 0 :(得分:0)

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

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

  1. 在更改范围之前存储范围的状态
  2. 有一个状态表明您已经在此支票中,因此不希望再次激活
  3. 第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
    

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

    第2部分具有状态

    拥有状态,您可以使用公共变量,我会使用名为booAlreadyChecking的布尔值,并检查该布尔值+代码以更改其当前代码所包含的值:< / p>

    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