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

@ Sepp: Hilfe!

@ Sepp: Hilfe!
Claudia
Hallo Sepp,
darf ich noch mal auf Deine Hilfe zurückgreifen?
Ich habe folgendes Problem. Ich habe seinerzeit in einer Datei ein Makro hinterlegt, dummerweise weiß ich aber nicht mehr in welcher Datei.
Jetzt wäre die Frage, ob man (Du ?) per VBA alle Excel-Dateien eines Ordners (incl. der Unterordner) auslesen und die dort enthaltenen Makros mit dem entsprechenden Namen auflisten könnte?
Ich hatte mir das so vorgestellt, dass ich Zelle A1 den auszulesenden Ordner angebe und dann wird jede Datei mit den Makros aufgelistet:
Zeile A3 = Name Datei 1
Zeile B3 = gesamter Pfad
Zeile A4 und folgende = Name der Makros
dann LeerZeile und dann die nächste Datei.
Hast Du sowas vielleicht schon einmal gemacht oder hättest Du Lust, mir zu helfen? Ich nehme es Dir auch auch ncht übel, wenn Du keine Lust hast.
Vielen vielen Dank!
Liebe Grüße
Claudia

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: @ Sepp: Hilfe!
18.06.2011 17:57:59
Claudia
Hallo Sepp,
irgenndwie passiert es gar nicht, dann öffnet sich eine Excel-Datei aus dem Ordner und dann passiert gar nichts mehr.
Kann es evtl. an der Länge des Ordner incl. Dateiname liegen?
Liebe Grüße
Claudia
Anzeige
AW: @ Sepp: Hilfe!
18.06.2011 18:03:01
Claudia
Passiert auch bei kleinen Ordnernamen.
Also es öffnet sich die erste Excel-Datei und dann bleibt das Makro stehen. Es wird nichts in Deine Datei geschrieben.
AW: @ Sepp: Hilfe!
18.06.2011 18:41:27
Josef

Hallo Claudia,
unter den Makrooptionen musst du den Zugriff auf das VBA-Projekt gestatten.
https://www.herber.de/bbs/user/75341.xls

« Gruß Sepp »

Anzeige
AW: @ Sepp: Hilfe!
18.06.2011 18:59:21
robert
Hallo Sepp,
nach dieser Zeile
If objWB.HasVBProject Then
geht er auf Fehler, VBA Zugriff ist erlaubt.
?
Gruß
robert
AW: @ Sepp: Hilfe!
18.06.2011 19:05:29
Claudia
Hallo Sepp,
wo mache ich das denn?
Habe unter Makros - Sicherheit - vertrauenswürdige Herausgeber - Zugriff auf Visiual Basic Projekt vertrauen ein Häckchen gesetzt und dann gespeichert.
Aber es passiert das gleiche wie vorher. Vermutlich habe ich was falsch gemacht?!?
AW: @ Sepp: Hilfe!
18.06.2011 19:07:53
Josef

Hallo Claudia,
genau so macht man das.
Kann es unter xl2003 nicht testen, unter xl2007 läuft der Code einwandfrei.

« Gruß Sepp »

