VBA on a MAC - 如何读取给定文件夹中的文件名(必须避免使用 Windows ActiveX 文件系统对象)

VBA on a MAC - How to read FileNames in a given Folder (have to avoid using the Windows ActiveX FileSystemObject)

我有一个 Windows VBA 代码,我想将其翻译为 MAC,因为无法访问 ActiveX FileSystemObject。

我的目标是读取给定文件夹中所有 PNG 文件的所有文件名。此代码在 windows 上运行良好,但在 MAC:

上导致“运行时错误 429 activex 组件无法创建对象”
    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 命令,通过在调试 window:

上打印其名称来列出文件夹中的 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 处理其他未决的用户界面活动,例如 window 刷新、mouse-clicks。如果一个文件夹中有很多文件(数千个),Excel 可能会像这样循环出现 unresponsive/frozen。这是没有必要的,因为一旦它完成循环,它就会再次响应。如果您只有几百个文件,那就太过分了。删除并尝试。

VBA for Mac 可以 link 到整个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标准库进行文件操作,你可以照着做。