Чтение путей к файлам из папок и подпапок в Excel

Я использую следующий код для чтения имен файлов в лист Excel, но я хотел бы включить подпапки и захватить весь путь к файлу. Я попробовал несколько вещей, но ни одна не сработала. Я собрал это воедино из фрагментов чужого кода, отредактированного для работы в моей ситуации, к сожалению, это означает, что мое понимание не так тщательно, как должно быть.

Файлы представляют собой аудиофайлы (wav или mp3), остальная часть электронной таблицы будет содержать метаданные, которые будут использоваться для маркировки файлов: исполнитель, название, альбом и т. Д.

Option Explicit
Sub GetFileNames()
Dim xRow As Long
Dim xDirect$, xFname$, InitialFoldr$
InitialFoldr$ = "C:\"

 With Application.FileDialog(msoFileDialogFolderPicker)
 .InitialFileName = Application.DefaultFilePath & "\"
 .Title = "Please select the folder to list audio files from"
 .InitialFileName = InitialFoldr$
 .Show

  If .SelectedItems.Count <> 0 Then
  xDirect$ = .SelectedItems(1) & "\"
  xFname$ = Dir(xDirect$, 7)
  Do While xFname$ <> ""
  Worksheets("Metadata").Activate
  ActiveSheet.Range("A2").Select
  ActiveCell.Offset(xRow) = xFname$
  xRow = xRow + 1
  xFname$ = Dir
  Loop

   Dim x&
    With Application
            .ScreenUpdating = False
            Rows.Hidden = False
            Rows.Hidden = True
        For x = 1 To Rows.Count
            If .WorksheetFunction.CountA(Rows(x)) > 0 Then Rows(x).Hidden = False
        Next x
        .ScreenUpdating = False
    End With

   Worksheets("Metadata").Visible = True
   Worksheets("Menu").Visible = False

End If
End With
End Sub

Я очень плохо знаком с VBA, но начинаю понимать его части.

1 ответ

Этот код извлечет все mp3-файлы из папки и всех ее подпапок. Удачи с VBA!

Public Sub FindFiles()
'you must add a reference to 'Microsoft Shell Controls And Automation'

Dim shl As Shell32.Shell
Dim fol As Shell32.Folder
Dim row As Long

Set shl = New Shell32.Shell
Set fol = shl.Namespace("E:\CDs\")
row = 1

ProcessFolderRecursively fol, row

End Sub

Private Sub ProcessFolderRecursively(fol As Shell32.Folder, ByRef row As Long)

Dim item As Shell32.FolderItem
Dim fol2 As Shell32.Folder

If Not fol Is Nothing Then
    For Each item In fol.Items
        If item.IsFolder Then
            Set fol2 = item.GetFolder
            ProcessFolderRecursively fol2, row
        Else
            'you might need to edit the criterion here
            If item.Type = "MP3 Format Sound" Then
                Cells(row, 1) = item.Path
                row = row + 1
            End If
        End If
    Next
End If

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