VBA Запишите Все Вложенные Папки На Лист

#excel #vba

Вопрос:

Я пытаюсь записать все папки, подпапки и подпапки и т. Д. Основной папки. Меня не интересуют файлы.

У меня есть код, работающий, если я просто использую messagebox… но когда я пытаюсь написать на лист, он просто перезаписывает предыдущую строку.

 Sub sample()
   Dim FileSystem As Object
   Dim HostFolder As String
    
   HostFolder = "G:"

   Set FileSystem = CreateObject("Scripting.filesystemobject")

   DoFolder FileSystem.getfolder(HostFolder)    
End Sub

Sub DoFolder(folder)
   Dim ln As Integer
   Dim subfolder       

   ln = 2    
   For Each subfolder In folder.subfolders    
      'MsgBox subfolder           
       DoFolder subfolder   
       ln = ln   1
       ActiveWorkbook.Sheets("Sheet1").Range("A" amp; ln).Value = subfolder   
   Next

   'Dim file

   'For Each file In folder.files

   'MsgBox file

   'Next  
End Sub

Private Sub CommandButton1_Click()    
   Call sample 
   MsgBox ("complete")  
End Sub
 

Комментарии:

1. Пожалуйста, прочтите описания тегов, прежде чем применять их. В описании тега VBA говорится: «VBA не эквивалентен VB.NET» . В VB.NET описание тега гласит: «НЕ ИСПОЛЬЗУЙТЕ этот тег для вопросов VB6, VBA или VBScript» . Люди смотрят конкретные теги, потому что их интересуют вопросы, относящиеся к ним. Если вы добавляете неуместные теги, вы тратите наше время впустую, заставляя нас открывать неуместные вопросы. Не тратьте время на незнакомых людей, которым вы хотели бы помочь.

2. Спасибо, что указали на это… отметил

Ответ №1:

Причина проста. Это потому, что вы определили переменную «ln» как локальную переменную внутри вложенной папки «DoFolder». Вам нужно определить переменную «ln» как глобальную переменную. Тогда это будет хорошо работать. Большая часть вашего кода верна.

 Public ln As Integer ' Define as a global

Sub sample()
    Dim FileSystem As Object
    Dim HostFolder As String
    
    HostFolder = "G:"
    
    Set FileSystem = CreateObject("Scripting.filesystemobject")
    ln = 2 ' Initialize here.

    DoFolder FileSystem.getfolder(HostFolder)
End Sub

Sub DoFolder(folder)
    Dim subfolder
    'Dim ln As Integer
    'ln = 2

    For Each subfolder In folder.subfolders
        DoFolder subfolder
        ln = ln   1
        ActiveWorkbook.Sheets("Sheet1").Range("A" amp; ln).Value = subfolder
    Next
End Sub

Private Sub CommandButton1_Click()
    Call sample
    MsgBox ("complete")
End Sub
 

Комментарии:

1. Спасибо, что нашли время, это так очевидно.