Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1012to1016
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

WorkBooks.Open ohne Startmakros

WorkBooks.Open ohne Startmakros
03.10.2008 19:47:40
Reinhard
Hallo Wissende,
wie kann ich es bei XL2000 verhindern, daß wenn ich Xls-Dateien mittels WorkBooks.Open öffne darin enthaltene Startmakros loslaufen?
Wie kann ich es erreichen, daß Dateien mit Öffnungspasswortschutz gleich wieder geschlossen werden und nur ihr Name aufgelistet wird?
Hintergrund ist der Wunsch, alle Xls-dateien eines beliebigen Verzecihnisses aufzulisten, die Verknüpfungen haben zu anderen Dateien und dann auch diese Verknüpfungen aufzulisten.
Vor Start des nachfolgenden Codes habe ich unter Extras--Makro--Sicherheit die Sicherheit auf "Hoch" gestellt und auch das Häkchen bei Vertrauen auf Add-Inns und Vorlagen entfernt.
Daher dachte ich, abgesehen vom evtl. Öffnungspasswort, der Code öffnet alle Dateien und ihnen startet kein "Open"-Code.
Leider ist dem nicht so, ist ja kein Application.Sreenupdating=false drin, also sehe ichs ja, da werden munter Userforms aufgerufen und dies und jenes, alles Mögliche was aus "Open"-Makros der Dateien stammt. :-(
Verstehe ich da die Makrosicherheitsstufe "Hoch" falsch? Ich verstehe sie so, ich öffne eine Exceldatei und werde gar nicht gefragt ob ich die Datei mit aktivierten Makros starten will, sondern die sind gleich deaktiviert.
Danke ^ Gruß
Reinhard

Option Explicit
Sub Verknuepft2()
Dim Zei As Long, wksZ As Worksheet, fs As FileSearch, F As Long, LS
'On Error Resume Next
Set fs = Application.FileSearch
Set wksZ = ThisWorkbook.Worksheets("Tabelle1")
With wksZ
.UsedRange.ClearContents
.Cells(1, 1) = "Dateiname"
.Cells(1, 2) = "Verknüpfung"
End With
Zei = 1
With fs
.NewSearch
.LookIn = "h:\"
.SearchSubFolders = True
.Filename = "*.xls"
If .Execute() > 0 Then
MsgBox "There were " & .FoundFiles.Count & " file(s) found."
For F = 1 To .FoundFiles.Count
If .FoundFiles(F)  ThisWorkbook.FullName Then
Workbooks.Open Filename:=.FoundFiles(F), updatelinks:=0, ReadOnly:=True
If Not IsEmpty(ActiveWorkbook.LinkSources) Then
For Each LS In ActiveWorkbook.LinkSources
Zei = Zei + 1
wksZ.Cells(Zei, 1) = ActiveWorkbook.FullName
wksZ.Cells(Zei, 2) = LS
Next LS
End If
ActiveWorkbook.Close savechanges:=False
End If
Next F
End If
End With
Weiter:
End Sub


8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: WorkBooks.Open ohne Startmakros
03.10.2008 20:00:00
Tino
Hallo,
mit EnableEvents, müsste dass loslaufen unterbunden werden
Modul Beispiel
Option Explicit 
 
' 
Sub Verknuepft2() 
Dim Zei As Long, wksZ As Worksheet, fs As FileSearch, F As Long, LS 
'On Error Resume Next 
Set fs = Application.FileSearch 
Set wksZ = ThisWorkbook.Worksheets("Tabelle1") 
With wksZ 
   .UsedRange.ClearContents 
   .Cells(1, 1) = "Dateiname" 
   .Cells(1, 2) = "Verknüpfung" 
End With 
Zei = 1 
With fs 
   .NewSearch 
   .LookIn = "h:\" 
   .SearchSubFolders = True 
   .Filename = "*.xls" 
   If .Execute() > 0 Then 
      MsgBox "There were " & .FoundFiles.Count & " file(s) found." 
      For F = 1 To .FoundFiles.Count 
         If .FoundFiles(F) <> ThisWorkbook.FullName Then 
          With Application 
          .EnableEvents = False 
          Workbooks.Open Filename:=.FoundFiles(F), UpdateLinks:=0, ReadOnly:=True 
          .EnableEvents = True 
         End With 
            If Not IsEmpty(ActiveWorkbook.LinkSources) Then 
               For Each LS In ActiveWorkbook.LinkSources 
                  Zei = Zei + 1 
                  wksZ.Cells(Zei, 1) = ActiveWorkbook.FullName 
                  wksZ.Cells(Zei, 2) = LS 
               Next LS 
            End If 
            ActiveWorkbook.Close savechanges:=False 
         End If 
      Next F 
   End If 
End With 
Weiter: 
End Sub 
 


Gruß Tino

Anzeige
Korrektur !!!
03.10.2008 20:01:00
Tino
Modul Beispiel
Option Explicit 
 
' 
Sub Verknuepft2() 
Dim Zei As Long, wksZ As Worksheet, fs As FileSearch, F As Long, LS 
'On Error Resume Next 
Set fs = Application.FileSearch 
Set wksZ = ThisWorkbook.Worksheets("Tabelle1") 
With wksZ 
   .UsedRange.ClearContents 
   .Cells(1, 1) = "Dateiname" 
   .Cells(1, 2) = "Verknüpfung" 
End With 
Zei = 1 
With fs 
   .NewSearch 
   .LookIn = "h:\" 
   .SearchSubFolders = True 
   .Filename = "*.xls" 
   If .Execute() > 0 Then 
      MsgBox "There were " & .FoundFiles.Count & " file(s) found." 
      For F = 1 To .FoundFiles.Count 
         If .FoundFiles(F) <> ThisWorkbook.FullName Then 
           
          Application.EnableEvents = False 
          Workbooks.Open Filename:=.FoundFiles(F), UpdateLinks:=0, ReadOnly:=True 
          Application.EnableEvents = True 
          
            If Not IsEmpty(ActiveWorkbook.LinkSources) Then 
               For Each LS In ActiveWorkbook.LinkSources 
                  Zei = Zei + 1 
                  wksZ.Cells(Zei, 1) = ActiveWorkbook.FullName 
                  wksZ.Cells(Zei, 2) = LS 
               Next LS 
            End If 
            ActiveWorkbook.Close savechanges:=False 
         End If 
      Next F 
   End If 
End With 
Weiter: 
End Sub 
 


Anzeige
AW: WorkBooks.Open ohne Startmakros
03.10.2008 20:04:00
Gerd
Hallo Reinhard,
1. probier mal Application.EnableEvents= false
...open
Application.EnableEvents=true
2. Was ist ein "Öffnungs-Passwort?"
Gruß Gerd
Exceldateien öffnen, etwas auslesen, schließen
04.10.2008 16:39:00
Reinhard
Hallo Gerd, Tino,
danke, habe EnaleEvents eingebaut und es klappt besser.
Ich verstehe zwar immer noch nicht warum bei Excel2000 die Makrosicherheitseinstellung auf "Hoch" nicht verhindert, daß in dateien die geöffnet werden, automatische Startmalros ablaufen.
Jetzt mit EnableEvents auf False und Makrosicherheit auf "Mittel" klappt das wie gesagt besser, d.h. einige Userforms erscheinen nicht mehr, trotzdem fügt irgendeine Datei eine neue Symbolleiste ein, die Bearbeitungsleiste ist auf einmal ausgeblendet.
Bei einigen Dateien kommt erst die Meldung über einen schwerwiegenden Systemfehler, sofort nach Bestätigung kommt "kein Speicher" dann läuft mein Makro weiter, aber dann kommt bei einer Datei ein kleines Fensterchen, wo ich ein Passwort eingeben muß, da die mappe geschützt ist.
Dieses Fensterchen nachzustellen über Tabellenblatt schützen oder Arbeitsmappe schützen gelang mir bislang nicht.
Immerhin, wenn ich im Suchpfad der Filesearch meine Partition H: (einen Stick) auswähle, kriege ich mit welche Dateien Schwierigkeiten machen (warum muß ich später klären) und ich habe sie Zug um Zug daraus woanders hin verschoben sodaß das Makro fast schon durchläuft.
Problem ist, es sind 800 xls-Dateien und das dauert arg lange wenn das Makro läuft und somit habe ich noch nicht alle Problemdateien aus H: entfernt.
In meinem Hauptverzeichnis C: sollen laut Dos (Dir) 400 xls Dateien sein. Da bricht mein Makro schon bei dem Excecute Befehl ab, konnte nicht durchgeführt werden" o.ä.
Leider gibt es da keinerlei Hinweise an welche Datei oder sonstwas das liegen könnte.
Erschwerdend zu allem kommt wohl dazu, daß ich sowohl in H:, vielleicht auch in C: xls-Dateien habe, die in Wahrheit xla-dateien sind, nur umbenannt,dazu noch verschiedene Personl.xls Dateien mit anderem Namen habe ,die aber Ruckzuck im Editor in der Liste auftauchen.
Wenn ich jetzt sehe daß ich an diesem Code mit allen von mir erstellten Abwandlungen schon seit über einer Woche festsitze und überhaupt nicht weiterkomme, vergeßen wir ihn einfach, scheint nix zu taugen.
Neue Frage nun, hat jemand Code, mit dem ich
a) alle xls-Datei-Namen eines Verzeichnisses samt Unterverzeichnissen einlese (Filesearch gibts ja nicht in 2007)
b) alle diese Dateien öffne
- ohne das Code im Workbook_Open der Datei ausgeführt wird.
- ohne daß es seltsame Fehlermeldungen aufgrund einer Userform in der Datei gibt (daher stammt das
mit dem schwewrwiegenden fehler usw. wie o.g.)
- ohne daß ein Kennwort verlangt wird
c) bei all den Problematiken in b) soll halt die Datei wieder geschlossen werden vermerkt werden
welche Art von Problemen es gab
d) in den problemlos geöffneten Dateien soll halt ermittelt werden ob sie ein Tabellenblatt "xzy"
oder Verknüpfungen haben oder sonstwas.
e) diese Dateien wieder schließen.
Die Kurzform von a)-e) sieht so aus, daß ich nur *gg* den Code von der Funktion "OeffnenProblemlosMoeglich" bräuchte.
Bezogen auf FileSearch:

For F = 1 To .FoundFiles.Count
Cells(F, 1) = .FoundFiles(F)
Cells(F, 2) = OeffnenProblemlosMoeglich(.FoundFiles(F))
Next F
End Sub


Function OeffnenProblemlosMoeglich(ByVal PfadDateiName) As Boolean
' diesen Codeteil bräuchte ich
End Function
Danke sehr für das Interesse, ich hoffe ich konnte mich verständlich machen.
Gruß
Reinhard

Anzeige
viel Spaß dabei!
04.10.2008 21:06:00
Tino
Hallo,
Ich verstehe zwar immer noch nicht warum bei Excel2000 die Makrosicherheitseinstellung auf "Hoch"…
Dies liegt daran, dass Deine Exceldatei die Du öffnest in der gleichen Excelinstants geöffnet wird und da sind ja Makros aktiviert, sonst könntest Du keine Makros ausführen.
Zu a
https://www.herber.de/forum/messages/1013410.html
funktioniert auch unter Office 2007
zu b)
1.
entweder du versuchst es über eine neue Excelinstants wo durch die Sicherheitseinstellung alle Makros deaktiviert sind. (habe ich noch nie getestet, könnte sein dass es nicht funktioniert)
2. Events solange auf False stehen lassen bis die Dateien abgearbeitet sind, somit sollten auch keine Makros automatisch gestartet werden.
zu c)
fällt mir nichts ein, es müssten die Fehler abgefangen werden und die Err.Description in einer Textdatei oder String Variable gespeichert werden. (zumindest ist es sehr aufwendig)
zu d) u. e)
ein Beispiel
Dim objDatei As Workbook
Dim A As Integer
Dim boDat As Boolean
Set objDatei = Workbooks.Open("C:\Test.xls")

