Rekursive Sub - Wert weitergeben

zyclop

Erfahrenes Mitglied
Ich habe ein Problem, bei meiner jetztigen arbeit, habe ich Probleme einen wert zu übergeben. Ich habe im Code die Zuweisung besser gesagt nur die Variable Markiert. Wie ihr sicherlich seht ist das ja eine Rekursive Sub. wie kann ich den Wert im Objekt objFolder in der subprozedur weiter verwenden?

Sry ist schwierig zu erklären

Code:
Dim lonSpalteZaehler As Long
Dim lonZeileZaehler As Long
Dim intZeile As Integer
Dim strPath As String
Public objFolder

Private Sub cmdBeenden_Click()
End
End Sub

Private Sub pSubScan()
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\Temp")

'Counter werden auf Null gesetzt
lonSpalteZaehler = 0
lonZeileZaehler = 0
    
For Each objsubfolder In objFolder.subfolders
Set objFSO = CreateObject("Scripting.FileSystemObject")

strPath = objsubfolder.Path
If objFSO.FolderExists(strPath) Then
Set objFolder = objFSO.GetFolder(strPath)
    pSubScan
End If

    
    'Counter für die Schlaufe
    MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
    lonZeileZaehler = lonZeileZaehler + 1
    
    'Eintrag der Attribute in die Tabelle
    MSFlexGrid1.TextMatrix(lonZeileZaehler, 1) = objsubfolder.Name
    MSFlexGrid1.TextMatrix(lonZeileZaehler, 2) = objsubfolder.DateLastModified
    MSFlexGrid1.TextMatrix(lonZeileZaehler, 3) = objsubfolder.DateCreated
    MSFlexGrid1.TextMatrix(lonZeileZaehler, 4) = objsubfolder.Size
    MSFlexGrid1.TextMatrix(lonZeileZaehler, 5) = objsubfolder.Path
Next

End Sub
Private Function DirExists(ByVal DirectoryName As String) As Boolean
    On Error Resume Next
    DirExists = CBool(GetAttr(DirectoryName) And vbDirectory)
    On Error GoTo 0
End Function

Private Sub cmdScan_Click()
pSubScan
End Sub

Private Sub Form_Load()
'Erste Zeile Erste Spalte Titel'
MSFlexGrid1.TextMatrix(0, 0) = "TCleaner"

'Spalten Informationen'
MSFlexGrid1.TextMatrix(0, 1) = "Name"
MSFlexGrid1.TextMatrix(0, 2) = "Letzte Änderung"
MSFlexGrid1.TextMatrix(0, 3) = "Erstellungsdatum"
MSFlexGrid1.TextMatrix(0, 4) = "Size"
MSFlexGrid1.TextMatrix(0, 5) = "Pfad"

'Spaltenbreite wird Fix gesetzt
Dim intSpaltenZaehler As Integer
    For intSpaltenZaehler = 0 To 5
        MSFlexGrid1.ColWidth(intSpaltenZaehler) = 1580
    Next intSpaltenZaehler
End Sub

Wusa !
 
Zuletzt bearbeitet:
Um eine Variable in nur einer Sub immer wieder zu verwenden (auch bei späteren Aufrufen) kannst du sie dort als Static dimensionieren. Kleines Beispiel:
Visual Basic:
Private Sub Command1_Click()
 Static vWert As Integer
 vWert = vWert + 1
 Me.Caption = vWert
End Sub
Hier wird im Klick-Ereignis eines CommandButtons eine Variable hochgezählt und in der Form angezeigt.

Wenn das ganze aber Formweit funktionieren soll, musst du eine Variable vor den Subs dimensionieren:
Visual Basic:
Dim vWert As Integer
Private Sub Command1_Click()
 vWert = vWert + 1
 Me.Caption = vWert
End Sub

Um so eine Variable Projektweit zu nutzen, musst du sie mit Global in einem Modul (außerhalb der Funktionen) dimensionieren:
Visual Basic:
'Am Anfang des Moduls
Global vWert As Integer
Dann ist diese Variable im gesamten Projekt ansprechbar.


Der Doc!
 
Hi,

die Variante von DrSoong halte ich eher für unschön.
Für den rekursiven Aufruf von Funktionen sollten die entsprechenden Werte als Parameter übergeben werden.
 
Gut, danke für die Tipps bisher und wie kann ich das machen? niggo`? drSoong ich werde es probieren...
 
Kannst du das explizit auf meine Aufgabe erklären DrSoong? Ich verstehe das nicht. Ich habe nun in die Prozedur folgendes eingetragen:

For Each objsubfolder In objFolder.subfolders
Set objFSO = CreateObject("Scripting.FileSystemObject")
Static strPath As String
strPath = objsubfolder.Path
If objFSO.FolderExists(strPath) Then
Set objFolder = objFSO.GetFolder(strPath)

Call pSubScan(ByVal strPath)
End If

Für jede hilfe dankbar
 
Zuletzt bearbeitet:
Prob gelöst, danke für alle Antworten.

Jetzt habe ich auf TechNet ein MS eigenes Script gefunden welches die Files ausliest. Kann mir aber nicht erklären was das macht? Ich muss es noch anpassen weis aber nicht was.

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colFileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='C:\Scripts'} Where " _
& "ResultClass = CIM_DataFile")

For Each objFile In colFileList
Wscript.Echo objFile.Name
Next

Hat jemand lust mir das zu erklären`?
 
WMI ist so eine Microsoft-Schnittstelle, mit der man viele Sachen auslesen kann (was alles weiß ich jetzt nicht, ist aber eine Menge).

In deinem Fall initialisierst du erst den PC (WMI arbeitet mit dem Computernamen), dann schickst du eine WMI-Anfrage in der du sagst, dass das System alle Dateien und Ordner in dem von angefragten Ordner liefern soll. Du kriegst dann eine Collection zurück, die du mit einer For/Each-Schleife ausliest und ausgibst.


Der Doc!
 
Zurück