簡體   English   中英

留言框VBA

[英]Message box 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. 在范圍更改之前存儲范圍的狀態
  2. 具有狀態以指示您已經在此檢查中,因此不希望再次激活它

第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("P7:P77,S7:S77").CopyRange("P7:P77,S7:S77").Copy並粘貼到Range(<where you want it>).PasteSpecial ... 或者通過將值分配給變量,例如Variant

第2部分

擁有一個Status,您可以使用一個公共變量,我將使用一個名為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM