我正在为Windows和Mac创建一个启用Excel宏的工作簿。我要在Mac上运行的一个平台是Excel 2011。
我的工作簿使用自定义功能区选项卡。有时,我希望根据用户的操作来更改功能区按钮的文本。所以我有执行此操作的代码。
我知道在Excel 2011中无法自定义“功能区”选项卡。没关系。但是,我的代码中有一行代码使我在该版本的Excel上出现编译错误。我以为我已经设置好了,如果在此版本的Excel上运行,它将不会编译代码,但是它似乎无法正常工作。
我正在定义用于标准模块内部的IRibbonUI类型的变量。 (模块是Module3,它专用于与功能区有关的代码。)我将变量定义代码(以及该模块中的其余代码)包装在#IF语句中,如下所示:
#If Not Mac or MAC_OFFICE_VERSION >=15 Then
Dim ribbonUI As IRibbonUI
... rest of the code in Module3 ...
#End If
这意味着它不应该在运行时在Excel 2011上进行编译。
打开工作簿时,我没有收到任何错误。但是,当我运行一个子程序(在Module1中将其称为“ UpdateOptions”,它在Module1中)时,它会调用一个更改功能区的子程序(在Module3 *中将其称为“ ChangeRibbon”),我得到了一个编译结果RibbonUI行出现错误:未定义用户定义类型
我不明白为什么,因为据我了解,该模块中的代码不应在运行时进行编译。
* ChangeRibbon绝对不应在Excel 2011上实际运行。我有一个IF语句来确保它不是,例如:
Sub UpdateOptions()
... some code ...
#If Not Mac or MAC_OFFICE_VERSION >=15 Then
Module3.ChangeRibbon
End If
... some other code ...
End Sub
当我单步执行代码时,由另一个子程序首次调用UpdateOptions时会发生错误。分步操作将突出显示子名称,作为引起错误的行:
Sub UpdateOptions()
有人知道为什么会这样吗?对我来说没有任何意义。
答案 0 :(得分:0)
我将其发布为答案,因为它不适合评论部分。
似乎您输入了代码,甚至认为不应输入。最简单的解释是,您的if语句未正确评估。您应该检查Mac
和MAC_OFFICE_VERSION
的值,这应该已经向您显示出了问题所在。另一个原因可能是您对VBA如何评估逻辑子句做出了错误的假设:https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/operator-precedence
如果拆分/嵌套If-Block,则更容易查看哪个评估出错:
Public Sub testVer()
#If Not Mac Then
Debug.Print "Not a Mac"
#Else
#If MAC_OFFICE_VERSION >= 15 Then
Debug.Print "Mac Version equal or above 15: ", MAC_OFFICE_VERSION
#Else
Debug.Print "Mac Version below 15: ", MAC_OFFICE_VERSION
#End If
#End If
End Sub
下面是一个小示例,用于了解如何评估if子句:
在VBA中,子句Not A Or B
与(Not A) Or B
相同,因此也许您只是混淆了逻辑。
Sub testOrNot()
printNotAOrB True, True
printNotAOrB True, False
printNotAOrB False, True
printNotAOrB False, False
End Sub
Private Sub printNotAOrB(A As Boolean, B As Boolean)
Debug.Print "A = " & A, "B = " & B
Debug.Print "Not A Or B :", Not A Or B
Debug.Print "Not (A Or B):", Not (A Or B)
Debug.Print "(Not A) Or B:", (Not A) Or B
Debug.Print
End Sub
答案 1 :(得分:0)
我想到了是否可以“假装” Excel 2011,以为我已经为IRibbonUI创建了自定义数据类型(事实证明,我也必须为另一种类型创建它)。工作了。在处理所有功能区代码的模块中,我将其放在顶部:
#If Mac And MAC_OFFICE_VERSION < 15 Then
Type IRibbonUI
ribbontype As String
End Type
Type IRibbonControl
ribboncontrol As String
End Type
#End If
我不再收到编译错误。
关于L8n的答案,我认为IF语句的逻辑不成问题。我还尝试调用很久以前创建的函数来测试Excel版本是否为Mac的Excel 2011。所以我的IF语句是这样开始的:
#IF ExcelForMac2011 = False Then
我知道我的函数可以正常工作,因为我在工作簿中多次调用它,并且一直可以正常工作。因此,我认为这不是IF语句中的逻辑问题。我认为这是Excel 2011中的错误。不幸的是,它有很多很多错误。