Live-Forum - Die aktuellen Beiträge
Datum
Titel
03.05.2024 10:49:02
03.05.2024 10:43:56
03.05.2024 07:38:32
Anzeige
Archiv - Navigation
1928to1932
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

Zugriff verweigert

Zugriff verweigert
29.04.2023 22:50:45
Rosel

Hallo zusammen,

ich plage mich immer noch mit einem Makro rum, das beim auslesen von externen Festplatten, den Lz Fehler 70 ausgibt (Zugriff verweigert). Habe hier im Forum schon Lösungen gesehen, die das Problem lösen können. Nur das umsetzen in dieses Makro klappt bei mir nicht, dafür sind meine VBA Kenntnisse einfach zu gering. Wenn mir da vielleicht jemand vom Forum behilflich sein könnte.
Danke herzlichst.

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

On Error GoTo fehler '** Fehler abfangen!

For Each subFolder In objFolder.SubFolders
'** interne System Ordner überspringen!!
If InStr(oSubfolder, "RECYCLE") Then GoTo nx
If InStr(oSubfolder, "System Volume Information") Then GoTo nx
GetFilesInFolder subFolder.Path, True
nx: 'interne System Ordner überspringen!!
Next subFolder>

Das wären die Code-Schnippsel zum einfügen. Zumindestens einen Teil davon!

Grüße von Rosel

46
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zugriff verweigert
30.04.2023 11:37:10
Herbert_Grom
Hallo Rosel,

kann es evtl. sein, dass die Lw Bitlocker-gesichert sind?

Servus


AW: Zugriff verweigert
30.04.2023 11:57:50
Rosel
Hallo Herbert,

ich grüße Dich. Nein, denn mit dem einen Makro kann ich die Laufwerke ohne Probleme auslesen und mit diesem geht es nicht. Da bringt er eben die Fehler 70 Meldung. Lese ich nur dIe Ordner aus, geht es aber, ohne Fehlermeldung.

Grüße von Rosel


AW: Zugriff verweigert
30.04.2023 11:58:55
Herbert_Grom
Hast du schon mal nach dem "Fehler 70" gegoogelt?


AW: Zugriff verweigert
30.04.2023 12:43:38
Rosel
Hallo Herbert,

natürlich habe ich mich schon "rumgegoogelt". Aber hier im Forum gibt es den Kollegen "Piet" und der hat dieses Problem mit diesem LZ 70 Problem mit diesem zusätzlichen "Code" gelöst. Das Problem ist eben, dass ich selber an Hand meiner VBA Kenntnisse nicht in der Lage bin, dies in dem beigefügten Makro so ein zu bauen, dass es dann auch zufrieden stellend läuft. Darum wende ich mich ja ans Forum.

Grüße von Rosel


Anzeige
AW: Zugriff verweigert
30.04.2023 19:48:20
Pappawinni
Vielleicht so:

If not( (oSubfolder.attributes and 7) > 0 ) then 
   GetFilesInFolder subFolder.Path, True
end if
wobei die 7 die Summe aus
vbReadonly = 1
vbHidden = 2
vbSystem = 4
darstellt.


AW: Zugriff verweigert
30.04.2023 20:31:21
Rosel
Hallo Pappawinni,

ich grüße Dich. Ja, das wäre schön, wenn das mit dieser Methode klappen würde. Aber wie schon geschrieben sind meine VBA Kenntnisse nicht berauschend. Außerdem hat ja der Code des Makro andere "Namen" für bestimmte Programmteile, wie der mit aufgeführte Code der "Piet" benützt hat. Diesen Code sollte man eben in das Makro integrieren.

Grüße von Rosel


Anzeige
AW: Zugriff verweigert
30.04.2023 20:45:23
Pappawinni
Hallo Rosel,
ich hab mich schon gewundert, als ich das Excel aufgemacht habe, wo denn der Code ist...
wo genau ist denn die Stelle, die den Fehler wirft ?


AW: Zugriff verweigert
30.04.2023 20:51:53
Rosel
Hallo Pappawinni,

der Fehler tritt auf in "Private Sub OVBAde_ReadSubFolder(oFolder As Folder)" bei

'Alle Dateien auflisten
For Each oFile In oFolder.Files

Grüße von Rosel


AW: Zugriff verweigert
30.04.2023 22:01:24
Pappawinni
Setzte mal vor
' alle Dateien auflisten


       'Folder igorieren, wenn System oder Hidden
       If (oFolder.Attributes And 6) > 0 Then
          Exit Sub
       End If


Anzeige
AW: Zugriff verweigert
30.04.2023 22:20:08
Pappawinni
Als ähm Anfänger*in :)
hast du dir mit Rekursion ein schwieriges Thema ausgesucht.
Daran ist schon mancheres :) verzweifelt.


AW: Zugriff verweigert
30.04.2023 22:45:32
Rosel
Hallo Pappawinni,

hat leider etwas länger gedauert. Habe jetzt das Teil eingefügt und die LZ 70 Meldung blieb aus. Aber dafür werden keine Daten ausgelesen. Er gibt nur die Überschriften aus. Wegen dem schwierigen Thema gibt es hier im Forum immer noch liebe Menschen, die einem da behilflich sind, die vorhandenen Probleme zu lösen. Dafür müssen Wir Euch sehr dankbar sein.

Grüße von Rosel


AW: Zugriff verweigert
30.04.2023 22:56:49
Pappawinni
Das mit den Daten hat ja jetzt mit dem Thema "Zugriff verweigert" erst einmal nichts mehr zu tun.
Aber ich schau mir das bei Gelegenheit auch noch an...


Anzeige
AW: Zugriff verweigert
30.04.2023 23:49:18
Pappawinni
hm wie sag ich's dem Kinde...
die Funktion
Function Details_auslesen(Datei As File)
sollte deklariert werden als
 Function Details_auslesen(Datei As File) As Variant