With objDatei
    For A = 1 To .Sheets.Count
     If .Sheets(A).Name = "xyz" Then
      boDat = True
      Exit For
     End If
    Next A
    'sonstige abfragen 
    
    If boDat = True Then _
    MsgBox "Tabelle xyz vorhanden in Datei" & Chr(13) & _
    .Name & " vorhanden" 'oder sonstwas damit machen 
    .Close False 'schließen 
End With


Im Großen und Ganzen würde ich sagen, dass du ein recht aufwendiges Projekt vor Dir hasst. Am besten gehst Du Schritt für Schritt vor und einzelne Fragen im Forum stellst, bei denen Du nicht wieder kommst.
Gruß Tino

Anzeige
AW: viel Spaß dabei!
06.10.2008 17:56:55
Reinhard
Hallo Tino,
der Betreff stimmt, seit Tagen habe ich viel Spass damit *wildrumfluch* :-))
Für Interessierte, die Kernanfrage steht weiter unten fett gedruckt.
:::Ich verstehe zwar immer noch nicht warum bei Excel2000 die Makrosicherheitseinstellung auf "Hoch"…
das war mein Versuch, die Ausführung von Makros bei Mappenöffnung zu verhindern.
:::Dies liegt daran, dass Deine Exceldatei die Du öffnest in der gleichen Excelinstants geöffnet wird und da :::sind ja Makros aktiviert, sonst könntest Du keine Makros ausführen.
Danke dir, jetzt weiß ich warum das mit der Makrosicherheit nicht klappte.
Zu a
https://www.herber.de/forum/messages/1013410.html
funktioniert auch unter Office 2007
Danke dir, hilft mir konkret nicht weiter, aber gut den Code gespeichert zu haben.
:::zu b)
:::1.
:::entweder du versuchst es über eine neue Excelinstants wo durch die Sicherheitseinstellung alle Makros :::deaktiviert sind. (habe ich noch nie getestet, könnte sein dass es nicht funktioniert)
Auch ohne Test, fällt mir dazu erstmal nur ein, man könnte Excel2000 doppelt installieren (falls das überhaupt problemlos geht) in einem die Sicherheit auf Hoch setzen und dann im anderen Excel das "gesicherte" Excel mittel Shell starten und darin die anderen Dateien öffnen.
Aber das hat jetzt keinerlei priorität.
:::2. Events solange auf False stehen lassen bis die Dateien abgearbeitet sind, somit sollten auch keine :::Makros automatisch gestartet werden.
So wie ich da noch den Überblick habe, hat das ja auch bei den meisten Dateien gut geklappt. Aber einige Dateien sind speziell, es sind in xls umbenannte xla-dateien und was weiß ich. Alles Dateien in denen ich mal Vba-Dinge aller Art probierte.
Und da lassen sich wohl einige Dateien nicht durch EnableEvents = false zügeln, denn nach Durchlauf des Makros, was nur die Dateien öffnete und wieder schloß, hatte ich anschließend mitten im Blatt eine selbst erstellte Symbolleiste mehr, andere Symbolleisten waren verschwunden usw.
Alles nix schlimmes weil ich ja nix für mich programmiert habe was richtigen Schaden anrichtet. Dazu kamen noch einige Dateien die wohl in sich marode sind, denn beim Öffnen kam gleich ein schwerwiegender Fehler.
Zur Fehlersuche kommt sehr sehr erschwerend dazu, ScreenUpdating=False kann ich nicht benutzen, denn die datei die das makro enthält was die anderen öffnet verschwindet dann immer sang und klanglos.
Also muß ich auf ScreenUpdating=False verzichten und bei 900 Dateien im Verzeichnis dauert das halt und ich entferne dann Zug um Zug Dateien die Probleme machen.
Das gilt jetzt für mein Verzeichnis H:\, immerhin läuft das jetzt schon bis zur Datei 450/900 *schätz*.
Im Verzeichnis C:\ ist es noch schlimmer, da sind zwar nur 400 dateien, aber warum auch immer hängt sich da "Excecute" von Filesearch auf ohne jeden Hinweis darauf, an welcher Datei das liegt. Um da mit Dateien in andere Laufwerke zu verschieben herauszubekommen wodran das liegt, das kann noch dauern.
zu c)
fällt mir nichts ein, es müssten die Fehler abgefangen werden und die Err.Description in einer Textdatei oder String Variable gespeichert werden. (zumindest ist es sehr aufwendig)
ja.
zu d) u. e)
Danke für das Beispiel, aber inzwischen geht es mir längst nur noch um Eins, ich möchte als Wunsch Code haben, der einen beliebigen Ordner samt Unterordnern nach Exceldateien durchsucht, all diese Dateien öffnet und wieder schließt und zwar ohne daß durch diese Dateien irgendwelche Makros angeregt wurden und sollten beim Öffnen dieser Dateien Fehler auftreten dies vermerkt wird, aber der Code unbeirrt weiterläuft.
:::Im Großen und Ganzen würde ich sagen, dass du ein recht aufwendiges Projekt vor Dir hasst.
jepp, und "hasst" passt irgendwie :-)
:::Am besten gehst Du Schritt für Schritt vor und einzelne Fragen im Forum stellst, bei denen Du nicht wieder kommst
Richtig, werde ich machen. Bin ja genauso, wenn ich hier eine Anfrage aufmache um zu schauen ob ich da vielleicht helfen kann und es ist da so langer Text wie hier bei meiner Anfrage,dann mache ich vor Schreck erstmal wieder den Beitrag zu :-)
Gruß
Reinhard
Anzeige
Noch offen o.w.T.
06.10.2008 17:57:00
Reinhard


