Excel VBA:创建源文件夹

时间:2016-02-17 11:58:56

标签: excel vba excel-vba

我使用以下代码列出主机文件夹中的所有文件及其子文件夹。代码工作得很好但是,你知道如何更新代码以列出一些文件属性。

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

2 个答案:

答案 0 :(得分:1)

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

因此,您可以使用.Name属性并将其置于单元格公式中来增强代码,以执行与其他属性类似的操作,例如文件的.Type。 / p>

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。我使用的是Value而不是Formula,但在这种情况下,结果将是相同的。

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

答案 1 :(得分:1)

为了这个目的,我在一段时间之前为我的同事写了一个小脚本......

请参阅下面的代码:

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

结果如下: enter image description here

你可以稍微修改一下。

如果您的示例不想使用窗口对话框而是使用 “W:\ ISO 9001 \ INTEGRATED_PLANNING \”

干杯!

相关问题