dann sollte aber dort
Dim Ergebnis(4) As Variant
nicht als String
und trotz keines Ergebnisses am Ende noch ein Array zurückgegeben werden,
also vor dem end if

        Else
            Details_auslesen = Array("", "")
sonst ist ja die Abfrage in der aufrufenden Funktion mit UBound irgendwo verfehlt.
Deswegen hat man dort auch einfach in on error resume next rein gehauen.
Mach halt in
Private Sub OVBAde_ReadSubFolder(oFolder As Folder)
dann auch
Dim Details() As Variant
und diese on error resume next und on error goto 0 kannst du dir dann auch schenken.


Anzeige
AW: Zugriff verweigert
01.05.2023 00:46:24
Rosel
Hallo Pappawinni,

also diese Änderungen haben keinen Erfolg. Es werden weiterhin keine Daten angezeigt. Außerdem wird jetzt, wenn ich dem Laufwerksbuchstaben einen Ordner mit anhänge, nur ein Teil ausgelesen. Der Teil aus "Function Details_auslesen(Datei As File) As Variant" wird nicht berücksichtigt.

Grüße von Rosel


AW: Zugriff verweigert
01.05.2023 08:46:34
Pappawinni
Bhh.
Du hast dir jedenfalls mit diesem Detail_auslesen jedesmal den Dateinamen überschrieben.
Kommentiere mal die Zeile nach UCase aus, also wo die Details in die Tabelle geschrieben werden.
Vielleicht lässt du dann auch noch Hidden folder zu, indem du nur bla.Attributes and 4, statt 6 verwendest.
Details auslesen macht ja ohnehin nur etwas bei bestimmten Dateitypen


Anzeige
AW: Zugriff verweigert
01.05.2023 10:33:51
Rosel
Hallo Pappawinni,

guten Morgen. Also diese Änderungen bringen nichts. Es werden weiterhin keine Daten angezeigt. Ich möchte ja nicht unhöflich sein! Aber kannst Du das nicht vorher bei Dir ausprobieren, ob diese Änderungen überhaupt Wirkung zeigen. Mit dieser Methode sind wir am "St. Nimmerleinstag" immer noch nicht dort angelangt, wo wir eigentlich hin wollten.

Grüße von Rosel


AW: Zugriff verweigert
01.05.2023 11:05:48
Pappawinni
liebe gute Rosel,
Wenn es bei mir funktioniert, heisst das noch lange nicht, dass du das z.B. auch richtig umsetzt, oder dass das bei dir auch funktioniert.
Bei mir werden Dateinamen und partiell auch Details gezeigt. Wobei das ja nur bei Dateitypen "mp4 mkv avi flv" und Dateien ohne extension etwas auswirft, aber auch nicht alles. Es geht ja da um Meta-Daten, wobei die ja nicht gefüllt sein müssen und ich obendrein auch keine Dokumentation gefunden habe, die für
GetDetailsOf(, i) einen Wert > 5 überhaupt beschreibt.
Wende dich halt bitte dann an den, der dir diese Codezeilen geliefert hat.


Anzeige
AW: Zugriff verweigert
01.05.2023 11:27:49
Pappawinni
Beste Rosel,
Ich bin ja hier im Blindflug unterwegs. Ich
- sehe nicht auf welchem System du arbeitest,
- sehe nicht, inwieweit meine Änderungen richtig verstanden wurden
- kann nicht hellsehen, was es heisst, dass es nicht funktioniert, zumal ich noch nicht einmal weiss, was deine Applikation überhaupt tun soll.
- kann nicht hellsehen, was sich eine Änderung bewirkt hat, wenn du mir nur sagst "funktioniert nicht"
- kann auch nicht dafür, wenn du den Code nicht verstehst.


AW: Zugriff verweigert
01.05.2023 11:51:52
Rosel
Hallo Pappawinni,

ich kann mir schon denken wie schwierig es sein muss, so ein Problem aus der Ferne zu lösen. Ich habe mir halt gedacht, dass an Hand der zusätzlich beigefügten Code-Schnipsel, das in das hochgeladene Makro mit eingefügt werden kann und damit wäre das Thema dann erledigt. Leider ist dem halt nicht so. Trotzdem noch mal vielen Dank für Deine Bemühungen.

Grüße von Rosel


Anzeige
AW: Zugriff verweigert
01.05.2023 12:11:49
Pappawinni
Vielleicht kannst du mir im Nachhinein noch sagen, was du denn eigentlich mit deiner Applikation erreichen wolltest ?
Mein Eindruck war, dass du Metadaten zu Dateien mit den Extensions "mp4 mkv avi flv" haben wolltest.
Ich habe mich dann natürlich gefragt, warum dann alle Dateinamen ausgeworfen werden.....wie gesagt, hellsehen kann ich nicht


AW: Zugriff verweigert
01.05.2023 12:37:34
Rosel
Hallo Pappawinni,

mit diesem Makro möchte ich meine externen Laufwerke auslesen und gleichzeitig die Dateieigenschaften mit in einer Tabelle abspeichern. Da bei den Ext. Laufw. immer diese LZ 70 Meldung mitkommt, sollte das dann mit diesem Eingriff verhindert werden.

Grüße von Rosel


Anzeige
AW: Zugriff verweigert
01.05.2023 13:48:52
Pappawinni
Es gibt halt nicht "die Dateieigenschaften"
Dauer (Länge), Fr_Höhe, Fr_Breite sind Metadaten und die gibt es dann auch nur bei bestimmten Dateitypen
Es macht ja keinen Sinn z.B. bei einem Excelfile eine Dauer anzugeben.
Wenn du wenigstens einmal die Dateinamen aufgelistet bekommen und eben keinen Fehler bekommen hättest, wäre das schon mal ein erster Schritt gewesen.
Schliesslich lautet ja der Titel deines Posts "Zugriff verweigert".
Wenn das schon nicht funktionieren sollte, müsste man sich das Dateisystem, das du da beackerst näher anschauen können.


AW: Zugriff verweigert
01.05.2023 13:55:24
Rosel
Hallo Pappawinni,

