#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