请帮我修改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
答案 0 :(得分:0)
首先,我不是程序员,但是这里需要一定程度的理解编码。为了解决这个问题,它将超越我担心的第一个基础。考虑到这一点,这是我对你问题的回答。
通过做两件事来解决这个问题:
第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