wir belassen das mal so. Der Kollege "Piet" ist ja noch im Urlaub und wenn der zurück ist, soll der sich mal damit befassen. Von Ihm stammen ja diese "Code-Schnipsel".

Grüße von Rosel


AW: Zugriff verweigert
01.05.2023 19:54:20
JoWE
Hallo,
hast Du mal überlegt, die Besitzrechte und Zugriffsberechtigungen des Betriebssytems zu prüfen und dort evtl. auch Änderungen vorzunehmen?
Siehe dazu hier:
https://support.microsoft.com/de-de/topic/-zugriff-verweigert-oder-andere-fehler-beim-zugriff-auf-oder-beim-arbeiten-mit-dateien-und-ordnern-in-windows-219af563-1953-ab4a-f17e-b0182755214e
So würde der Fehler dann möglicherweise nicht mehr auftreten.
Das natürlich nur, wenn Du an Deinem PC auch Administrator bist, sonst vergiss meinen Beitrag.
Gruß
Jochen


AW: Zugriff verweigert
01.05.2023 20:17:40
Rosel
Hallo Jochen,

ja, das habe ich auch schon alles probiert. Ohne Erfolg! Habe auch schon mit "Diskpart" die ext. Platte bearbeitet. Ohne Erfolg! Das komische daran ist ja, dass die Lz 70 Meldung nur kommt, wenn ich nur den Laufwerksbuchstaben z. B. ("D:") eingebe. Gebe ich aber den Lw Buchstaben mit einem Ordnernamen ein z. B. ("D:\Test") dann erfolgt keine Lz 70 Meldung. Mit einem Makro von "K. Rola" kann ich ohne Probleme nur mit dem Laufwerksbuchstaben z. B. ("D:") auf die Platte zugreifen, ohne dass die Lz 70 Meldung kommt.

Grüße von Rosel


AW: Zugriff verweigert
01.05.2023 20:28:34
Pappawinni
Für die Ursachensuche hab ich dann auch mal noch ein Makro erstellt.
Das kannst du in ein neues Workbook in ein neues Modul rein setzen.

Dann musst du in dem Makro den Pfad und den Dateinamen angeben.

Wenn das Makro dann gestartet wird, sollte im ERSTEN Arbeitsblatt eine Liste von Metadaten für diese eine Datei erscheinen.
Im Grunde ist das genau das, was in deinem Makro für alle Dateien passieren soll, dort halt beschränkt auf einige wenige Daten.
Falls dabei nichts heraus kommt, wird auch bei "deinem" Details_auslesen nichts herauskommen können.


