VBA на MAC — как читать имена файлов в заданной папке (следует избегать использования Windows ActiveX FileSystemObject)

У меня есть код 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 для вывода списка файлов в сопоставленной папке диска (не в общих папках)

tinazmu 09.05.2022 05:44

Привет, спасибо за ответ. Не могли бы вы поделиться фрагментом кода? Должен признаться, я понятия не имею, что именно вы имеете в виду или как перевести это в код... для хранения имен файлов в виде строк?

cody 09.05.2022 22:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот подпрограмма, использующая родную команду 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» содержит одно имя файла за раз? Спасибо за вашу помощь!!

cody 10.05.2022 20:26

Я добавил объяснение, почему я использовал doevents. В моем тестовом случае у меня было более 10 тыс. файлов, и Excel не отвечал при обработке цикла без него. Да, вы используете strDirItem в качестве имени файла.

tinazmu 10.05.2022 23:36

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 для манипулирования файлами, вы можете просто сделать это таким образом.

О, это тоже выглядит интересно. Если я узнаю, что это может работать лучше для меня, я буду придерживаться этого. Спасибо!! :-)

cody 10.05.2022 20:31

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