AW: Noch offen o.w.T.
06.10.2008 19:08:00
Tino
Hallo,
habe hier mal etwas zusammengestellt, versprechen kann ich dir aber nichts.
Was mir noch etwas Kopfzerbrechen macht, was ist wenn Excel bei einer Datei eine Meldung bringt?
Eventuell kann es sein, dass die Datei über ein Externes Script geöffnet werden muss damit der Code weiterarbeitet.
Leider habe ich keine Dateien die solch einen Fehler verursachen.
Lege Dir zwei Module an und kopiere die Zeilen entsprechend rein,
gestartet wird über die Sub „LeseDateien“
Modul Modul_Such_Funktion
Option Explicit 
Option Private Module 
  
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 
Private Declare Function FindClose Lib "kernel32" ( _
    ByVal hFindFile As Long) As Long 
  
Private Enum FILE_ATTRIBUTE 
    FILE_ATTRIBUTE_READONLY = &H1 
    FILE_ATTRIBUTE_HIDDEN = &H2 
    FILE_ATTRIBUTE_SYSTEM = &H4 
    FILE_ATTRIBUTE_DIRECTORY = &H10 
    FILE_ATTRIBUTE_ARCHIVE = &H20 
    FILE_ATTRIBUTE_NORMAL = &H80 
    FILE_ATTRIBUTE_TEMPORARY = &H100 