Sub test()
  Dim strFolder As String
  Dim strFile As String
  Dim objShell As Object
  Dim objFolder As Object
  Dim objItem As Object
  Dim x As Integer
  Dim oFSO As Object
  Dim flItem As File
  ' Hier den Pfad angeben
  strFolder = "C:\Users\....\Pictures"
  ' Hier den Dateinamen angeben
  strFile = "blabla.png"

  Set oFSO = New FileSystemObject
  Set flItem = oFSO.GetFile(strFolder & "\" & strFile)

  Set objShell = CreateObject("Shell.Application")
  Set objFolder = objShell.Namespace(flItem.ParentFolder.Path)
  Set shItem = objFolder.ParseName(flItem.Name)

  With ThisWorkbook.Worksheets(1)
    For x = 0 To 300
      .Cells(x + 2, 1).Value = x
      .Cells(x + 2, 2).Value = CStr(objFolder.GetDetailsOf(flItem, x))
      .Cells(x + 2, 3).Value = CStr(objFolder.GetDetailsOf(shItem, x))
    Next
  End With
End Sub

Es wäre ggf. auch interessant auftretende Fehlermeldungen zu sehen.


AW: Zugriff verweigert
01.05.2023 21:09:21
Rosel
Hallo Pappawinni,

Dir lässt es wohl keine Ruhe das Problem zu lösen! Soviel kann ich nach Anpassung des Ordner und des Dateinamen schon sagen, dass das Makro ohne Fehlermeldungen läuft. Es liest auch Dateien von diesem ext. Laufwerk ohne Lz 70 Meldung aus. (Da soll einer noch schlau draus werden)!

Grüße von Rosel


AW: Zugriff verweigert
01.05.2023 21:23:26
Firmus
Hi Rosel,

hier ein Beispiel, dass trotz gesperrter Verzeichnisse auflistet.
https://www.herber.de/bbs/user/158993.xlsm

Getestet mit:
C:\$Recycle.Bin
C:\Program Files
C:\Recovery

Prüfe bitte, ob diese Variante deinen Sperrfehler behebt.

Es sind zwar noch nicht alle Attribute enthalten, die du haben willst,
aber u. U. ist dies einen Versuch wert über den Lz-70-Fehler zu kommen.
Sollte das klappen, wären die weiteren Attribute schnell abgefragt, und
- sofern nicht dort die Ursache von Lz70 liegt - auch bald eingebaut.

DoEvents:
Diese Anweisung "sagt" VBA, dass es immer wieder "hören" soll, ob Windows etwas
unternehmen will.
1. Damit wir es möglich VBA für Debugging recht bequem zu unterbrechen.
2. Ohne DoEvents greift sich Excel(VBA) alle PC-Resourcen und blockiert alle anderen Anwendungen.

Frage, um die Problematik einzugrenzen:
Ist es möglich auf genau den gleichen Pfad, den gleichen Laufwerksbuchstaben mit MS-Explorer zuzugreifen?
Bei mir war es deckungsgleich: Kein Zugriff mit VBA, dann auch kein Zugriff mit MS-Explorer.

Hinweis auf bisherige Tests:
Der LZ-70 tritt bei Beginn einer "FOR-xxx"-Schleife auf, in der alle Files eines Ordners ausgelesen werden sollen.
Wird hier VORHER "On Error Resume next" gesetzt, ignoriert VBA diesen Fehler und gibt die Fehler-Info in der
Variablen Err.number usw. an den Programmierer zurück. Dieser muss dann reagieren.
Sagt der Programmierer: Nimm einfach den nächsten Eintrag, so funktioniert das nicht, da am Ende der
FOR-xxx-Schleife erst noch die "NEXT xxx"-Anweisung kommt.
Diese erhält aber den Fehler "92" - FOR-Schleife nicht initialisiert. Was auch stimmt, da das FOR einen Fehler bekam.

Jetzt könnte man ja den Beginn der FOR-Schleife mit GOTO ansteuern, damit wird aber genau der gleiche Ordner wieder versucht => Endlosschleife.

Um da drüber zu kommen, müsste nun das nächste Verzeichnis angesprochen werden.
Damit habe ich mich aber in der Recursive-Situation noch nicht beschäftigt.

Falls du testet, lass das Ergebnis wissen.

Gruß,
Firmus


AW: Zugriff verweigert
01.05.2023 23:54:03
Rosel
Hallo Firmus,

es ist gut gemeint, aber dieses Makro ist leider für mich eine "Hausnummer" zu groß und zu hoch. Für das was ich es brauche, würde mir das von mir eingeladene Makro ausreichen, wenn es diese Probleme mit dem Lz 70 nicht geben würde. Man bräuchte ja nur Teile von diesem beigefügten Code einfügen und schon wäre alles in Butter.

Grüße von Rosel


AW: Zugriff verweigert
01.05.2023 21:47:44
Pappawinni
Der Laufzeitfehler dingenskirchen tritt bei mir auch auf, WENN
ich als Pfad "C:" angebe UND das

       If (oFolder.Attributes And vbSystem) > 0 Then
          Exit Sub
       End If
in der sub OVBAde_ReadSubFolder(oFolder As Folder)
FEHLT
Und so funktioniert das bei mir ohne Probleme bei "C:", dauert halt

   Option Explicit
   'Code von YAL leicht ergänzt, korrigiert.
   'unter Anbindung von "Microsoft Scripting Runtime" ("Extras", "Verweise...", einhaken)
   'Start der Routine: OVBAde_DateienMitUnterordnernAuslesen
   
   Private oSheet As Worksheet
   Private oFSO As FileSystemObject
   
   Public Sub OVBAde_DateienMitUnterordnernAuslesen()
   'Const sRootPath As String = "C:\TEST" 'Pfad bitte anpassen ohne Trennzeichen am Ende!!!
   Const sRootPath As String = "C:"
       
       Set oFSO = New FileSystemObject
       Set oSheet = Sheets.Add
       With oSheet.Range("A1:G1")
           .Value = Array("Pfad", "Datum", "Dateiname", "Grösse", "Länge", "Fr_Höhe", "Fr_breite")
           .Interior.ColorIndex = 11
           .Font.Color = vbWhite
           .Font.Color = vbWhite
       End With
       OVBAde_ReadSubFolder oFSO.GetFolder(sRootPath)
       oSheet.Columns.AutoFit
   End Sub
   
   Private Sub OVBAde_ReadSubFolder(oFolder As Folder)
   Dim oSubFolder As Folder
   Dim oFile As Scripting.File
   Dim Details
       
       If (oFolder.Attributes And vbSystem) > 0 Then
          Exit Sub
       End If
       
   'Alle Dateien auflisten
       For Each oFile In oFolder.Files
           With oSheet.Cells(Rows.Count, 1).End(xlUp)
               .Offset(1, 0) = oFolder.Path
               .Offset(1, 1) = oFile.DateLastModified
               .Offset(1, 2) = oFile.Name               'Ausgabe wichtig, für ausserhalb des Filters
               
               Details = Details_auslesen(oFile)
               
               If UBound(Details) = 4 Then
                  .Offset(1, 2).Resize(1, 5) = Details
               End If
           End With
       Next
   'Alle Unterverzeichnisse verarbeiten (rekursiv)
       For Each oSubFolder In oFolder.subfolders
           OVBAde_ReadSubFolder oSubFolder
       Next oSubFolder
   End Sub
   
   Function Details_auslesen(Datei As File)
   Dim ShApp As Object 'Shell-Objekt
   Dim ShFolder As Object 'Folder-Objekt (nach Shell-App Muster, nicht nach FileSystemObject)
   Dim ShFolderItem As Object 'Folder-Item, also Datei, nach Shell.GetItem
   Dim Ergebnis(4) As String
   Const cExtListe = "mp4 mkv avi flv" 'Leerzeichen getrennt wg Split (Split splittet per Default auf Leerzeichen)
   
   'keine Verarbeitung, wenn nicht in der Liste
'       If Not InStr(1, cExtListe, oFSO.GetExtensionName(Datei.Name)) Then Exit Function
       
      '  If InStr(1, cExtListe, oFSO.GetExtensionName(Datei.Name)) Then

            Set ShApp = CreateObject("Shell.Application")
            Set ShFolder = ShApp.Namespace(Datei.ParentFolder.Path)
            Set ShFolderItem = ShFolder.ParseName(Datei.Name)
            
            Ergebnis(0) = ShFolder.GetDetailsOf(ShFolderItem, 0) 'Name
            Ergebnis(1) = ShFolder.GetDetailsOf(ShFolderItem, 1) 'Size
            Ergebnis(2) = ShFolder.GetDetailsOf(ShFolderItem, 27) 'Length
            Ergebnis(3) = ShFolder.GetDetailsOf(ShFolderItem, 283) 'Frame Height
            Ergebnis(4) = ShFolder.GetDetailsOf(ShFolderItem, 285) 'Frame Width
            Details_auslesen = Ergebnis
       ' Else
       '     Details_auslesen = Array()
       ' End If
        
        
   End Function

wobei jetzt die Ausgabe von Attributen nicht mehr auf bestimmte Dateitypen begrenzt ist.
Bei dem was "Frame Width" und "Frame Height" sein soll, kommt nichts nach meiner Attributliste (mit dem gezeigten TEST()), tauchen die
Attribute unter den ersten 300 auch nicht auf.


AW: Zugriff verweigert
01.05.2023 22:40:56
Rosel
Hallo Pappawinni,

das Makro läuft zwar ohne Fehlermeldungen ab. Es liest aber keine Dateien von diesem ext. Laufwerk aus. Das einzige was angezeigt wird sind die Überschriften. Wenn ich die Ordner vom internen LW z. B. "C:\Herber" auslese, zeigt er mir alle darin sich befindlichen Dateien an, auch wenn sie nicht in der "Const cExtListe = "mpg txt jpg nfo" drin stehen.
Die "Attribut Liste" geht bis 320. Davon ist "Frame Width" = 316 und "Frame Height" = 314. Die Werte können aber von PC / Laptop unterschiedlich sein.

Grüße von Rosel


AW: Zugriff verweigert
01.05.2023 23:51:12
Pappawinni
JaNee, was denn, du willst nicht alle Dateien ?
Jetzt hatte ich gerade das Thema mit dem Rootfolder nochmal angeschaut,
das testet man ja nicht gerne, wenn man erwartet, dass da zehntausende Files durchgeackert werden müssen.
Ich hab also jetzt mal folgende Änderungen.


   Public Sub OVBAde_DateienMitUnterordnernAuslesen()
   'Const sRootPath As String = "C:\TEST" 'Pfad bitte anpassen ohne Trennzeichen am Ende!!!
   Const sRootPath As String = "C:"
       
       Set oFSO = New FileSystemObject
       Set oSheet = Sheets.Add
       With oSheet.Range("A1:G1")
           .Value = Array("Pfad", "Datum", "Dateiname", "Grösse", "Länge", "Fr_Höhe", "Fr_breite")
           .Interior.ColorIndex = 11
           .Font.Color = vbWhite
           .Font.Color = vbWhite
       End With
       If Right(sRootPath, 1) = ":" Then
         OVBAde_ReadSubFolder oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).RootFolder
       Else
         OVBAde_ReadSubFolder oFSO.GetFolder(sRootPath)
       End If
       oSheet.Columns.AutoFit
   End Sub
   
   Private Sub OVBAde_ReadSubFolder(oFolder As Folder)
   Dim oSubFolder As Folder
   Dim oFile As Scripting.File
   Dim Details
       
       On Error Resume Next
   'Alle Dateien auflisten
       For Each oFile In oFolder.Files
           With oSheet.Cells(Rows.Count, 1).End(xlUp)
               .Offset(1, 0) = oFolder.Path
               .Offset(1, 1) = oFile.DateLastModified
               .Offset(1, 2) = oFile.Name               'Ausgabe wichtig, für ausserhalb des Filters
               
               Details = Details_auslesen(oFile)
               
               If UBound(Details) = 4 Then
                  .Offset(1, 2).Resize(1, 5) = Details
               End If
           End With
       Next
   'Alle Unterverzeichnisse verarbeiten (rekursiv)
       For Each oSubFolder In oFolder.subfolders
           OVBAde_ReadSubFolder oSubFolder
       Next oSubFolder
   End Sub
