Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
964to968
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
964to968
964to968
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Passwortgeschützte Datei überspringen

Passwortgeschützte Datei überspringen
05.04.2008 07:16:00
Günter
Hallo Zusammen,
ich habe die Frage schon mal gestellt aber keine Lösung bekommen.
Ich möchte alle Dateien in einem Verzeichnis nacheinander öffnen, einen Wert auslesen und anschließend wieder schließen.
Mein Problem ist, dass es Excel-Dateien gibt, die mit Passwort für "Lese- und Schreibzugriff" versehen sind.
Wenn ich solche eine Datei öffnen möchhte erscheint ein Eingabefenster für das Passwort.
Diese Dateien möchte ich einfach überspringen, d.h. nicht öffnen und nicht auslesen.
Hat vielleicht doch noch jemand eine Idee für eine Lösung?
Danke im Voraus
Günter

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Passwortgeschützte Datei überspringen
05.04.2008 10:48:31
Tino
Hallo,
ich habe keine direkte Lösung, kenne auch keine Möglichkeit vor dem öffnen zu Prüfen
ob die Datei ein Schreibschutzkennwort hat.
Kann dir nur anbieten, damit der Code keinen Fehler beim nicht öffnen bringt, wenn du
bei der Schreibschutzabfrage auf “Abbrechen“ drückst.

Sub Test_Datei()
Dim Datei As String
Datei = "C:\Test.xls"
On Error Resume Next
Workbooks.Open Datei
On Error GoTo 0
End Sub


Gruß
Tino

AW: Passwortgeschützte Datei überspringen
05.04.2008 11:19:00
Matthias.G.
hi Günter,
hattest du denn eine Lösung zum "einlesen" bekommen, ich finde die nicht.
Es wäre mir lieb, wenn du mir den Link oder die Lösung geben könntest.
Gruss
Matthias

Anzeige
AW: Passwortgeschützte Datei überspringen
05.04.2008 12:53:15
Nepumuk
Hallo Günter
mal ein Beispiel:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Sub test()
    MsgBox IsFileProtect("C:\Test.xls")
End Sub

Private Function IsFileProtect(strFilePath As String) As Boolean
    Dim intFreeFile As Integer
    Dim lngRowPosition As Long, lngPosBOF() As Long, lngCounter As Long
    Dim lngCountBOF As Long, lngFindBOF As Long, lngFindDBCell As Long
    Dim lngRecordLength As Long, lngFilePosition As Long
    Dim strRowString As String, strDBCellString As String, strBOFString As String
    Dim strBuffer As String
    Dim bytBuffer() As Byte
    On Error Resume Next
    Redim lngPosBOF(1 To 10)
    strBOFString = Chr$(9) & Chr$(8) & Chr$(16) & Chr$(0)
    strDBCellString = Chr$(&HD7) & Chr$(0)
    strRowString = Chr$(&H8) & Chr$(&H2) & Chr$(&H10)
    intFreeFile = FreeFile
    Open strFilePath For Binary Access Read As #intFreeFile
    strBuffer = String$(LOF(intFreeFile), 0)
    Get #intFreeFile, , strBuffer
    Close #intFreeFile
    lngFindBOF = InStr(1, strBuffer, strBOFString)
    Do While lngFindBOF
        lngCountBOF = lngCountBOF + 1
        If lngCountBOF > UBound(lngPosBOF) Then _
            Redim Preserve lngPosBOF(1 To UBound(lngPosBOF) + 10)
        lngPosBOF(lngCountBOF) = lngFindBOF
        lngFindBOF = InStr(lngFindBOF + 1, strBuffer, strBOFString)
    Loop
    Redim Preserve lngPosBOF(1 To lngCountBOF)
    Do
        lngFindDBCell = lngFindDBCell + 1
        lngFindDBCell = InStr(lngFindDBCell, strBuffer, strDBCellString)
        If lngFindDBCell = 0 Then Exit Do
        If lngFindDBCell > lngPosBOF(1) Then Exit Do
        bytBuffer = StrConv(Mid$(strBuffer, lngFindDBCell + 4, 2), vbFromUnicode)
        lngRowPosition = lngFindDBCell - FileDwToLong(bytBuffer(0), bytBuffer(1))
        If InStr(lngRowPosition, strBuffer, strRowString) = lngRowPosition Then
            Exit Do
        Else
            lngRowPosition = 0
        End If
    Loop
    For lngCounter = 1 To UBound(lngPosBOF)
        bytBuffer = StrConv(Mid$(strBuffer, _
            lngPosBOF(lngCounter) + 6, 1), vbFromUnicode)
        If (bytBuffer(0) And 5) = 5 Then Exit For
    Next
    lngFilePosition = lngPosBOF(lngCounter)
    Do
        bytBuffer = StrConv(Mid$(strBuffer, lngFilePosition + 2, 2), vbFromUnicode)
        Err.Clear
        lngRecordLength = FileDwToLong(bytBuffer(0), bytBuffer(1)) + 5
        bytBuffer = StrConv(Mid$(strBuffer, lngFilePosition - 1, _
            lngRecordLength), vbFromUnicode)
        If Err.Number <> 0 Then Exit Do
        If (bytBuffer(1) = 0) And (bytBuffer(2) = 0) Then Exit Do
        If (bytBuffer(1) = 255) And (bytBuffer(2) = 255) Then Exit Do
        If bytBuffer(1) = &H13 Then
            IsFileProtect = GetTextFromRecord(bytBuffer) <> "00"
            Exit Function
        End If
        lngFilePosition = lngFilePosition + lngRecordLength - 1
        If bytBuffer(1) = &HA Then
            lngCounter = lngCounter + 1
            If lngCounter > UBound(lngPosBOF) Then Exit Do
            lngFilePosition = lngPosBOF(lngCounter)
        End If
    Loop
