【发布时间】:2020-09-20 09:23:14
【问题描述】:
tl;dr: 在下面的代码中,以下两个条件都评估为 True!!!如何?为什么?
If Not IsSaved ThenIf IsSaved Then
我正在使用 VBA Visual Basic 编辑器 (VBE) 对象。 .Saved 属性让我感到困惑。
如果实际上保存了 VBComponent 对象,(.Saved) 和 Not (.Saved) 都会返回 True。在评估条件之前,我什至尝试将属性显式强制为布尔值。以下是重现的步骤:
- 在新的 Excel 实例中打开一个空白工作簿
- 从标准模块(例如“Module1”)复制并运行以下代码:
Sub ListModules()
Dim VBComp As Object 'VBComponent
For Each VBComp In Application.VBE.ActiveVBProject.VBComponents
Dim IsSaved As Boolean
IsSaved = CBool(VBComp.Saved)
If CStr(VBComp.Saved) = "True" Then
Debug.Print vbNewLine; VBComp.Name; " saved? "; VBComp.Saved; " ("; TypeName(VBComp.Saved); ")"
If Not IsSaved Then
Debug.Print VBComp.Name; " is not saved"
End If
If IsSaved Then
Debug.Print VBComp.Name; " is saved"
End If
End If
Next VBComp
End Sub
'Sample output:
ListModules
ThisWorkbook saved? True (Boolean)
ThisWorkbook is not saved
ThisWorkbook is saved
Sheet1 saved? True (Boolean)
Sheet1 is not saved
Sheet1 is saved
注意:要运行此代码,您可能必须授予对 VBA 项目对象模型的访问权限:文件 -> 选项 -> 信任中心 -> [信任中心设置...] -> 宏设置 -> [x] 信任对 VBA 项目对象模型的访问
【问题讨论】:
-
我很惊讶
VBComponent.Saved没有崩溃。该属性没有存在的逻辑权利,因为很明显您无法保存整体的任何部分,例如工作表。Saved属性仅与整个项目相关。也许像 VBComponent.Parent.Saved 这样的东西可以按您的预期工作。 -
根据文档,该属性返回一个布尔值,指示对象自上次保存后是否被编辑和 True 表示对象自上次保存后未被编辑。我不确定它对项目有多大意义。
-
@Ron Rosenfeld 这对一个项目很有意义。对于其中的一个组件来说是没有意义的。我没有找到 MSDN 对
VBComponent对象的定义,我希望在其中找到它是否甚至具有Saved属性,因为它显然不应该。如果你找到了,可以发个链接吗?在我看来,您的解释通常只是指Saved属性。 -
这可能会有所帮助 - 对于模块
Saved的行为符合预期,对于 Type 100,'True' 是1和 'False' 是-2,但都不等于布尔值 @ 987654341@或False:Dim VBComp As Object 'VBComponent Debug.Print For Each VBComp In Application.VBE.ActiveVBProject.VBComponents IsSaved = CInt(VBComp.Saved) Debug.Print VBComp.Name; VBComp.Type; IsSaved; Not IsSaved; IsSaved = True; IsSaved = False Next VBComp -
THIS 解释它。请参阅讨论的部分,首先,了解逻辑操作和测试是两个不同的东西。。
Dim IsSaved As Boolean: IsSaved = 1是一个经典的例子。虽然Debug.Print IsSaved和Debug.Print True = -1和Debug.Print IsSaved= -1会给你True但Debug.Print IsSaved = 1会给你False