Тест предварительной компиляции Excel VBA для динамического массива

Начали модерировать навыки программирования Excel VBA, пытаясь совместно использовать код в более старых 32- и 64-разрядных версиях Windows 10 и эмулированных Office 365 Windows на Mac: когда одна платформа не распознает недавние добавления динамического массива { } (многоячеечный массив) и @ (оператор неявного пересечения), а другая платформа не распознает команду Cells.Replace с конструкцией Formula2, но я использую Indirect и & (объединение) для переменных с уникальными идентификаторами (где стандартная функция поиска не работает), но Excel рассматривая их как массив. В одной платформе нужна Formula2 (Mac пропускает инструкцию), в другой с ней даже не компилируется (останавливается вообще), а без нее код макроса вылетает (Mac должен читать формулы на листе, чтобы получить значение, а не из объявленная переменная из-за проблем с песочницей). Я пытаюсь выполнить запрос предварительной компиляции, чтобы обойти тест на ошибку, как показано, но это не удается. Предложения по тесту предварительной компиляции, чтобы предотвратить автоматическое добавление в Excel фигурных скобок {} или символов @?

#If IsError(Cells.Replace What:=WhatNow, Replacement:=Whatzit, LookAt:=xlPart, FormulaVersion:=xlReplaceFormula2) Then

person Stephen Rush    schedule 12.05.2021    source источник
comment
Не зная вашего кода, я предполагаю, что вы пишете формулы на листе? Почему бы сначала не проверить версию и не написать соответствующий код в зависимости от версии? Или вообще не пишите формулы. Просто выполните расчеты в VBA.   -  person Ron Rosenfeld    schedule 13.05.2021
comment
Да, запись формул на лист (как требуется в среде Mac). Но также есть заранее написанные формулы. re: Запустить проверку версии: если бы это было так просто, я бы так и сделал. Опять же, эмулированная среда Office 365 Windows 10 на Mac неотличима от реальной ОС, и любой тест на версию подходит для Office 365 Windows 10.   -  person Stephen Rush    schedule 14.05.2021
comment
Формул на существующем листе столько же, сколько кода макроса в VBA, и слишком много. Итак, ответ — проверка VBA. Только предложения пожалуйста.   -  person Stephen Rush    schedule 14.05.2021
comment
Хм. Проверка версии для версии VBA возвращает Office 365 Windows 10? Как ты это делаешь? У меня нет Mac для тестирования. Я проведу еще несколько исследований.   -  person Ron Rosenfeld    schedule 14.05.2021
comment
Ой. Эмулятор ОС — Parallels, который создает виртуальный диск, изображающий из себя Win10, что позволяет функционировать Ofc365. Таким образом, VBA с If Application.OperatingSystem Like Mac не работает, потому что он работает внутри эмулируемой Windows. Любая проверка версии, следующая за этой командой, игнорируется (например, If Val(Application.Version) ‹) и переходит к моему средству проверки WinOS. Но клавиатура и песочница ведут себя как Mac.   -  person Stephen Rush    schedule 15.05.2021
comment
Ваш вопрос натолкнул на мысль. Что вы думаете об использовании Application.Evaluate для тестирования конструкции формулы2 динамического массива и разделения логики версии ОС в случае сбоя?   -  person Stephen Rush    schedule 15.05.2021
comment
Взгляните на этот если это не то, что вы используете. Я предполагаю, что либо у вас есть, либо он не вернет Mac, но стоит проверить, если вы еще этого не сделали.   -  person Ron Rosenfeld    schedule 15.05.2021
comment
Эмулятор в Mac маскирует среду, так что особо не помогает.   -  person Stephen Rush    schedule 18.05.2021


Ответы (1)


Поскольку «xlReplaceFormula2» должен быть включен в определенные среды Mac, но не используется более старыми компиляторами, конструкция Formula2 должна быть помещена в операторы предварительной компиляции (#). Однако тест для новых формул не будет выполняться в режиме предварительной компиляции, поскольку он создает ошибку несоответствия типов. Вот обходной путь, который я нашел:

а) проверить новые формулы, чтобы определить, создает ли среда специальные символы динамического массива ({}, @), и б) выполнить команду замены в операторе предварительной компиляции.

Это позволяет заменять лишние символы, чтобы не мешать работе формулы на старых платформах, где вместо сводной таблицы или элементарных формулировок поиска используются настраиваемые комбинации конкатенации (&).

    Dim WhatNow, Whatzit

   'Define special character
    WhatNow = "@"  'eg, "{", "}"
   'Define formula to edit
    Whatzit = "Cells"  'eg, "If", "Indirect", etc.

   'Test for formula that contains dynamic array
    If Application.Evaluate("=XLOOKUP(1,{1,2,3},{3,2,1})") Then
       'Include 'xlReplaceFormula2' within a precompile (#) 'If' statement
        #If Not Err = 0 Then
         Cells.Replace What:=WhatNow, Replacement:=Whatzit, LookAt:=xlPart, _
             SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
             ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
        #Else
        'Else, older platform - use older formula construct
         Cells.Replace What:=WhatNow, Replacement:=Whatzit, LookAt:=xlPart, _
             SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
             ReplaceFormat:=False
        #End If
    End If
person Stephen Rush    schedule 17.05.2021