Вернуть, если файл существует, VBA Mac Office 2011

#macos #vba #file-io #ms-office

#macos #vba #file-io #ms-office

Вопрос:

Я пытаюсь проверить, существует ли файл с помощью VBA в Mac Office 2011.

Мой макрос работает с Office 2004, но не работает с 2011.

Я использую функцию Dir. Если функция ничего не возвращает, это означает, что файл не существует. Но в Office 2011 функция возвращает код ошибки 76, когда файл не существует.

Ответ №1:

Вы можете просто создать свою собственную функцию, которая обрабатывает ошибку. Например, что-то вроде этого:

 Function FileExists(ByVal AFileName As String) As Boolean
    On Error GoTo Catch

    FileSystem.FileLen AFileName

    FileExists = True

    GoTo Finally

    Catch:
        FileExists = False
    Finally:
End Function

Sub Test()
  If FileExists("Macintosh HD:Library:User Pictures:Flowers:Flower.tif") Then
    MsgBox "File exists"
  Else
    MsgBox "File doesn't exists"
  End If
End Sub
  

Ответ №2:

Решение, указанное в ответе 1, должно сработать. Но произойдет сбой каждый раз, когда вы столкнетесь с проблемой с усеченным именем файла, которая является причиной Mac Excel 2011 — даже с пакетом обновления 1.

Основная проблема описана в Microsoft http://answers.microsoft.com/en-us/mac/forum/macoffice2011-macexcel/help-xl-2011s-dir-function-truncates-filename/e72fbf5d-749c-4a55-a77c-e2def6db24d9?msgId=644b9f20-251b-46fe-8df3-f5a28a1c37f6

и объект файловой системы имеет ту же проблему, что и при использовании встроенной функции Dir VBA.

Другими словами, он возвращает то же усеченное имя файла, что и Dir, следовательно, вы фактически не можете определить, существует ли файл с длинным именем, имя, которое на самом деле отображается пользователю в списке в Finder, с помощью VBA за Excel 2011 SP1, не прибегая к AppleScripting!

Комментарии:

1. все еще проблема с SP2 (14.2.3)

Ответ №3:

Лучший ответ находится на веб-сайте msft: http://msdn.microsoft.com/en-us/library/office/jj614412 (v=office.14).aspx

Например:

 Sub TestFile()
'First argument, 1 = file and 2 = folder.
'Note: This macro uses the FileOrFolderExistsOnMac function.
    If FileOrFolderExistsOnMac(1, "Macintosh HD:Users:<user name>:Documents:YourFileName.xlsx") = True Then
        MsgBox "File exists."
    Else
        MsgBox "File does not exist."
    End If
End Sub

Sub TestFolder()
'First argument, 1 = file and 2 = folder.
'Note: This macro uses the FileOrFolderExistsOnMac function.
    If FileOrFolderExistsOnMac(2, "Macintosh HD:Users:<user name>:Documents") = True Then
        MsgBox "Folder exists."
    Else
        MsgBox "Folder does not exist."
    End If
End Sub

Function FileOrFolderExistsOnMac(FileOrFolder As Long, FileOrFolderstr As String) As Boolean
'By Ron de Bruin
'30-July-2012
'Function to test whether a file or folder exist on a Mac.
'Uses AppleScript to avoid the problem with long file names.
    Dim ScriptToCheckFileFolder As String
    ScriptToCheckFileFolder = "tell application " amp; Chr(34) amp; "Finder" amp; Chr(34) amp; Chr(13)
    If FileOrFolder = 1 Then
        ScriptToCheckFileFolder = ScriptToCheckFileFolder amp; "exists file " amp; _
        Chr(34) amp; FileOrFolderstr amp; Chr(34) amp; Chr(13)
    Else
        ScriptToCheckFileFolder = ScriptToCheckFileFolder amp; "exists folder " amp; _
        Chr(34) amp; FileOrFolderstr amp; Chr(34) amp; Chr(13)
    End If
    ScriptToCheckFileFolder = ScriptToCheckFileFolder amp; "end tell" amp; Chr(13)
    FileOrFolderExistsOnMac = MacScript(ScriptToCheckFileFolder)
End Function