Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 20:05:21
28.04.2024 18:33:31
28.04.2024 18:25:12
28.04.2024 14:18:05
Anzeige
Archiv - Navigation
1932to1936
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Pfadübernahme

Pfadübernahme
05.06.2023 15:11:17
El-Ti

Hallo zusammen,

bin am verzweifeln, weil ich das simple Makro nicht zum Laufen bringe. Dieses Makro "Sub MacroToTest_Neu()" soll einfach nur den "Pfad / Laufwerksnamen" dem anderen Makro "Sub Unterordner_Zählen()" übergeben, damit ich von diesem die Gesamtanzahl der Ordner übernehmen kann. Mehr soll und brauch das Makro auch nicht können.

Vielen Dank im voraus.
Elfriede

https://www.herber.de/bbs/user/159476.xlsm

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Pfadübernahme
05.06.2023 15:26:50
GerdL
Hallo El-Ti,

wirf die doppelte Deklarierung "Dim Test As Variant" raus.

Weiter bin ich aber nicht eingestiegen.

Gruß Gerd


AW: Pfadübernahme
05.06.2023 15:51:28
El-Ti
Hallo Gerd,

habe das rausgemacht. Geht trotzdem nicht. Bringt auch die Fehlermeldung Lz 53 - Datei nicht gefunden.

Gruß Elfriede


AW: Pfadübernahme
05.06.2023 15:50:30
Rudi Maintaire
Hallo,
übergib den Ordner als Parameter.
Schema:
Sub OrdnerWaehlen()
  With Application.FileDialog(msoFileDialogFolderPicker)
    If .Show Then Call UnterOrdnerZaehlen(.SelectedItems(1))
  End With
End Sub

Sub UnterOrdnerZaehlen(strFolder As String)
  'Code
End Sub
Gruß
Rudi


Anzeige
AW: Pfadübernahme
05.06.2023 16:15:50
El-Ti
Hallo Rudi,

habe das mal ausprobiert, aber da gibt es auch das Problem mit diesem "Ordner(0) = Test". Denn wenn ich ja "Ordner(0) = "C:\Test\" eingebe (Originalzustand), funktioniert das Makro ja. Nur war ja das so vorgesehen, dass ich das gerne vom "Sub MacroToTest_Neu()" übernehmen möchte.

Melde mich später noch mal, muss noch was erledigen.
Gruß Elfriede


AW: Pfadübernahme
05.06.2023 21:03:09
Ulf
Versuch's mal mit

Option Explicit

Private Const INVALID_HANDLE_VALUE = -1
Private Const MAX_PATH = 260

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
    dwFileAttributes As Long ' Dateiattribute
    ftCreationTime As FILETIME ' Erstellungsdatum
    ftLastAccessTime As FILETIME ' Letzter Zugriff
    ftLastWriteTime As FILETIME ' Letzte Speicherung
    nFileSizeHigh As Long ' Größe (Hi)
    nFileSizeLow As Long ' Größe (Lo)
    dwReserved0 As Long ' bedeutungslos
    dwReserved1 As Long ' bedeutungslos
    cFileName As String * MAX_PATH ' Dateiname
    cAlternate As String * 14 ' 8.3-Dateiname
End Type

Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long

Public Sub listeUnterordner()
    Dim lngAnzahl As Long
    Dim strSuchenAb As String
    Dim varRet As Variant
    Dim arrDateien()
    strSuchenAb = "c:\users\hg\documents\*"
    varRet = dateiSuche(strSuchenAb, True)
    If IsArray(varRet) Then
        arrDateien = varRet
        lngAnzahl = UBound(varRet)
        'Testausgabe
        Dim lngZähler As Long
        For lngZähler = 0 To UBound(arrDateien)
            Debug.Print lngZähler + 1; arrDateien(lngZähler)
        Next lngZähler
    End If
End Sub

Public Function dateiSuche(strPath As String, verzeichnisJANEIN As Boolean) As Variant
    On Local Error GoTo dateiSucheERR
    Dim gDateien()
    Dim X As Long
    Dim FileHandle As Long
    Dim FileData As WIN32_FIND_DATA
    Dim fileName As String
    X = -1
    FileHandle = FindFirstFile(strPath & vbNullChar, FileData)
    If FileHandle > INVALID_HANDLE_VALUE Then
        Erase gDateien
        Do
            ' Abschließendes vbNullChar des Dateinamens entfernen
            fileName = Left$(FileData.cFileName, InStr(FileData.cFileName, vbNullChar) - 1)
            ' Verzeichnis-Einträge nicht hinzufügen
            If verzeichnisJANEIN = True Then
                If (FileData.dwFileAttributes And vbDirectory) = vbDirectory Then
                    X = X + 1
                    ReDim Preserve gDateien(X)
                    gDateien(X) = fileName
                End If
            Else
                If (FileData.dwFileAttributes And vbDirectory) = 0 Then
                    X = X + 1
                    ReDim Preserve gDateien(X)
                    gDateien(X) = fileName
                End If
            End If
        Loop Until FindNextFile(FileHandle, FileData) = 0
        dateiSuche = gDateien()
    Else
        dateiSuche = X
    End If
    FindClose FileHandle
dateiSucheOUT:
    Exit Function
dateiSucheERR:
    dateiSuche = X
    Resume dateiSucheOUT
End Function
Grüsse
Ulf


Anzeige
AW: Pfadübernahme
05.06.2023 23:52:05
El-Ti
Hallo Rudi, Ulf,

bin jetzt wieder zurück, Hat etwas länger gedauert. Hallo Ulf, Habe mal Dein Makro eingeladen, musste aber zuerst noch die "Declare" Functionen auf den neuesten Stand bringen. Beim Aufrufen des Makros wird Excel abrupt beendet. Wenn Dein Makro auch OK wäre, würde es ja mein Problem auch nicht beheben, weil ja Deinem Makro auch der auszuwählende Pfad / Laufwerksnamen manuell mitgeteilt werden muss und das soll ja bei meinem sonst ja einwandfrei funktionierendem Makro geändert werden.. Es muss nur dafür die Voraussetzung geschaffen werden, dass es den Pfad / Laufwerksnamen übernimmt.
Beim Makro von Rudi gibt es auch Probleme mit der Zuweisung der Variablen, die Variable eben, die ja vom "Folderpicker" übernommen werden sollte.

Gruß von Elfriede


Anzeige
AW: Pfadübernahme
05.06.2023 21:46:27
Pappawinni
Darf man fragen, was das Ziel der Anwendung ist?
Es gab nämlich kürzlich einen Beitrag "Zugriff verweigert" von einer gewissen Rosel, wo jemand vermutet hatte, dass das eine wiederkehrende Frage von einer Elfriede sei. Es ging dabei darum Dateien in einem bestimmten Verzeichnis und dessen Unterverzeichnissen zu listen und bei bestimmten Mediendateien zusätzliche Dateiattribute auszugeben....
Ich konnte feststellen, dass El-Ti tatsächlich bereits vor Jahren etwas ganz ähnliches gepostet hatte.
Das hier hat dann wieder eine ähnliche Tendenz....


AW: Pfadübernahme
05.06.2023 22:58:54
Pappawinni
Hab mir dein Makro nicht angeschaut, aber hätte da ein Beispiel:

Sub testCountSubFolders()
   
   Dim lngUVZ As Long
   
   lngUVZ = countSubFolders("C:\Users")
    
   MsgBox lngUVZ & " Unterverzeichnisse"
   
End Sub

