Mac的Excel 2011:在线上不应编译的错误

时间:2019-07-06 07:36:31

标签: excel vba

我正在为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()

有人知道为什么会这样吗?对我来说没有任何意义。

2 个答案:

答案 0 :(得分:0)

我将其发布为答案,因为它不适合评论部分。

似乎您输入了代码,甚至认为不应输入。最简单的解释是,您的if语句未正确评估。您应该检查MacMAC_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中的错误。不幸的是,它有很多很多错误。