End Enum 
  
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 
    ftCreationTime As FILETIME 
    ftLastAccessTime As FILETIME 
    ftLastWriteTime As FILETIME 
    nFileSizeHigh As Long 
    nFileSizeLow As Long 
    dwReserved0 As Long 
    dwReserved1 As Long 
    cFileName As String * MAX_PATH 
    cAlternate As String * 14 
End Type 
  
Private Declare Function MoveWindow Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal bRepaint As Long) As Long 
Private Declare Function GetSystemMetrics Lib "user32.dll" ( _
    ByVal nIndex As Long) As Long 
Private Declare Function GetWindowRect Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByRef lpRect As RECT) As Long 
Private Declare Function SHBrowseForFolder Lib "shell32" ( _
    lpbi As InfoT) As Long 
Private Declare Function CoTaskMemFree Lib "ole32" ( _
    ByVal hMem As Long) As Long 
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" ( _
    ByVal lpStr1 As String, _
    ByVal lpStr2 As String) As Long 
Private Declare Function SHGetPathFromIDList Lib "shell32" ( _
    ByVal pList As Long, _
    ByVal lpBuffer As String) As Long 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassname As String, _
    ByVal lpWindowName As String) As Long 
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal Msg As Long, _
    wParam As Any, _
    lParam As Any) As Long 
  