Für den Fall, dass du von Files die nicht "mp4 mkv avi flv" sind nichts wissen willst, muss das schon früher abgefangen werden,
nicht erst, wenn ein Teil der Daten schon geschrieben sind....


AW: Zugriff verweigert
02.05.2023 00:11:00
Rosel
Hallo Pappawinni,

wir drehen uns irgendwie im Kreis. Jetzt werden bei ext Platten und auch bei internen Platten nur die Überschriften angezeigt. Er nudelt zwar rum, aber liefert keine Daten. Deshalb beenden wir jetzt die Geschichte und ich mache mal Feierabend für Heute. Tschüss und gute Nacht.

Grüße von Rosel


AW: Zugriff verweigert
02.05.2023 02:55:41
Pappawinni
Hmmm,
Ich fürchte, dass du das Details auslesen weggeworfen hast, oder?
Den hab ich nicht gepostet, weil ich daran nichts geändert hab.
Ist aber egal, das muss ohnehin anders aussehen.
Wenn immerhin schon mal Verzeichnise gelesen werden, die vorher nicht gelesen wurden..
Ist doch schon n Fortschritt und nicht im Kreis. Wir schaffen das.


AW: Zugriff verweigert
02.05.2023 13:18:38
Pappawinni
Hallo Rosel,
die Test auf "C:" haben etwas gedauert, ich hab auch nicht viele Dateien des gesuchten Typs.
Ich habe festgestellt, dass ich auf C: Folder habe, wo ich keine Leseberechtigung habe, konnte aber nicht herausfinden,
wie ich das abfangen kann, darum ist da immer noch ein on error resume next.
Was mir noch nicht wirklich klar ist, ob du nun
- alle Dateien gelistet haben willst, aber spezielle attribute nur für "mp4 mkv avi flv" oder
- nur Dateien gelistet haben willst und da dann auch die speziellen Attribute
Das kannst du aber leicht ändern.

Hier jetzt der komplette Code:


    Option Explicit
    'Code von YAL leicht ergänzt, korrigiert.
    'unter Anbindung von "Microsoft Scripting Runtime" ("Extras", "Verweise...", einhaken)
    'Start der Routine: OVBAde_DateienMitUnterordnernAuslesen
    
    Private oSheet As Worksheet
    Private oFSO As FileSystemObject
    Public Sub OVBAde_DateienMitUnterordnernAuslesen()
    
    'Const sRootPath As String = "C:\TEST" 'Pfad bitte anpassen ohne Trennzeichen am Ende!!!
    Const sRootPath As String = "C:"
    
    Set oFSO = New FileSystemObject
    Set oSheet = Sheets.Add
    
    'Titelzeile erstellen
    With oSheet.Range("A1:G1")
        .Value = Array("Pfad", "Datum", "Dateiname", "Grösse", "Länge", "Fr_Höhe", "Fr_breite")
        .Interior.ColorIndex = 11
        .Font.Color = vbWhite
        .Font.Color = vbWhite
    End With
    
    If oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).Path = sRootPath Then
        OVBAde_ReadSubFolder oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).RootFolder
    Else
        OVBAde_ReadSubFolder oFSO.GetFolder(sRootPath)
    End If
    
    oSheet.Columns.AutoFit
    
    MsgBox "erledigt"
    
    End Sub
     
    Private Sub OVBAde_ReadSubFolder(oFolder As Folder)
    Dim oSubFolder As Folder
    Dim oFile As Scripting.File
    Dim Details
        
    On Error Resume Next
    
    'Alle Dateien auflisten
    For Each oFile In oFolder.Files
        Details_auslesen oFile
    Next
         
    'Alle Unterverzeichnisse verarbeiten (rekursiv), die nicht System oder Hidden sind
    For Each oSubFolder In oFolder.subfolders
        If Not ((oSubFolder.Attributes And (vbSystem + vbHidden)) > 0) Then
            OVBAde_ReadSubFolder oSubFolder
        End If
    Next oSubFolder
    
    End Sub
     
    Sub Details_auslesen(Datei As File)
    Dim ShApp As Object 'Shell-Objekt
    Dim ShFolder As Object 'Folder-Objekt (nach Shell-App Muster, nicht nach FileSystemObject)
    Dim ShFolderItem As Object 'Folder-Item, also Datei, nach Shell.GetItem
    Const cExtListe = "!mp4!mkv!avi!flv!"
    
    DoEvents
   
    If Not (InStr(1, cExtListe, "!" & oFSO.GetExtensionName(Datei.Name) & "!") > 0) Then
'        With oSheet.Cells(Rows.Count, 1).End(xlUp)
'            .Offset(1, 0).Value = Datei.Path
'            .Offset(1, 1).Value = Datei.DateLastModified
'            .Offset(1, 2).Value = Datei.Name
'        End With
        Exit Sub
    End If

    Set ShApp = CreateObject("Shell.Application")
    Set ShFolder = ShApp.Namespace(Datei.ParentFolder.Path)
    Set ShFolderItem = ShFolder.ParseName(Datei.Name)
            
    With oSheet.Cells(Rows.Count, 1).End(xlUp)
        .Offset(1, 0).Value = Datei.Path
        .Offset(1, 1).Value = Datei.DateLastModified
        .Offset(1, 2).Value = Datei.Name
        .Offset(1, 3).Value = CStr(ShFolder.GetDetailsOf(ShFolderItem, 1)) 'Size
        .Offset(1, 4).Value = CStr(ShFolder.GetDetailsOf(ShFolderItem, 27)) 'Length
        .Offset(1, 5).Value = CStr(ShFolder.GetDetailsOf(ShFolderItem, 314)) 'Frame Height
        .Offset(1, 6).Value = CStr(ShFolder.GetDetailsOf(ShFolderItem, 316)) 'Frame Width
    End With
        
    End Sub



AW: Zugriff verweigert
02.05.2023 21:39:28
Pappawinni
Leider fehlt nun das Feedback von Rosel, die mit Geduld wohl nicht gesegnet ist.

Ich habe mal mein Festplatte von C: beginnend vollständig durchnudeln lassen, deren Ausgabe ich aber auskommentiert habe,
soweit es sich nicht um Files der Typen "mp4 mkv avi flv" handelt.
Es konnten 807741 Dateien gelesen werden. Die hätten noch so eben in das Excelblatt gepasst.
Nicht gelesen konnten, wegen fehlender Leserechte 941 Verzeichnisse. Der erste Output kam nach über 90000 Files.
Insgesamt wurden nur 75 Files der oben gennannten Typen gefunden und das dauerte ca. 2,5 Stunden.
Ich habe zu dem Zweck natürlich das zuvor gepostete Makro nachträglich noch mit einigen Ausgaben versehen, damit ich überhaupt sehe, ob es noch was tut.
Am Ende ist immerhin eine MsgBox, die anzeigt, wenn das Makro fertig ist.
Nach all meinen Tests gehe ich davon aus, dass das Makro nun tun kann, was es tun sollte.


AW: Zugriff verweigert
02.05.2023 22:01:14
JoWE
Hallo,

Ich glaube Rosel hieß auch schon mal Elfriede und sie hat das Problem bereits einige mal gepostet.
Wobei ich dachte es sei bereits erledigt gewesen.
War es wohl doch nicht.
Nun, ich habe Deine Lösung bei mir mit diversen LW (intern. extern und im Netzwerk) laufen lassen.
Aus meiner Sicht läuft es fehlerfrei. Hut ab!
Mal schauen was Rosel/Elfriede sagt falls sie noch Laut gibt.

Gruß
Jochen


AW: Zugriff verweigert
02.05.2023 22:56:42
Pappawinni
Haha, interessant, was du dir so merkst.
Google hat da was gefunden, muss wohl in 2019 gewesen sein, liest sich tatsächlich so, als wäre das genau das gleiche Thema gewesen.
"Eigenschaften ergänzen" war der Titel und Autorin war Elfriede.


AW: Zugriff nicht mehr verweigert.
03.05.2023 21:29:32
Pappawinni
Ich denke ja, dass das Thema grundsätzlich gelöst ist.
Es ist auch wenig auf meinem Mist gewachsen, auch wenn ich erst kürzlich etwas ganz ähnliches gebaut habe.
Es ging da aber nur darum, eine Verzeichnisstruktur abzubilden. Der Teil mit der Rekursion sieht da sehr ähnlich aus, wie bei mir, wobei ich da eine Function statt ner Sub hatte, aber egal. Das Thema hat mich deshalb auch angesprungen.
Für alle die vielleicht später noch einmal auf diesen Thread stoßen sei ergänzt, dass ich noch eine kleine Modifikation bei der Fehlerbehandlung vorgenommen habe, die, wie es scheint einen deutlichen Einfluss auf die Geschwindigkeit hatte. Damit konnte ich heute meine Festplatte C: in 58 Minuten durchnudeln, gestern dauerte das noch über 2 Stunden.