Function countSubFolders(ByVal SourceFolderName As String) As Long
  
  'Ermittet für einen Pfad rekursiv die Anzahl der Unterverzeichnise
  'zählt also auch die Unterverzeichnisse der Unterverzeichnisse usw.
  'jedoch nur sofern es sich NICHT um System- oder Hidden- Verzeichnisse
  'oder Verzeichnisse ohne Leserechte handelt
  
  Dim fso As Object, SourceFolder As Object, SubFolder As Object
  Dim Result As Long
  
  Result = 0
  
  DoEvents
  
  Set fso = CreateObject("Scripting.FileSystemObject")
  
  If fso.GetDrive(fso.GetDriveName(SourceFolderName)).path = SourceFolderName Then
    Set SourceFolder = fso.GetDrive(fso.GetDriveName(SourceFolderName)).RootFolder
  Else
    Set SourceFolder = fso.GetFolder(SourceFolderName)
  End If
  
  On Error Resume Next
  If Not (SourceFolder.Files.Count >= 0) Then
      countSubFolders = 0
      Exit Function
  End If
  On Error GoTo 0
  
  For Each SubFolder In SourceFolder.SubFolders
    If Not ((SubFolder.Attributes And (vbSystem Or vbHidden)) > 0) Then
      Result = Result + 1
      Result = Result + countSubFolders(SubFolder.path)
    End If
  Next SubFolder
  
  countSubFolders = Result

End Function



Anzeige
AW: Pfadübernahme
06.06.2023 00:38:42
El-Ti
Hallo Pappawinni,

das Ziel der "Anwendung" ist ganz einfacher Natur: Ich würde halt gerne in einem Rutsch verschiedene Informationen der Ordner in einer Tabelle ablegen und dazu gehören halt wie in diesem Falle, die komplette Anzahl der Ordner und Unterordner. Mein vorhandenes Makro (stammt übrigens auch hier aus dem "Herber-Fundus") gibt mir ja auch die Ordneranzahl aus. Im Prinzip gleich wie auch Dein Makro. Nur haben eben beide Makros den Nachteil, dass man jedes mal den Ordner etc. händisch eintragen muss. Mein Gedanke ist eben der, dass man aus dem bereits vorhanden Makro (mit FolderPicker), diese Info dann in das Makro zum Ordner zählen, übernehmen könnte. Somit kann man zwei Fliegen usw.

Gruß Elfriede


Anzeige
AW: Pfadübernahme
06.06.2023 02:13:39
Pappawinni
Oweh, da muss man natürlich nichts händisch eintragen.
Der Folderpicker liefert dir eine Pfad, sagen wir mal du hast diesen Pfad in einer Variablen strPath gespeichert.
dann kannst du mit
Dim lngUVZ as long
lngUVZ = countSubFolders(strPath)
die Anzahl Unterordner z.B. in die Variable lngUVZ übergeben.
Der Pfad aber natürlich ohne Trennzeichen, wie im Beispiel gezeigt.


AW: Pfadübernahme
06.06.2023 11:16:11
El-Ti
Hallo Pappawinni,

wenn alles so einfach gewesen wäre, hätte ich das Forum nicht "belästigen" müssen. Habe das ja auch schon alles ausprobiert. Stundenlang im Netz recherchiert und es klappt halt nicht. Du hast ja meine beiden Makros vorliegen und demzufolge kannst Du ja das gleich selber ausprobieren ob das so klappt, wie Du es aufgezeigt hast. Die Variable im "Folderpicker" ist "PathSpec" und bei der Ausgabe ins "Direktfenster" mit "Debug.Print Test" zeigt er mir den ausgewählten Pfad/Ordner auch an. Demzufolge wäre das ja das Teil, das nun im anderen Makro, eingebaut werden muss. Bei der Recherche war ja auch von der Zuteilung / Aufteilung (wie auch immer) die Rede von "Public und DIM" außerhalb und innerhalb des Moduls die Rede, damit die Variablen übernommen werden können. Habe ich auch alles ausprobiert, soweit ich das verstanden habe. Mein VBA Verständnis ist eben nicht gerade das Beste.

Gruß Elfriede


Anzeige
AW: Cobra übernehmen Sie ich bin raus
06.06.2023 11:26:39
Pappawinni
Liebe Elfriede (wenn ich schon so anfange ...)
Das ...

"Du hast ja meine beiden Makros vorliegen und demzufolge kannst Du ja das gleich selber ausprobieren ob das so klappt, wie Du es aufgezeigt hast."

klingt fast genau wie bei dieser Rosel und das ist einfach frech oder unverschämt, wie man das auch immer nennen mag.
Zumal das was du da geliefert hast auch nur irgendwelche zusammenkopierte Codefetzen sind.

Ich kann nicht dafür, dass du keinen Plan von VBA hast, obwohl du offenbar schon über Jahre immer wieder VBA-Code brauchst und frech kann ich auch.
Lern halt mal VBA.


Anzeige
AW: Ordner/Pfad Übernahme in anderes Makro
06.06.2023 11:49:34
El-Ti
Hallo Pappawinni,

sei doch bitte nicht gleich so eingeschnappt. Ich habe doch nichts unanständiges geschrieben!!! Ich habe Dir doch nur mitgeteilt, dass es doch am einfachsten wäre, das mit meinen beigefügten Makros in der hochgeladenen Arbeitsmappe auszuprobieren. Dass ich nicht so fit in VBA bin, dafür kann ich nichts. Hätte halt was anderes lernen sollen. Außerdem können nicht alle Menschen Excel und VBA Profis sein, sonst bräuchten wir Euch ja vom Forum nicht mehr. Denn dann könnten wir ja auch diese kleinen und größeren Probleme selber lösen.
Also Frieden ... In diesem Sinne!!!

Gruß Elfriede


Anzeige
AW: Ordner/Pfad Übernahme in anderes Makro
06.06.2023 15:56:25
Pappawinni
So, nachdem das ja als gelöst gilt hier die "schwierige" Lösung mit meiner Funktion:


 Sub MacroToTest_Neu()
 '
     Dim objFileDialog As FileDialog
     Dim Pathspec As String
     Dim lngUVZ As Long
     
     Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
     With objFileDialog
         .AllowMultiSelect = False
         .InitialFileName = "C:\Test_Herber" ' anpassen !!!
         .InitialView = msoFileDialogViewSmallIcons
         .Title = "Bitte den Ordner auswählen"
         If .Show Then Pathspec = .SelectedItems(1)
          End With
     Set objFileDialog = Nothing
     If Pathspec = "" Then
         Exit Sub
     End If
     '
     lngUVZ = countSubFolders(Pathspec)
     MsgBox lngUVZ & " Unterverzeichnisse"
     '
End Sub

Function countSubFolders(ByVal SourceFolderName As String) As Long
  
    'Ermittet für einen Pfad rekursiv die Anzahl der Unterverzeichnise
    'zählt also auch die Unterverzeichnisse der Unterverzeichnisse usw.
    'jedoch nur sofern es sich NICHT um System- oder Hidden- Verzeichnisse
    'oder Verzeichnisse ohne Leserechte handelt
    'Gibt -1 zurück wenn für den SourceFolder keine Leseberechtigung besteht
    
    Dim fso As Object, SourceFolder As Object, SubFolder As Object
    Dim Result As Long, bolReadAccess As Boolean
    
    Result = 0
    
    DoEvents
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    If fso.GetDrive(fso.GetDriveName(SourceFolderName)).path = SourceFolderName Then
        Set SourceFolder = fso.GetDrive(fso.GetDriveName(SourceFolderName)).RootFolder
    Else
        Set SourceFolder = fso.GetFolder(SourceFolderName)
    End If
    
    'check for ReadAccess
    On Error Resume Next
    If Not (SourceFolder.Files.Count >= 0) Then
        countSubFolders = -1    'delivers -1, not to count a subfolder without read permission
        Exit Function
    End If
    On Error GoTo 0
    
    For Each SubFolder In SourceFolder.SubFolders
        If Not ((SubFolder.Attributes And (vbSystem Or vbHidden)) > 0) Then
            Result = Result + 1
            Result = Result + countSubFolders(SubFolder.path)
        End If
    Next SubFolder
  
    countSubFolders = Result

End Function




Anzeige
AW: Ordner/Pfad Übernahme in anderes Makro
06.06.2023 23:39:59
El-Ti
Hallo Pappawinni,