Anzeige
AW: @ Sepp: Hilfe!
18.06.2011 19:25:04
Nepumuk
Hallo Sepp,
die HasVBProject-Property gibt es erst ab Excel 2007.
Gruß
Nepumuk
AW: @ Sepp: Hilfe!
18.06.2011 23:11:45
Claudia
Hallo Sepp,
dann klappt das wohn nicht. Ich habe leider nur Excel 2003.
Oder hast Du da noch eine Chance?
Liebe Grüße
Claudia
AW: @ Sepp: Hilfe!
19.06.2011 00:57:00
Nepumuk
Hallo,
versuch es mal so:
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Sub Macroliste()
    
    Dim objVBC As Object, objWorkbook As Workbook, objSheet As Worksheet
    Dim strMacroname As String, strTemp As String
    Dim lngLine As Long, lngFileCount As Long, lngRow As Long
    Dim blnMakroFound As Boolean
    
    Set objSheet = ActiveSheet
    
    lngRow = 3
    
    On Error Resume Next
    
    With Application
        
        .ScreenUpdating = False
        .EnableEvents = False
        .ShowWindowsInTaskbar = False
        .DisplayAlerts = False
        .Calculation = xlCalculationManual
        
        strTemp = objSheet.Cells(1, 1).Value
        objSheet.Cells.Clear
        objSheet.Cells(1, 1).Value = strTemp
        
        With .FileSearch
            
            .NewSearch
            .Filename = "*.xls"
            .LookIn = objSheet.Cells(1, 1).Value
            .SearchSubFolders = True
            .Execute
            
            For lngFileCount = 1 To .FoundFiles.Count
                
                lngRow = lngRow + 1
                objSheet.Cells(lngRow, 1).Value = Dir$(.FoundFiles(lngFileCount))
                objSheet.Cells(lngRow, 1).Font.Bold = True
                objSheet.Cells(lngRow, 2).Value = .FoundFiles(lngFileCount)
                
                Set objWorkbook = Workbooks.Open(Filename:=.FoundFiles(lngFileCount), _
                    UpdateLinks:=0, ReadOnly:=True, Password:="", WriteResPassword:="")
                
                If Err.Number <> 0 Then
                    
                    lngRow = lngRow + 1
                    objSheet.Cells(lngRow, 1).Value = "Die Mappe ist Kennwortgeschützt"
                    Err.Clear
                    
                Else
                    
                    Err.Clear
                    
                    blnMakroFound = False
                    
                    If Not objWorkbook.VBProject.Protection Then
                        
                        For Each objVBC In objWorkbook.VBProject.VBComponents
                            
                            With objVBC.CodeModule
                                
                                strMacroname = ""
                                
                                For lngLine = 1 To .CountOfLines
                                    
                                    If .ProcOfLine(lngLine, 0) <> strMacroname Then
                                        
                                        strMacroname = .ProcOfLine(lngLine, 0)
                                        lngRow = lngRow + 1
                                        objSheet.Cells(lngRow, 1).Value = strMacroname
                                        
                                        blnMakroFound = True
                                        
                                    End If
                                Next
                            End With
                        Next
                        
                        If Not blnMakroFound Then
                            
                            lngRow = lngRow + 1
                            objSheet.Cells(lngRow, 1).Value = "Keine Makros gefunden"
                            
                        End If
                        
                    Else
                        
                        lngRow = lngRow + 1
                        objSheet.Cells(lngRow, 1).Value = "Das VBA-Projekt ist Kennwortgeschützt"
                        
                    End If
                End If
                
                objWorkbook.Close SaveChanges:=False
                
                lngRow = lngRow + 1
                
            Next
        End With
        
        objSheet.Columns.AutoFit
        
        .ScreenUpdating = True
        .EnableEvents = True
        .ShowWindowsInTaskbar = True
        .DisplayAlerts = True
        .Calculation = xlCalculationAutomatic
        
    End With
    
    Set objVBC = Nothing
    Set objWorkbook = Nothing
    Set objSheet = Nothing
    
End Sub

Gruß
Nepumuk
Anzeige
AW: @ Sepp: Hilfe!
19.06.2011 10:22:03
Josef

Hallo Max,
danke für den Hinweis, das es diese Eigenschaft erst ab xl2007 existiert, hatte ich irgendwie "verdrängt" ;-))

« Gruß Sepp »

