gpt4 book ai didi

excel - VBA Visual Basic 编辑器(VBE)对象。保存 bool 错误?

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

这个问题在这里已经有了答案:





Weird behaviour of NOT

(3 个回答)



VBA: Why would the Not operator stop working? [duplicate]

(3 个回答)


1年前关闭。




tl;博士:在下面的代码中,以下两个条件两者都评估为 True !!!如何?为什么?

  • If Not IsSaved Then
  • If IsSaved Then

  • 我正在使用 VBA Visual Basic 编辑器 ( VBE ) 对象。 .Saved 属性让我很困惑。
    两个 (.Saved)Not (.Saved)返回 True如果实际上保存了 VBComponent 对象。在评估条件之前,我什至尝试将属性显式强制为 bool 值。以下是重现的步骤:
  • 在新的 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 项目对象模型的访问

    最佳答案

    @JMP 和 @SiddharthRout 对问题的评论揭示了答案。
    这是一个非标准的 bool 实现,其中 True1不是 -1 .
    但是,logical operations失败。
    例如 Not A运算是 A 的按位反转( bool 值存储时间长)。如果 A=-1它的位是1111111111111111并且反转是0000000000000000 .
    但是如果 A=1那么它的位是0000000000000001并且反转得到1111111111111110什么代表-2 .所以Not 1-2什么是True原样<> 0 !
    这就是为什么 Not VBComponent.Saved = True (=-2) 当 VBComponent.Saved = True (=1)太!

    | Assignment (a As Boolean) | Bits             | Value As Integer | Value As Boolean |
    |---------------------------|------------------|------------------|------------------|
    | a = True | 1111111111111111 | -1 | TRUE |
    | Not a | 0000000000000000 | 0 | FALSE |
    | | | | |
    | a = False | 0000000000000000 | 0 | FALSE |
    | Not a | 1111111111111111 | -1 | TRUE |
    | | | | |
    | VBComponent.Saved = True | 0000000000000001 | 1 | TRUE |
    | Not VBComponent.Saved | 1111111111111110 | -2 | TRUE |
    | | | | |
    | VBComponent.Saved = False | 0000000000000000 | 0 | FALSE |
    | Not VBComponent.Saved | 1111111111111111 | -1 | TRUE |
    Sub TestInversion()
    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; VBComp.Saved; CInt(VBComp.Saved); Not VBComp.Saved; Not CInt(VBComp.Saved); VBComp.Saved = True; VBComp.Saved = False
    Next VBComp
    End Sub
    现在我们错过了这种奇怪实现的原因,也许有人知道?

    关于excel - VBA Visual Basic 编辑器(VBE)对象。保存 bool 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63964157/

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