为何`#If Not Win64 Then`代码会在32位Office执行且在64位Office中被异常调用?
针对你的两个问题,逐一解答如下:
问题1:为何#If Not Win64 Then代码会在32位Office中执行?
这是完全符合预期的正常行为。VBA的编译常量Win64是由Office环境自动赋值的:
- 在32位Office中,
Win64被解析为False - 在64位Office中,
Win64被解析为True
所以#If Not Win64 Then等价于#If True Then(在32位Office环境下),代码块自然会被执行——这正好匹配你「仅让代码在32位Office运行」的需求。
问题2:64位Office中DoSomethingOnlyIn32BitOffice被意外调用,哪里出错了?
你遇到的问题核心是:64位Office环境中,编译常量Win64没有被正确识别为True,导致Not Win64的判断结果为True,代码块被错误执行。常见原因及解决方法如下:
项目未重新编译:
#If...Then是编译时判断,代码的执行逻辑在编译阶段就已固化。如果你的VBA项目最初是在32位Office中创建并编译的,直接在64位Office中打开时,旧的编译结果可能被保留,导致判断逻辑沿用32位环境的设定。
解决方法:打开VBA编辑器,点击顶部菜单的「调试」→「编译VBA项目」,完成编译后重新运行代码。手动定义了同名常量:
检查你的代码中是否存在手动声明Win64常量的语句,比如:Const Win64 As Boolean = False手动定义的常量会覆盖Office系统自带的编译常量,导致判断逻辑完全失效。删除这类自定义常量即可恢复正常。
Office位数实际不符:
极少数情况下,64位Office的安装可能出现异常,导致VBA环境实际运行在32位模式下。你可以运行以下代码验证当前Office的实际位数:Sub VerifyOfficeBitness() Dim osInfo As String osInfo = Application.OperatingSystem If InStr(osInfo, "64-bit") > 0 Then MsgBox "当前环境:64位Office" Else MsgBox "当前环境:32位Office" End If End Sub如果结果显示为32位,说明你的Office安装可能存在问题,需要重新安装64位版本。
内容的提问来源于stack exchange,提问作者Heinzi
相关产品推荐
相关产品推荐