Private Type InfoT 
    hwnd As Long 
    Root As Long 
    DisplayName As Long 
    Title As Long 
    Flags As Long 
    FName As Long 
    lParam As Long 
    Image As Long 
End Type 
  
Private Type RECT 
    Left As Long 
    Top As Long 
    Right As Long 
    Bottom As Long 
End Type 
  
Public Enum BIF_Flag 
    BIF_RETURNONLYFSDIRS = &H1 
    BIF_DONTGOBELOWDOMAIN = &H2 
    BIF_STATUSTEXT = &H4 
    BIF_RETURNFSANCESTORS = &H8 
    BIF_EDITBOX = &H10 
    BIF_VALIDATE = &H20 
    BIF_NEWDIALOGSTYLE = &H40 
    BIF_BROWSEINCLUDEURLS = &H80 
    BIF_BROWSEFORCOMPUTER = &H1000 
    BIF_BROWSEFORPRINTER = &H2000 
    BIF_BROWSEINCLUDEFILES = &H4000 
    BIF_SHAREABLE = &H8000 
End Enum 
  
Private Const SM_CXFULLSCREEN = &H10 
Private Const SM_CYFULLSCREEN = &H11 
  
Private Const BFFM_SETSELECTION = &H466 
Private Const BFFM_INITIALIZED = &H1 
  