trotz verschiedener Meinungen hast Du es dir nicht nehmen lassen, das was ich von Anfang an so gewollt hatte, doch noch fertig zu machen, obwohl ich ja auch schon den Thread für erledigt erklärt hatte. Aber alle Achtung für Deinen Ehrgeiz und deshalb kann ich Dir auch mitteilen, dass es auch problemlos funktioniert. Nur welches Makro ich einsetzen werde, lasse ich mal vorerst noch offen.

Vielen Dank auch Dir und
Gruß Elfriede


AW: Pfadübernahme
06.06.2023 12:24:57
Daniel
Hi
die beiden Makros funktionieren, wenn du, wie Gerd schon in der allersten Antwort geschrieben hat, die Variable TEST nicht doppelt deklarierst sondern nur einmal.
um eine "globale" Variable zu erzeugen, die von mehreren Makros verwendet werden kann und die somit zur Datenübertragung zwischen Makros geeignet ist, muss folgendes beachtet werden:
die Variable muss einmal in einem allgemeinen Modul mit dem Vorsatz "Public" deklariert werden.
in welchem Modul du das machst, wenn du mehrere allgemeine Module hast, ist egal, sie darf aber nur einmal deklariert werden.
Das Makro, in welchem die Variable befüllt wird, muss natürlich zuerst ausgeführt werden.

wie gesagt, das Public Test As String darf nur in einem der beiden Module stehen und wenn du dann zuerst MacroToTest_Neu() ausführst und danach Unterordner_Zählen(), dann funktioniert es wie von dir gewünscht.

also im Prinzip so:
Option Explicit
Public Test As String

'
Sub MacroToTest_Neu()
'
    Dim objFileDialog As FileDialog
    Dim Pathspec As String
    Set objFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
    With objFileDialog
        .AllowMultiSelect = False
        .InitialFileName = "C:\Test_Herber" ' anpassen !!!
        .InitialView = msoFileDialogViewSmallIcons
        .Title = "Bitte den Ordner auswählen"
        If .Show Then Pathspec = .SelectedItems(1) & "\"
         End With
    Set objFileDialog = Nothing
    If Pathspec > "" Then
       ' GetFilesInFolder Pathspec, True
    Else
        Exit Sub
    End If
    '
    Test = Pathspec
    '
    Call mdl_Unterordner_Zählen
    '
  End Sub
und im anderen Modul
Option Explicit

Public Sub Unterordner_Zählen()
Dim Ordner() As String
Dim i As Long
Dim Datei As String
ReDim Ordner(0)
'
If Test = "" Then
    MsgBox "bitte zuerst Makro MacroToTest_Neu() ausführen"
    Exit Sub
End If
Ordner(0) = Test
'
'Ordner(0) = "C:\0000_Urlaubs_Dateien\"
'
i = 0
Do While i = UBound(Ordner)
If UBound(Split(Ordner(i), "\")) = 99 Then '--- Prüfung auf Strukturtiefe
Datei = Dir(Ordner(i) & "*", vbDirectory)
Do While Datei > ""
If (GetAttr(Ordner(i) & Datei) And vbDirectory) = vbDirectory Then
If Not Datei Like ".*" Then
ReDim Preserve Ordner(UBound(Ordner) + 1)
Ordner(UBound(Ordner)) = Ordner(i) & Datei & "\"
End If
End If
Datei = Dir
Loop
End If
i = i + 1
Loop
'
MsgBox "Anzahl Unterordner = " & UBound(Ordner)
'
End Sub
wobei es in der Regel nicht sinnvoll ist, für jedes Marko ein eigenes Modul anzulegen.
die mehreren Module nutzt man dann, wenn man viele Makros hat, die man dann zu sinnvollen Gruppen zusammenfasst, damit man die Übersicht nicht verliert und Makros bei Bedarf schneller findet.
Gruß Daniel


AW: Pfadübernahme
06.06.2023 13:12:13
El-Ti
Hallo Daniel,

Danke für Deine Hilfe und auch ausführlicher Beschreibung des Problems. Habe alles so übernommen und es macht das, für das es vorgesehen ist. Nämlich mir die vollständige Ordneranzahl auszugeben. Somit Aufgabe erledigt.
Vielen Dank dafür.

Viele Grüße
Elfriede

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige