У меня есть код Windows VBA, который я хотел бы перевести для MAC, так как нет доступа к ActiveX FileSystemObject.
Моя цель - прочитать все имена файлов всех PNG-файлов в данной папке. Этот код хорошо работает в Windows, но приводит к «ошибке времени выполнения 429 компонент ActiveX не может создать объект» на MAC:
Function ReadFileNames(ByVal sPath As String) As Integer
Dim oFSO, oFolder, oFile As Object
Dim sFileName As String
Set oFSO = CreateObject("scripting.FileSystemObject")
Set oFolder = oFSO.getfolder(sPath)
For Each oFile In oFolder.Files
If Not oFile Is Nothing And Right(LCase(oFile.Name), 4) = ".png" Then ' read only PNG-Files
sFileName = oFile.Name
' do something with the FileName ...
End If
Next oFile
End Function
Кто-нибудь может перевести этот код для MAC?
Привет, спасибо за ответ. Не могли бы вы поделиться фрагментом кода? Должен признаться, я понятия не имею, что именно вы имеете в виду или как перевести это в код... для хранения имен файлов в виде строк?





Вот подпрограмма, использующая родную команду VBA DIR, которая перечисляет книги EXCEL в папке, печатая их имена в окне отладки:
Public Sub DirXlList()
Const cstrPath As String = "c:\users\xxxx\misc\"
Dim strDirItem As String
strDirItem = Dir(cstrPath & "*.xlsx")
While strDirItem <> ""
Debug.Print "FileName: " & strDirItem, "FullPath: " & cstrPath & strDirItem
strDirItem = Dir()
DoEvents
Wend
End Sub
Это помогает? В
Обновление: команда doevents позволяет Excel обрабатывать другие ожидающие действия пользовательского интерфейса, такие как обновление окна, щелчки мышью. Если у вас много файлов (тысячи) в папке, Excel может не отвечать или зависать в цикле, подобном этому. В этом нет необходимости, так как он снова станет отзывчивым после завершения цикла. Если у вас всего несколько сотен файлов, то это перебор. Удалите и попробуйте.
Хорошо... попробую проверить... пока не знаю, что делает "DoEvents". Нужна ли эта строка? И я думаю, что переменная «strDirItem» содержит одно имя файла за раз? Спасибо за вашу помощь!!
Я добавил объяснение, почему я использовал doevents. В моем тестовом случае у меня было более 10 тыс. файлов, и Excel не отвечал при обработке цикла без него. Да, вы используете strDirItem в качестве имени файла.
VBA для Mac может ссылаться на всю стандартную библиотеку c, как в этом примере:
Private Declare PtrSafe Function CopyMemory_byPtr Lib "libc.dylib" Alias "memmove" (ByVal dest As LongPtr, ByVal src As LongPtr, ByVal size As Long) As LongPtr
Мне лень расписывать для вас соответствующие примеры, но если вы случайно знакомы с использованием стандартной библиотеки c для манипулирования файлами, вы можете просто сделать это таким образом.
О, это тоже выглядит интересно. Если я узнаю, что это может работать лучше для меня, я буду придерживаться этого. Спасибо!! :-)
Вы можете использовать собственную команду VBA DIR для вывода списка файлов в сопоставленной папке диска (не в общих папках)