In Private Sub OVBAde_ReadSubFolder(oFolder As Folder)
habe ich jetzt beginnend mit Resume Next folgendes:

    'Testet ob Verzeichnis gelesen werden kann
    On Error Resume Next
    If Not (oFolder.Files.Count >= 0) Then
        Exit Sub
    End If
    On Error GoTo 0
Weil, wie ich festgestellt habe, bei fehlender Leseberechtigung schon die Abfrage von oFolder.Files.Count fehl schlägt, kommt es damit wegen Resume Next zum sofortigen Exit der Sub. Bei vorhandener Leseberechtigung liefert oFolder.Files.Count aber einen Wert und der Exit Sub wird übersprungen.
Hinterher wird die Fehlerbehandlung mit On Error GoTo 0 wieder dem System überlassen.


AW: Zugriff nicht mehr verweigert.
03.05.2023 21:52:32
JoWE
Hallo nochmal,
gebe Dir Recht was den Status der Aufgabe betrifft.
Die deutliche Steigerung der Verarbeitungsgeschwindigkeit werde ich mir anschauen.
Deine diesbezüglichen Feststellungen hatte ich nicht auf dem Schirm, bin aber angetan.
Gruß
Jochen

Schade dass Rosel oder Elfriede oder...
sich nicht mehr meldet.


AW: Zugriff nicht mehr verweigert.
03.05.2023 22:33:12
Pappawinni
Inwieweit du da etwas an Geschwindigkeitsvorteil feststellst wird wohl auch davon abhängen, ob da Folder dabei sind, bei denen du keine Leseberechtigung hast.
Ich weiss ja nicht, was Excel da macht, wenn irgendwo On Error Resume Next da steht und alles was danach kommt produziert wieder und wieder Fehler.
Deshalb hab ich versucht das auf das nötigste zu begrenzen.


AW: Zugriff nicht mehr verweigert.
05.05.2023 23:09:18
Rosel
Hallo Joachim und Pappawinni,

möchte mich nur kurz zu der Feststellung äußern, ob ich eventuell "Elfriede & Rosel" sein könnte. Dem ist leider nicht so. Denn wo "Rosel" drauf steht ist auch "Rosel" drin und nicht "Elfriede". Weil es zufälligerweise in einem längeren Zeitraum zwei Personen gab, die ähnliche Projekte im Forum beackern ließen, heißt das noch lange nicht, dass Wir die gleichen Personen sein sollen bzw. sein könnten. Was das Makro betrifft, das habe ich aus dem Fundus des Herber Forum ausgegraben. Es eignete sich für mein Hobby am Besten, wenn das mit dem LZ Fahler nicht gewesen wäre. In meinem Thread hatte ich aber gleich geschrieben, dass es sich hier um Externe Laufwerke handelt, die ausgelesen werden sollen. Darauf können sich natürlich alle Arten von Dateien befinden, mit den unterschiedlichsten Dateiendungen. Nachdem sich mit der Zeit so ein Wirrwarr ergeben hat, habe ich "Pappawinni diese Nachricht geschickt: "wir drehen uns irgendwie im Kreis. Jetzt werden bei ext Platten und auch bei internen Platten nur die Überschriften angezeigt. Er nudelt zwar rum, aber liefert keine Daten. Deshalb beenden wir jetzt die Geschichte und ich mache mal Feierabend für Heute. Tschüss und gute Nacht." Von dieser Meldung weg, habe ich auch den Haken weggelassen, der über Frage noch offen oder nicht mehr offen entscheidet. Somit war das Thema für mich erledigt. Ich habe jetzt eine einfachere Möglichkeit gefunden dem LZ 70 Fehler aus dem Weg zu gehen in dem ich nicht den Laufwerksbuchstaben alleine eingebe, sondern ich installiere einen Ordner und in diesen Ordner kopiere ich dann die anderen Ordner und Dateien und damit ist das Problem gelöst. Hoffe ich doch!
Trotzdem noch mal Danke an "PappaWinni" für seine Bemühungen.

Grüße von Rosel


AW: Na dann good luck!! Nix für Ungut! o.T.
05.05.2023 23:13:41
JoWE


AW: Na dann good luck!! Nix für Ungut! o.T.
06.05.2023 00:18:47
Pappawinni
Die Überschriften bringt es, solange kein File der speziellen Typen findet. Das hatte ich aber geschrieben. Da gibt es in der Sub Details auslesen einen Outputbereich, der auskommentiert ist. Wenn du den aktivierst, dann bekommst du alle Files.
Dass das so ist, lag daran, dass du
a) nicht bereit wärst genauer zu sagen, was du willst.
b) wenig Bereitschaft gezeigt hast, zur Lösung beizutragen, meckern > Kooperation.
c) ich meine komplette Platte durchgenudelt habe und Bedenken hatte, dass die Zeilenzahl für alle Dateien reicht.
Für jemanden, der ein wenig den Code versteht ist es kein Problem die auskommentierten Zeilen zu aktivieren.
Aber gut ich kann den Code auch noch so posten, dass alle Files gelistet werden.


