2016-04-03 25 views
0

Aşağıda bir örnek koddur. Belirtilen dizinin tüm alt dizinlerini çaprazlar ve hemen pencere içinde dizin ve dosya adlarını yazdırır. Sorgu, programın bu satırdaki "TraversePath" ı "TraversePath yolu & dizini &" \ "" olarak nasıl çağırdığını gösterir? . Bu özyineleşme… bunu kodlamak için daha iyi bir yol var mı? çünkü yinelemeyi doğru bir bağlamda kullanmazsak, daima taşma ihtimali vardır.bu VBA programını yineleme olmadan nasıl yazılır

Sub TraversePath(path As String) 
    Dim currentPath As String, directory As Variant 
    Dim dirCollection As Collection 
    Set dirCollection = New Collection 

    currentPath = Dir(path, vbDirectory) 

    'Explore current directory 
    Do Until currentPath = vbNullString 
     Debug.Print currentPath 
     If Left(currentPath, 1) <> "." And _ 
      (GetAttr(path & currentPath) And vbDirectory) = vbDirectory Then 
      dirCollection.Add currentPath 
     End If 
     currentPath = Dir() 
    Loop 

    'Explore subsequent directories 
    For Each directory In dirCollection 
     Debug.Print "---SubDirectory: " & directory & "---" 
    'How program is calling/executing below line of code 
     TraversePath path & directory & "\" 
    Next directory 

End Sub 

Sub Testprogram() 

    TraversePath "D:\VBA\" 

End Sub 
+1

Bu özyineleme. Bilgisayar bilimlerinde standart bir araçtır. Geçilen ağaçlar bunun için yaygın bir kullanım durumudur. Bakınız https://en.wikipedia.org/wiki/Recursion_(computer_science) –

cevap

2

Kaygıların özyineleme bu kullanımda yersiz. Ben 6000 özyinelemeli görüşmeleri üzerinden yapmış kadar Örneğin,

Sub PlumbDepth(ByVal n As Long) 
    Debug.Print n 
    n = n + 1 
    PlumbDepth n 
End Sub 

Ben hemen penceresinde

PlumbDepth 1 

girdiğinizde, ben yığın boşluk hatasını alamadım. Bir dosya sisteminde yürümek için,

gibi bir şeye sahip olmadığınız sürece, yığının üflemesine neden olmazsınız. İşletim sisteminin bir sorun haline gelmeden çok önce itiraz edeceğinden şüpheleniyorum. Bu bağlamda, özyinelemesiz bir algoritma kullanmanın tek geçerli nedeni, özyinelemenin işlev çağrısı yükü nedeniyle çok uzun sürmesidir.

1

daha iyi bir yolu bu olabilir: yığın taşması ilgili

Public Sub NonRecursiveMethod() 
    Dim fso, oFolder, oSubfolder, oFile as variant 
    Dim queue As Collection 

    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set queue = New Collection 
    queue.Add fso.GetFolder("D:\VBA") 'obviously replace 

    Do While queue.Count > 0 
     Set oFolder = queue(1) 
     queue.Remove 1 'dequeue 
     '...insert any folder processing code here... 
     For Each oSubfolder In oFolder.SubFolders 
      queue.Add oSubfolder 'enqueue 
      Debug.Print oSubfolder 
     Next oSubfolder 
     For Each oFile In oFolder.Files 
      '...insert any file processing code here... 
      Debug.Print oFile 
     Next oFile 
    Loop 

End Sub 
İlgili konular