Private s_BrowseInitDir As String 
Public strDateien() As String 
Public Function fncGetFolder( _
        Optional ByVal sMsg As String = "Bitte wählen Sie ein Verzeichnis", _
        Optional ByVal lFlag As BIF_Flag = BIF_RETURNONLYFSDIRS, _
        Optional ByVal sPath As String = "C:\") As String 
    Dim xl As InfoT, IDList As Long, RVal As Long, FolderName As String 
    s_BrowseInitDir = sPath 
    With xl 
        .hwnd = FindWindow("XLMAIN", vbNullString) 
        .Root = 0 
        .Title = lstrcat(sMsg, "") 
        .Flags = lFlag 
        .FName = FuncCallback(AddressOf BrowseCallback) 
    End With 
    IDList = SHBrowseForFolder(xl) 
    If IDList <> 0 Then 
        FolderName = Space(256) 
        RVal = SHGetPathFromIDList(IDList, FolderName) 
        CoTaskMemFree (IDList) 
        FolderName = Trim$(FolderName) 
        FolderName = Left$(FolderName, Len(FolderName) - 1) 
    End If 
    fncGetFolder = FolderName 
End Function 
  
Private Function BrowseCallback( _
        ByVal hwnd As Long, _
        ByVal uMsg As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long 
    If uMsg = BFFM_INITIALIZED Then 
        Call SendMessage(hwnd, BFFM_SETSELECTION, ByVal 1&, ByVal s_BrowseInitDir) 
        Call CenterDialog(hwnd) 
    End If 
    BrowseCallback = 0 
End Function 
  
Private Function FuncCallback(ByVal nParam As Long) As Long 
    FuncCallback = nParam 
End Function 
  
Private Sub CenterDialog(ByVal hwnd As Long) 
    Dim WinRect As RECT, ScrWidth As Integer, ScrHeight As Integer 
    Dim DlgWidth As Integer, DlgHeight As Integer 
    GetWindowRect hwnd, WinRect 
    DlgWidth = WinRect.Right - WinRect.Left 
    DlgHeight = WinRect.Bottom - WinRect.Top 
    ScrWidth = GetSystemMetrics(SM_CXFULLSCREEN) 
    ScrHeight = GetSystemMetrics(SM_CYFULLSCREEN) 
    MoveWindow hwnd, (ScrWidth - DlgWidth) / 2, _
        (ScrHeight - DlgHeight) / 2, DlgWidth, DlgHeight, 1 
End Sub 
  
Sub FindFiles(ByVal strFolderPath As String, ByVal strSearch As String, _
        ByRef lngFilecount As Long, Optional Subfolder As Boolean = True) 
    Dim WFD As WIN32_FIND_DATA, lngSearch As Long, strDirName As String 
    lngSearch = FindFirstFile(strFolderPath & "*.*", WFD) 
    If lngSearch <> INVALID_HANDLE_VALUE Then 
        GetFilesInFolder strFolderPath, strSearch, lngFilecount 
        Do 
            If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) Then 
                strDirName = Left$(WFD.cFileName, InStr(WFD.cFileName, Chr(0)) - 1) 
                If Subfolder = False Then Exit Sub 'ohne Unterordner 
                If (strDirName <> ".") And (strDirName <> "..") Then _
                    FindFiles strFolderPath & strDirName & "\", strSearch, lngFilecount 
            End If 
        Loop While FindNextFile(lngSearch, WFD) 
        FindClose lngSearch 
    End If 
End Sub 
  
Sub GetFilesInFolder(ByVal strFolderPath As String, ByVal strSearch As String, _
        ByRef lngFilecount As Long) 
    Dim WFD As WIN32_FIND_DATA, lngSearch As Long, strFileName As String 
    lngSearch = FindFirstFile(strFolderPath & strSearch, WFD) 
    If lngSearch <> INVALID_HANDLE_VALUE Then 
        Do 
            If (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) <> _
                FILE_ATTRIBUTE_DIRECTORY Then 
                strFileName = Left$(WFD.cFileName, InStr(WFD.cFileName, Chr(0)) - 1) 
                 Redim Preserve strDateien(lngFilecount) 
                    strDateien(lngFilecount) = strFolderPath & strFileName 
                    lngFilecount = lngFilecount + 1 
            End If 
        Loop While FindNextFile(lngSearch, WFD) 
        FindClose lngSearch 
    End If 
End Sub 
 Sub SucheDateien(Optional strSearch As String = "*", Optional Subfolder As Boolean = False) 
    Dim myFileSystemObject As Object, myDrive As Object 
    Dim lngFilecount As Long 
    Dim strFolder As String 
    Dim Pfad As String 
      
    strFolder = Trim$(fncGetFolder(sPath:="C:\")) 
    If strFolder <> "" Then 
        If Right$(strFolder, 1) <> "\" Then strFolder = strFolder & "\" 
        Application.ScreenUpdating = False 
        FindFiles strFolder, strSearch, lngFilecount, Subfolder 
    End If 
End Sub 
 
 

Modul Modul_1_Start

Option Explicit 
 
Sub LeseDateien() 
Dim a As Long 
Dim strFehler As String 
Dim strTempFehler() As String 
 
Cells.Clear 
Call SucheDateien("*.xls", True) 
 
    For a = Lbound(strDateien) To Ubound(strDateien) 
     strFehler = VersucheDateiZuöffnen(strDateien(a)) 
            If strFehler <> "" Then 
             strTempFehler = Split(strFehler, "<;>") 
             strFehler = strTempFehler(0) 
             Cells(a + 1, 1).AddComment (strTempFehler(1)) 
            Else 
             strFehler = "Ok." 
            End If 
        Cells(a + 1, 1) = strFehler 
     Cells(a + 1, 2) = strDateien(a) 
    strFehler = "" 
    Erase strTempFehler 
    Next a 
 Cells.Columns.AutoFit 
  
  
 Erase strDateien 
 
End Sub 
 
Function VersucheDateiZuöffnen(strDatei As String) As String 
On Error GoTo meError 
Dim myXL_Application As Object 
    Set myXL_Application = CreateObject(Class:="Excel.Application") 
With myXL_Application 
     
    .Visible = True 
    .Application.EnableEvents = False 
    .Workbooks.Open strDatei, False 
    .ActiveSheet.Range("A1").Select 
    .Application.DisplayAlerts = False 
    .Quit 
Set myXL_Application = Nothing 
 
meError: 
If Err.Number <> 0 Then VersucheDateiZuöffnen = Err.Number & "<;>" & Err.Description 
    On Error Resume Next 
    .Application.DisplayAlerts = False 
    .Quit 
        Set myXL_Application = Nothing 
    On Error GoTo 0 
End With 
End Function 


Gruß Tino

Anzeige

42 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige