首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >VBA Excel从GetFolder.Files返回的files集合中获取第一个文件名

VBA Excel从GetFolder.Files返回的files集合中获取第一个文件名
EN

Stack Overflow用户
提问于 2013-10-22 21:59:23
回答 5查看 14.7K关注 0票数 3

我正在尝试获取目录的第一个文件。我并不关心"first“在这种情况下没有很好地定义,我也不关心我每次调用sub时是否会得到不同的文件。

我试着使用:

Dim FSO As Object
Dim SourceFolder As Object

Dim FileItem As Object

Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.GetFolder(SourceFolderName)

Set FileItem = SourceFolder.Files.Item(0)

但是这会返回一个编译器错误(“无效的过程调用或参数”)你能告诉我怎么做吗?

谢谢,李

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-10-23 01:11:21

在我看来,就像你在Scripting.Folders中提到的那样,SourceFolder.Files只会接受一个字符串作为键。我认为Santosh的答案是可行的,但这里是对您的代码的一个笨拙的修改,它返回文件夹中的“第一个”文件:

Sub test()

Dim FSO As Object
Dim SourceFolder As Object
Dim FileItem As Object
Dim FileItemToUse As Object
Dim SourceFolderName As String
Dim i As Long

SourceFolderName = "C:\Users\dglancy\Documents\temp"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.GetFolder(SourceFolderName)

For Each FileItem In SourceFolder.Files
    If i = 0 Then
        Set FileItemToUse = FileItem
        Exit For
    End If
Next FileItem

Debug.Print FileItemToUse.Name
End Sub
票数 2
EN

Stack Overflow用户

发布于 2013-10-22 22:11:30

您可以在Dir函数中使用bulit

下面是示例代码,它返回从Test文件夹找到的第一个文件的名称。

Sub test()

    Dim strFile As String
    strFile = Dir("D:Test\", vbNormal)

End Sub
票数 4
EN

Stack Overflow用户

发布于 2014-09-24 03:11:34

诚然,VBA有一个限制(我认为是错误或设计缺陷),即文件系统对象的Files集合不能通过项目索引号访问,只能通过每个项目的文件路径字符串值访问。这里发布的原始问题是关于只访问Files集合中的第一项,但它涉及到一个一般性问题,对于这个问题有两个合理的解决方法:创建和使用File对象元集合或File对象数组,以提供对Files集合的索引访问。下面是一个演示例程:

Sub DemoIndexedFileAccess()
    '
    'Demonstrates use of both a File object meta-collection and a File object array to provide indexed access
    'to a Folder object's Files collection.
    '
    'Note that, in both examples, the File objects being accessed refer to the same File objects as those in
    'the Folder object's Files collection.  (i.e. if one of the physical files gets renamed after the creation
    'of the Folder object's Files collection, all three sets of File objects will refer to the same, renamed
    'file.)
    '
    'IMPORTANT: This technique requires a reference to "Microsoft Scripting Runtime" be set.
    '
    '**********************************************************************************************************

    'File-selector dialog contsants for msoFileDialogFilePicker and msoFileDialogOpen:

    Const fsdCancel As Integer = 0       'File dialog Cancel button
    Const fsdAction As Integer = -1      'File dialog Action button, and its aliases...
    Const fsdOpen   As Integer = fsdAction
    Const fsdSaveAs As Integer = fsdAction
    Const fsdOK     As Integer = fsdAction

    Dim FD          As FileDialog
    Dim File        As Scripting.File
    Dim FileArr()   As Scripting.File
    Dim FileColl    As New Collection
    Dim Folder      As Scripting.Folder
    Dim FSO         As Scripting.FileSystemObject
    Dim Idx         As Integer

    'Get a folder specification from which files are to be processed

    Set FD = Application.FileDialog(msoFileDialogFolderPicker)  'Create the FolderPicker dialog object
    With FD
        .Title = "Select Folder Of Files To Be Processed"
        .InitialFileName = CurDir

        If .Show <> fsdOK Then Exit Sub
    End With

    'Use the folder specification to create a Folder object.

    Set FSO = New Scripting.FileSystemObject
    Set Folder = FSO.GetFolder(FD.SelectedItems(1))

    'A Folder object's Files collection can't be accessed by item-index number (only by each item's file-path
    'string value), so either...

    '1. Create a generic "meta-collection" that replicates the Files collection's File objects, which allows
    '   access by collection-item index:

        For Each File In Folder.Files
            FileColl.Add File
        Next File

        '"Process" the files in (collection) index order

        For Idx = 1 To FileColl.Count
            Debug.Print "Meta-Collection: " & FileColl(Idx).Name
        Next Idx

    '2. Or, create an array of File objects that refer to the Files collection's File objects, which allows
    '   access by array index:

        ReDim FileArr(1 To Folder.Files.Count)

        Idx = 1
        For Each File In Folder.Files
            Set FileArr(Idx) = File
            Idx = Idx + 1
        Next File

        '"Process" the files in (array) index order

        For Idx = LBound(FileArr) To UBound(FileArr)
            Debug.Print "File Object Array: " & FileArr(Idx).Name
        Next Idx
End Sub
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19520014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档