End Function

Private Function FileDwToLong(ByVal ByteLeft As Byte, ByVal ByteRight As Byte) As Long
    FileDwToLong = Clng(ByteRight) * Clng(256) + Clng(ByteLeft)
End Function

Private Function GetTextFromRecord(bytRecord() As Byte) As String
    Dim lngCounter As Long, lngEnd As Long, lngRecordLength As Long
    lngRecordLength = FileDwToLong(bytRecord(3), bytRecord(4))
    If lngRecordLength = 0 Then Exit Function
    If lngRecordLength = 2 Then
        GetTextFromRecord = Hex$(bytRecord(5)) & Hex$(bytRecord(6))
        Exit Function
    Else
        lngEnd = FileDwToLong(bytRecord(5), bytRecord(6)) + 7
        For lngCounter = 8 To lngEnd
            GetTextFromRecord = GetTextFromRecord & Chr$(bytRecord(lngCounter))
        Next
    End If
End Function

Gruß
Nepumuk

Anzeige
@Nepumuk
05.04.2008 13:13:37
Tino
Hallo Nepumuk,
jetzt weis ich warum mein VBA Level immer noch auf Bescheiden steht, dass ist
ja beeindruckend.
Auch wen es nicht meine Frage ist, könntest du mal in ein oder zwei Sätzen kurz erklären
woran der Schutz festgestellt wird (der unterschied zwischen Schutz und nicht Schutz).
Danke
Gruß
Tino

AW: @Nepumuk
05.04.2008 13:29:00
Nepumuk
Hallo Tino,
Exceldateien haben das "BIFF8" - Dateiformat. Im Datensatz 19 steht, ob die Datei kennwortverschlüsselt ist. Ist sie es nicht, bekommst du zwei Bytes (00) zurück. Ansonsten drei bis vier Bytes mit unterschiedlichen Werten. Das Kennwort kannst du damit aber nicht auslesen !!!
Gruß
Nepumuk

Anzeige
AW: @Nepumuk - danke
05.04.2008 13:34:00
Tino
Hallo Nepumuk,
danke für die Info, super gemacht.
Gruß
Tino

AW: @Nepumuk
05.04.2008 19:24:49
Volti
Hallo Max,
auch von mir: Respekt, dass Du dich da schon mit beschäftigst hast.
Sehr interessant Dein code.
Habe hier auch eine Beschreibung zu BIFF, aber da bin ich noch nicht durchgestiegen bzw. habe es noch gar nicht versucht. Aber jetzt hätte ich mal Lust.......
viele Grüße
KH

AW: @Nepumuk
05.04.2008 21:17:00
Nepumuk
Hallo Volti,
der Grundcode stammt nicht von mir, sondern von Michael Schwimmer. Ich habe ihn nur für meine Bedürfnisse umgebaut. Wenn du das Prinzip aber mal verstanden hast, ist es garnicht so schwer.
Gruß
Nepumuk

Anzeige
Danke an @Nepumuk
05.04.2008 21:26:00
Günter
Hallo @Nepumuk,
tolle Lösung.
Danke
Günter

AW: @Nepumuk
06.04.2008 09:56:47
Volti
Danke Max.
KH

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige