Excel 2011 для Mac: ошибка компиляции в строке, которая не должна компилироваться - PullRequest
1 голос
/ 06 июля 2019

Я создаю книгу с поддержкой макросов Excel для Windows и Mac.Одна из платформ на 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.

Когда книга открывается, я не получаю никаких ошибок.Однако, когда я запускаю подпрограмму (назовем ее «UpdateOptions», и она находится в Module1), которая вызывает подпрограмму, которая изменяет ленту (давайте назовем эту «ChangeRibbon», которая находится в Module3 *), я получаю компиляциюошибка в строке 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 голосов
/ 06 июля 2019

У меня возникла мысль, можно ли «подделать» 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 Excel 2011 для Mac.Итак, мое утверждение IF начиналось так:

#IF ExcelForMac2011 = False Then

Я знаю, что моя функция работает правильно, потому что я много раз вызываю ее в своей книге, и она всегда работала правильно.Поэтому я не думаю, что это было логической проблемой в заявлении IF.Я думаю, что это была ошибка в Excel 2011. К сожалению, она имеет МНОГО, МНОГИХ ошибок.

0 голосов
/ 06 июля 2019

Я опубликую его как ответ, так как он не помещается в разделе комментариев.

Кажется, что вы вводите свой код, даже подумав, что не должны.Самое простое объяснение состоит в том, что ваше утверждение if не оценивается должным образом.Вы должны проверить значения Mac и MAC_OFFICE_VERSION, это уже должно показать вам, что пошло не так.Другая причина может заключаться в том, что вы сделали неверное предположение о том, как VBA оценивает логические предложения: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/operator-precedence

Если вы разбили / вложили блок If, легче увидеть, какая оценка идет не так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...