Для макросов VB для Office 2016 для Mac требуются разрешения при каждой попытке доступа к файлу! Есть ли способ обойти это поведение?

Любой макрос VB в Office 2016 показывает диалоговое окно для пользователя, запрашивающего разрешение, каждый раз, когда макрос пытается получить доступ к файлу! Есть ли способ избежать этого.

2 ответа

В отличие от макросов VB в Office для Mac 2011, макросы VB в Office 2016 для Mac по умолчанию не имеют доступа к внешним файлам. Приложения Office 2016 для Mac являются изолированной программной средой, и поэтому у них нет необходимых разрешений для доступа к внешним файлам.

Существующие команды файла макроса изменены, чтобы запросить у пользователя доступ к файлу, если приложение еще не имеет к нему доступа. Это означает, что макросы, которые обращаются к внешним файлам, не могут запускаться без присмотра; им потребуется взаимодействие с пользователем для подтверждения доступа к файлу при первой ссылке на каждый файл.

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

GrantAccessToMultipleFiles
Это позволяет вам вводить массив путей к файлам и запрашивать у пользователя разрешение на доступ к ним.

Boolean  GrantAccessToMultipleFiles(fileArray) 
  • параметры

    • fileArray - Массив путей к файлам POSIX.
  • Возвращаемые значения

    • True - пользователь предоставляет разрешение на файлы.
    • False - пользователь запрещает доступ к файлам.


Примечание. После предоставления разрешения сохраняются вместе с приложением, и пользователю больше не нужно предоставлять разрешение на файл.

Пример:

Sub requestFileAccess()  
  
'Declare Variables  
    Dim fileAccessGranted As Boolean  
    Dim filePermissionCandidates 
  
 'Create an array with file paths for which permissions are needed  
    filePermissionCandidates = Array("/Users/<user>/Desktop/test1.txt", "/Users/<user>/Desktop/test2.txt") 
  
'Request Access from User  
    fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates) 'returns true if access granted, false otherwise  
      
  
End Sub

Я хотел удалить файл в Excel, используя синтаксис VBA Kill, и получил запрос на разрешение, когда VBA попытался выполнить команду. Мой скрипт должен запускаться раз в 3 минуты днем ​​и ночью, поэтому ответы на отдельные подсказки не помогут.

Чтобы обойти эту проблему, я создал оболочку для функции VBA Kill под названием myKill. Для реализации я:

  1. Глобально заменил все вызовы Kill на myKill в моем коде VBA.

  2. Добавлена ​​новая подпрограмма VBA под названием myKill (код ниже)

  3. Создан файл AppleScript для фактического удаления файла (код ниже)

  4. Предоставлен полный доступ к диску Excel в Системных настройках/Безопасность и конфиденциальность/Конфиденциальность. Не уверен, что этот шаг был необходим, но я упоминаю об этом, поскольку это моя текущая конфигурация. Это бесполезно без первых трех шагов.

Вот подпрограмма myKill:

       Sub myKill(fname As String)

 Dim s As String

 If Left(Application.OperatingSystem, 3) = "Mac" Then
     s = AppleScriptTask("Kill.applescript", "Kill", fname)
 Else
     Kill fname
 End If

End Sub

Вот содержимое файла Kill.applescript:

      on Kill(fileName)
# implementation of vba kill command on Mac. Mac sandboxes Microsoft's
# kill command 

tell application "System Events" to delete alias fileName

end Kill

Файл Kill.applescript должен храниться в

       /Users/your user name/Library/Application Scripts/com.microsoft.excel/Kill.applescript

При первом выполнении сценария Apple Mac OS запросит у Excel разрешение на манипулирование файлами в каталоге, в котором находится удаляемый файл. После этого последующие удаления файлов в каталоге не будут вызывать запрос на разрешение. Я проверил это, выйдя из Excel, повторно войдя и удалив другой файл.

RANT Как кто-то думал, что заставлять программистов прыгать через все эти обручи или нажимать «ОК» каждый раз, когда нужно удалить файл, было приемлемой реализацией, я не понимаю. Поскольку кто-то в Microsoft отказался от абстрагирования простых манипуляций с файлами, таких как Убить более 10000 программистов, увидел эту веб-страницу, пытающуюся выяснить, что им нужно сделать, чтобы удалить файл в Microsoft Excel.

Эй, менеджер проектов Microsoft VBA! Я с тобой разговариваю! Ваша работа существует потому, что Джоэл Спольски убедил Билла Гейтса в том, что макроязык для Excel — хорошая идея, несмотря на сомнения Гейтса. Ваша задача состоит в том, чтобы гарантировать, что Excel VBA абстрагируется от странностей операционной системы , чтобы программисты могли выполнять свою работу и не должны были заниматься другим языком.

Другие вопросы по тегам