【问题标题】:Excel VBA: Create list of subfolders and files within source folderExcel VBA:在源文件夹中创建子文件夹和文件列表
【发布时间】:2016-02-17 11:58:56
【问题描述】:

我正在使用以下代码列出主机文件夹及其子文件夹中的所有文件。该代码运行良好,但是,您知道我如何更新代码以列出一些文件属性吗?

Sub file_list()

Call ListFilesInFolder("W:\ISO 9001\INTEGRATED_PLANNING\", True)

End Sub

Sub ListFilesInFolder(ByVal SourceFolderName As String, ByVal IncludeSubfolders As Boolean)

Dim FSO As Object
Dim SourceFolder As Object
Dim SubFolder As Object
Dim FileItem As Object
Dim r As Long
Set FSO = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = FSO.getFolder(SourceFolderName)
r = Range("A65536").End(xlUp).Row + 1
For Each FileItem In SourceFolder.Files

  Cells(r, 1).Formula = FileItem.Name
  r = r + 1
  X = SourceFolder.Path
Next FileItem
If IncludeSubfolders Then
  For Each SubFolder In SourceFolder.Subfolders
    ListFilesInFolder SubFolder.Path, True
  Next SubFolder
End If

Set FileItem = Nothing
Set SourceFolder = Nothing
Set FSO = Nothing

End Sub

Function GetFileOwner(ByVal FilePath As String, ByVal FileName As String)

Dim objFolder As Object
Dim objFolderItem As Object
Dim objShell As Object
FileName = StrConv(FileName, vbUnicode)
FilePath = StrConv(FilePath, vbUnicode)
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(StrConv(FilePath, vbFromUnicode))
If Not objFolder Is Nothing Then
  Set objFolderItem = objFolder.ParseName(StrConv(FileName, vbFromUnicode))
End If
If Not objFolderItem Is Nothing Then
  GetFileOwner = objFolder.GetDetailsOf(objFolderItem, 8)
Else
  GetFileOwner = ""
End If
Set objShell = Nothing
Set objFolder = Nothing
Set objFolderItem = Nothing

End Function

我真正想看到的是;

A 列 = 主机文件夹/子文件夹

B 列 = 文件名

C 列 = 文件的超链接

这可能吗?

我确实有一个创建超链接的代码,但我不知道如何添加到现有代码中。

Sub startIt()

  Dim FileSystem As Object
  Dim HostFolder As String

  HostFolder = "W:\ISO 9001\INTEGRATED_PLANNING\"

  Set FileSystem = CreateObject("Scripting.FileSystemObject")
  DoFolder FileSystem.GetFolder(HostFolder)

End Sub

Sub DoFolder(Folder)

  Dim SubFolder
  For Each SubFolder In Folder.Subfolders
    DoFolder SubFolder
  Next

  i = Cells(Rows.Count, 1).End(xlUp).Row + 1
  Dim File
  For Each File In Folder.Files
    ActiveSheet.Hyperlinks.Add Anchor:=Cells(i, 1), Address:= _
        File.Path, TextToDisplay:=File.Name
    i = i + 1

  Next

End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您可以在此处查看File 对象支持的属性列表:https://msdn.microsoft.com/en-us/library/1ft05taf(v=vs.84).aspx

    因此,您可以增强代码,将.Name 属性放入单元格公式中,以对其他属性(例如文件的.Type)执行类似操作。

    For Each FileItem In SourceFolder.Files
      Cells(r, 1).Formula = FileItem.Name
      Cells(r, 2).Value = FileItem.Type
      ActiveSheet.Hyperlinks.Add Anchor:=Cells(r, 3), Address:= _
        FileItem.Path, TextToDisplay:=FileItem.Name 
      r = r + 1
      X = SourceFolder.Path
    Next FileItem
    

    n.b.我使用了值而不是公式,但在这种情况下,结果将是相同的。

    以类似的方式,您可以添加另一行Cells(r, 3).Value = 以将当前行r 和列3 中的单元格值设置为您的超链接。

    【讨论】:

      【解决方案2】:

      前段时间我为此写了一个小脚本给我的同事...

      请参阅下面的代码:

      Sub FolderNames()
      'Written by Daniel Elmnas Last update 2016-02-17
      Application.ScreenUpdating = False
      Dim xPath As String
      Dim xWs As Worksheet
      Dim fso As Object, j As Long, folder1 As Object
      With Application.FileDialog(msoFileDialogFolderPicker)
          .Title = "Choose the folder"
          .Show
      End With
      On Error Resume Next
      xPath = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1) & "\"
      Application.Workbooks.Add
      Set xWs = Application.ActiveSheet
      xWs.Cells(1, 1).Value = xPath
      xWs.Cells(2, 1).Resize(1, 5).Value = Array("Subfolder", "Hostfolder", "Filename", "Date Created", "Date Last Modified")
      Set fso = CreateObject("Scripting.FileSystemObject")
      Set folder1 = fso.getFolder(xPath)
      getSubFolder folder1
      xWs.Cells(2, 1).Resize(1, 5).Interior.Color = 65535
      xWs.Cells(2, 1).Resize(1, 5).EntireColumn.AutoFit
      Application.ScreenUpdating = True
      End Sub
      Sub getSubFolder(ByRef prntfld As Object)
      Dim SubFolder As Object
      Dim subfld As Object
      Dim xRow As Long
      For Each SubFolder In prntfld.SubFolders
          xRow = Range("A1").End(xlDown).Row + 1
          Cells(xRow, 1).Resize(1, 5).Value = Array(SubFolder.Path, Left(SubFolder.Path, InStrRev(SubFolder.Path, "\")), SubFolder.Name, SubFolder.DateCreated, SubFolder.DateLastModified)
      Next SubFolder
      For Each subfld In prntfld.SubFolders
          getSubFolder subfld
      Next subfld
      End Sub
      

      结果如下:

      你可以稍微修改一下。

      如果您不想使用窗口对话框,而是使用 "W:\ISO 9001\INTEGRATED_PLANNING\"

      干杯!

      【讨论】:

        最近更新 更多