gpt4 book ai didi

excel - 只显示一次 MsgBox

转载 作者:行者123 更新时间:2023-12-04 22:25:05 25 4
gpt4 key购买 nike

我有一个 VBA 脚本,内容如下:
1,选择特定工作表时将运行
2、判断条件是否为真
3、如果有,显示MsgBox

Private Sub Worksheet_Activate()
Dim current As Double
current = Round(((Range("AJ9").Value / Range("AG9").Value) * 100), 1)
If Range("AJ9").Value / Range("AG9").Value < 0.15 Then
MsgBox "Here is some message and some value: " & current & "%."
End If
End Sub

当用户来到工作表时,我只想第一次显示这个 MsgBox。现在每次用户访问工作表时它都会弹出。
我曾尝试使用来自不同 Sub 的变量,但它似乎不起作用。
Public read As Boolean
Sub readValue(Optional readArg As Boolean)
MsgBox readArg
read = (readArg Or False)
End Sub

然后我像这样修改了第一个 Sub:
Private Sub Worksheet_Activate()
Dim current As Double
current = Round(((Range("AJ9").Value / Range("AG9").Value) * 100), 1)
Call readValue
If read = False Then
If Range("AJ9").Value / Range("AG9").Value < 0.15 Then
MsgBox "Here is some message and some value: " & current & "%."
readValue read = True
End If
End If

但是 MsgBox readArg总是说 False .就好像它根本没有发送值(value)。因此,MsgBox 显示每次用户来到工作表。

我究竟做错了什么?

最佳答案

ByRef Optional 的分配参数使机制相当脆弱,标志不应该是 Public .

执行后,read初始化为 False ,然后是 Activate处理程序最终运行; readValue没有为其可选参数指定默认值,因此第一次调用( Call readValue ,...注意 Call 是多余的)弹出一个显示“False”的消息框,然后 read = (readArg Or False)计算结果为 False ...并且存在错误,因为此时您需要标志为 True - 无条件。

你在正确的轨道上,但它可以比这更简单:

Option Explicit
Private alreadyPrompted As Boolean

Private Sub Worksheet_Activate()

If alreadyPrompted Then Exit Sub

If Range("AJ9").Value / Range("AG9").Value < 0.15 Then
Dim current As Double
current = Round(((Range("AJ9").Value / Range("AG9").Value) * 100), 1)

MsgBox "Here is some message and some value: " & current & "%."
alreadyPrompted = True

End If
End Sub

另一种方法是将标志设为 Static本地的;这样的声明在过程调用之间保留了它们的值(value)——但要小心不要滥用它,因为这很容易让人混淆:
Option Explicit

Private Sub Worksheet_Activate()
Static alreadyPrompted As Boolean
If alreadyPrompted Then Exit Sub

If Range("AJ9").Value / Range("AG9").Value < 0.15 Then
Dim current As Double
current = Round(((Range("AJ9").Value / Range("AG9").Value) * 100), 1)

MsgBox "Here is some message and some value: " & current & "%."
alreadyPrompted = True

End If
End Sub

请注意,我已经计算了 current在两个片段中都是条件的,因为如果条件不为真,则不需要计算变量。

关于excel - 只显示一次 MsgBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58757410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com