AW: Na dann good luck!! Nix für Ungut! o.T.
06.05.2023 00:34:58
Pappawinni
So, also da dann der Code, der alle Dateien raus wirft, extra für Rosel.
Da sind halt jetzt auch die Kontrollausgaben drinnen, bin zu faul jetzt nochmal raus zu werfen.


    Option Explicit
    'Listet für einen fest im Code hinterlegten Ordner und dessen Unterordner
    'jeweils auf einem neuen Arbeitsblatt alle Dateien
    'für Dateien der Typen mp4, mkv, avi, flv mit zusätzlichen Attributen
    '(z.B. um Inhalte verschiedener Wechseldatenträger zu erfassen)
    'vollständig überarbeitet und getestet im Mai 3023
    '
    'Ursprungscode bereitgestellt von Rosel auf herber.de mit dem Kommentar:
    'Code von YAL leicht ergänzt, korrigiert.
    'unter Anbindung von "Microsoft Scripting Runtime" ("Extras", "Verweise...", einhaken)
    'Start der Routine: OVBAde_DateienMitUnterordnernAuslesen
    
    Private oSheet As Worksheet
    Private oFSO As FileSystemObject
    Private dtStart As Date
    Private t(4) As Variant
    Const cFilesRead = 0
    Const cLinesOut = 1
    Const cTimeElapsed = 2
    Const cPathNoReadPerm = 3
    Const cPathSysHid = 4


        
    Public Sub OVBAde_DateienMitUnterordnernAuslesen()
    
    'Const sRootPath As String = "C:\TEST" 'Pfad bitte anpassen ohne Trennzeichen am Ende!!!
    Const sRootPath As String = "C:"
    
    dtStart = Now
    t(cLinesOut) = 0
    t(cFilesRead) = 0
    t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
    t(cPathNoReadPerm) = 0
    t(cPathSysHid) = 0

    dtStart = Now

    Set oFSO = New FileSystemObject
    Set oSheet = Sheets.Add
            
    'Titelzeile erstellen
    With oSheet.Range("A1:G1")
        .Value = Array("Pfad", "Datum", "Dateiname", "Grösse", "Länge", "Fr_Höhe", "Fr_breite")
        .Interior.ColorIndex = 11
        .Font.Color = vbWhite
        .Font.Color = vbWhite
        .HorizontalAlignment = xlCenter
    End With
    
    'Titel für Zähleranzeige während der Laufzeit
    oSheet.Range("i1:M1").Value = Array("Files geprüft", "Files ausgeg.", "Laufzeit", "Folder o. Rechte", "Folder Sys/Hidden")
    oSheet.Range("i2:M2").Value = t
    oSheet.Range("i1:M2").Columns.AutoFit
        
    If oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).Path = sRootPath Then
        OVBAde_ReadSubFolder oFSO.GetDrive(oFSO.GetDriveName(sRootPath)).RootFolder
    Else
        OVBAde_ReadSubFolder oFSO.GetFolder(sRootPath)
    End If
        
    'Zähleranzeige entfernen
    oSheet.Range("i1:M2").Clear
    
    oSheet.Columns.AutoFit
    
    t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
    MsgBox "Files geprüft   " & vbTab & ": " & t(cFilesRead) & vbCrLf & _
           "Files ausgegeben" & vbTab & ": " & t(cLinesOut) & vbCrLf & _
           "Laufzeit        " & vbTab & ": " & t(cTimeElapsed) & vbCrLf & vbCrLf & _
           "Folder o. Leserechte" & vbTab & ": " & t(cPathNoReadPerm) & vbCrLf & _
           "Folder Syst./Hidden" & vbTab & ": " & t(cPathSysHid)

    End Sub
     
    Private Sub OVBAde_ReadSubFolder(oFolder As Folder)
    Dim oSubFolder As Folder
    Dim oFile As Scripting.File
             
    'Testet ob Verzeichnis gelesen werden kann
    On Error Resume Next
    If Not (oFolder.Files.Count >= 0) Then
        t(cPathNoReadPerm) = t(cPathNoReadPerm) + 1
        Exit Sub
    End If
    On Error GoTo 0
    
    'Alle Dateien durchforsten
    For Each oFile In oFolder.Files
        If Not oFile Is Nothing Then
            Details_auslesen oFile
        End If
    Next
          
    'Alle Unterverzeichnisse verarbeiten (rekursiv), die nicht System oder Hidden sind
    For Each oSubFolder In oFolder.subfolders
        If Not ((oSubFolder.Attributes And (vbSystem + vbHidden)) > 0) Then
            OVBAde_ReadSubFolder oSubFolder
        Else
            t(cPathSysHid) = t(cPathSysHid) + 1
        End If
    Next oSubFolder
           
    End Sub
     
    Sub Details_auslesen(Datei As File)
    Dim ShApp As Object 'Shell-Objekt
    Dim ShFolder As Object 'Folder-Objekt (nach Shell-App Muster, nicht nach FileSystemObject)
    Dim ShFolderItem As Object 'Folder-Item, also Datei, nach Shell.GetItem
    Const cExtListe = "!mp4!mkv!avi!flv!"
    
    DoEvents
    
    t(cFilesRead) = t(cFilesRead) + 1
    t(cTimeElapsed) = Format(Now - dtStart, "hh:mm:ss")
    oSheet.Range("i2:M2").Value = t
      
    If Not (InStr(1, cExtListe, "!" & oFSO.GetExtensionName(Datei.Name) & "!") > 0) Then
        t(cLinesOut) = t(cLinesOut) + 1
        With oSheet.Cells(t(cLinesOut), 1)
            .Offset(1, 0).Value = Datei.Path
            .Offset(1, 1).Value = Datei.DateLastModified
            .Offset(1, 2).Value = Datei.Name
        End With
        Exit Sub
    End If
    
    oSheet.Cells(2, 10).Value = oSheet.Cells(2, 10).Value + 1

    Set ShApp = CreateObject("Shell.Application")
    Set ShFolder = ShApp.Namespace(Datei.ParentFolder.Path)
    Set ShFolderItem = ShFolder.ParseName(Datei.Name)
            
    t(cLinesOut) = t(cLinesOut) + 1
    With oSheet.Cells(t(cLinesOut), 1)
        .Offset(1, 0).Value = Datei.Path
        .Offset(1, 1).Value = Datei.DateLastModified
        .Offset(1, 2).Value = Datei.Name
        .Offset(1, 3).Value = ShFolder.GetDetailsOf(ShFolderItem, 1) 'Size
        .Offset(1, 4).Value = ShFolder.GetDetailsOf(ShFolderItem, 27) 'Length
        .Offset(1, 5).Value = ShFolder.GetDetailsOf(ShFolderItem, 314) 'Frame Height
        .Offset(1, 6).Value = ShFolder.GetDetailsOf(ShFolderItem, 316) 'Frame Width
    End With
        
    End Sub


Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige