【问题标题】:Message box vba消息框 vba
【发布时间】:2013-03-14 15:28:01
【问题描述】:

请帮助我更正以下 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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

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

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

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

    第 1 部分存储状态

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

    然后除了检查If IsNumeric(c.Value) And c.Value > 0,您还需要检查上次存储它的数字是否

    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(&lt;where you want it&gt;).PasteSpecial ...。或者通过将值分配给变量,例如 Variant

    第 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2020-10-18
      相关资源
      最近更新 更多