Noch zwei Bitten
19.06.2011 14:07:18
Claudia
Hallo Ihr zwei,
vielen vielen Dank für Euer Gemeinschaftswerk. Es funktioniert und Ihr habt mir damit sehr weiter geholfen.
Zwei Bitten hätte ich noch. Bei einigen Dateien wird Worksheet_Change mehrfach ausgelesen (bei einer waren es mehr als 50 Einträge). Wäre es machbar, wenn man Worksheet_Change auf einen Eintrag pro Datei reduzieren könnte?
Könnte man neben dem Makro rechts in Spalte B auch immer noch den gesamten Pfad reinschreiben? Ich hatte es zwar nur in ersten Zeile neben dem Dateinamen gewollt, aber wenn es so viele Makros sind, dann muss man immer scrollen um zu schauen, welche Datei das nun ist.
Nochmals vielen vielen Dank!
Liebe Grüße
Claudia
Anzeige
AW: Noch zwei Bitten
19.06.2011 15:10:03
Nepumuk
Hallo,
wo hast du denn die ganzen Makros her, wenn du so eine kleine Anpassung nicht gebacken bekommst?
Copy & Paste ? ;-)
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Sub Macroliste()
    
    Dim objVBC As Object, objDIC As Object
    Dim objWorkbook As Workbook, objSheet As Worksheet
    Dim strMacroname As String, strTemp As String
    Dim strPath As String
    Dim lngLine As Long, lngFileCount As Long, lngRow As Long
    Dim blnMakroFound As Boolean
    
    Set objSheet = ActiveSheet
    Set objDIC = CreateObject("Scripting.Dictionary")
    
    lngRow = 3
    
    On Error Resume Next
    
    With Application
        
        .ScreenUpdating = False
        .EnableEvents = False
        .ShowWindowsInTaskbar = False
        .DisplayAlerts = False
        .Calculation = xlCalculationManual
        
        strTemp = objSheet.Cells(1, 1).Value
        objSheet.Cells.Clear
        objSheet.Cells(1, 1).Value = strTemp
        
        With .FileSearch
            
            .NewSearch
            .Filename = "*.xls"
            .LookIn = objSheet.Cells(1, 1).Value
            .SearchSubFolders = True
            .Execute
            
            For lngFileCount = 1 To .FoundFiles.Count
                
                strPath = .FoundFiles(lngFileCount)
                
                lngRow = lngRow + 1
                objSheet.Cells(lngRow, 1).Value = Dir$(strPath)
                objSheet.Cells(lngRow, 1).Font.Bold = True
                objSheet.Cells(lngRow, 2).Value = strPath
                
                Set objWorkbook = Workbooks.Open(Filename:=strPath, _
                    UpdateLinks:=0, ReadOnly:=True, Password:="", WriteResPassword:="")
                
                If Err.Number <> 0 Then
                    
                    lngRow = lngRow + 1
                    objSheet.Cells(lngRow, 1).Value = "Die Mappe ist Kennwortgeschützt"
                    Err.Clear
                    
                Else
                    
                    Err.Clear
                    
                    blnMakroFound = False
                    objDIC.RemoveAll
                    
                    If Not objWorkbook.VBProject.Protection Then
                        
                        For Each objVBC In objWorkbook.VBProject.VBComponents
                            
                            With objVBC.CodeModule
                                
                                strMacroname = ""
                                
                                For lngLine = 1 To .CountOfLines
                                    
                                    If .ProcOfLine(lngLine, 0) <> strMacroname Then
                                        
                                        strMacroname = .ProcOfLine(lngLine, 0)
                                        
                                        If Not objDIC.Exists(strMacroname) Then
                                            objDIC.Add strMacroname, vbNullString
                                            lngRow = lngRow + 1
                                            objSheet.Cells(lngRow, 1).Value = strMacroname
                                            objSheet.Cells(lngRow, 2).Value = strPath
                                        End If
                                        
                                        blnMakroFound = True
                                        
                                    End If
                                Next
                            End With
                        Next
                        
                        If Not blnMakroFound Then
                            
                            lngRow = lngRow + 1
                            objSheet.Cells(lngRow, 1).Value = "Keine Makros gefunden"
                            
                        End If
                        
                    Else
                        
                        lngRow = lngRow + 1
                        objSheet.Cells(lngRow, 1).Value = "Das VBA-Projekt ist Kennwortgeschützt"
                        
                    End If
                End If
                
                objWorkbook.Close SaveChanges:=False
                
                lngRow = lngRow + 1
                
            Next
        End With
        
        objSheet.Columns.AutoFit
        
        .ScreenUpdating = True
        .EnableEvents = True
        .ShowWindowsInTaskbar = True
        .DisplayAlerts = True
        .Calculation = xlCalculationAutomatic
        
    End With
    
    Set objVBC = Nothing
    Set objDIC = Nothing
    Set objWorkbook = Nothing
    Set objSheet = Nothing
    
End Sub

Gruß
Nepumuk
Anzeige
AW: Noch zwei Bitten
19.06.2011 18:58:06
Claudia
Hallo Nepumuk,
nicht so charmant. :-) Ich selbst kann nicht so toll progammieren, das einfachste klappt, den Rest suche ich mir auf der Hilfe hier aus dem Forum. Und manchmal nerve ich auch Sepp. :-)
Auf alle Fälle hast Du mir sehr geholfen!
Vielen Dankj!
Claudia

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige