alexander01
Goto Top

Erbitte Hilfe bei VBA-Script in Excel-Datei

Ich bitte um Hilfe bei der Anpassung eines VBA-Scriptes in einer Excel-Datei:
Aktueller Stand:
nach Klick auf eine Schaltfläche (Command_Button2)werden in einem Excel-Arbeitsblatt alle Dateien eines Verzeichnisses aufgelistet.
Nach Klick auf eine zweite Schaltfläche (Command_Button3) werden alle diese einzelnen Excel-Dateien hinsichtlich ihrer Daten nach bestimmten Parametern untersucht.
Nur ein gewisser Anteil der Dateien ist für die Verarbeitung relevant, ein Großteil uninteressant.
Alle Excel-Dateien enthalten eine Checkbox, ist diese aktiv (markiert), handelt es sich um aktive, zu untersuchende Dateien.

Da es zwischenzeitlich viele Dateien (etwa 500) geworden sind, ist die Auflistung / Ausgabe der Parameter sehr unübersichtlich geworden.

Ich würde mich freuen, wenn es gelingt, nur die Dateien aufzulisten, in denen die CheckBox markiert ist. Diese Dateien sollen aufgelistet und nachfolgend nach bestimmten Kriterien untersucht werden. Dies grenzt die Liste der Dateien von ca. 500 auf ca. 50 ein.

Theoretisch würde mir auch eine Befehlsschaltfläche reichen, derzeit sind es drei (die dritte löscht alle Zellinhalte)

das aktuelle Script:

Option Explicit
Option Compare Text

Private Const XlsPath = "K:\Ausweise\"           'Dateipfad: Xls-Dateien  
Private Const LogFile = "K:\Ausweise\Err.Log"    'Dateipfad: Log-Datei  

Private Const CellsCheckBox = "Z10"                     'Zelladresse: CheckBox-Status  
Private Const CellsLastDate = "Z11"                     'Zelladresse: Letztes Datum  

Private Const RowStart = 6

Private Const ColName = 1
Private Const ColSize = 2
Private Const ColDate = 3
Private Const ColAttr = 4
Private Const ColOpenDate = 5
Private Const ColOpenDays = 6
Private Const ColCheckBox = 7

Private Const MaxDays = 40

Private Sub CommandButton2_Click()
    Dim objFile As Object, intRowNext As Long, valCheckBox As Variant
    
    With Cells(RowStart, ColName).Resize(UsedRange.Rows.Count, ColOpenDays)
        .ClearContents
        .Interior.ColorIndex = xlNone
    End With
    
    intRowNext = RowStart
    
    For Each objFile In CreateObject("Scripting.FileSystemObject").GetFolder(XlsPath).Files  
        If objFile.Name Like "*.xls" Then  
            With objFile
                Cells(intRowNext, ColName).Value = .Name
                Cells(intRowNext, ColSize).Value = .Size / 1024
                Cells(intRowNext, ColDate).Value = .DateCreated
                Cells(intRowNext, ColAttr).Value = GetFileAttributes(.Attributes)
            End With
            intRowNext = intRowNext + 1
        End If
    Next
End Sub

Private Sub CommandButton3_Click()
    Dim objCells As Range, strTarget As String, valCheckBox As Variant
    Dim dblDate As Date, intRowEnd As Long, intDays As Long
    
    If Cells(RowStart, ColName).text <> "" Then  
        'Letzte Zeile ermitteln  
        intRowEnd = Cells(Rows.Count, ColName).End(xlUp).Row
        
        'Alle farbliche Markierungen löschen  
        Range(Cells(RowStart, ColName), Cells(intRowEnd, ColOpenDays)).Interior.ColorIndex = xlNone
        
        'Alle Inhalte in den Spalten E:G löschen  
        Range(Cells(RowStart, ColOpenDate), Cells(intRowEnd, ColCheckBox)).ClearContents
        
        'Alle Dateien durchlaufen und auswerten  
        For Each objCells In Range(Cells(RowStart, ColName), Cells(intRowEnd, ColName))
            'Test ob Datei existiert  
            If Dir(XlsPath & objCells.Value) <> "" Then  
                strTarget = "'" & XlsPath & "[" & objCells.Value & "]Datenblatt'!"  
                
                valCheckBox = ExecuteExcel4Macro(strTarget & Range(CellsCheckBox).Address(, , xlR1C1))
                
                'Test CheckBox auf gültigen Wert True/False  
                If valCheckBox = True Then
                    dblDate = ExecuteExcel4Macro(strTarget & Range(CellsLastDate).Address(, , xlR1C1))
                    intDays = Date - dblDate

                    With Rows(objCells.Row)
                        .Columns(ColOpenDate).Value = dblDate
                        .Columns(ColOpenDays).Value = intDays
                        .Columns(ColCheckBox).Value = valCheckBox
    
                        If intDays > MaxDays Then
                            .Columns(ColName).Interior.ColorIndex = 3
                            .Columns(ColOpenDays).Interior.ColorIndex = 3
                        End If
                    End With
                ElseIf valCheckBox <> False Then
                    Cells(objCells.Row, ColName).Resize(1, ColOpenDays).Interior.ColorIndex = 3
                End If
            Else
                Cells(objCells.Row, ColName).Resize(1, ColOpenDays).Interior.ColorIndex = 3
            End If
        Next
        
        MsgBox "Fertig!", vbInformation  
    End If
End Sub

Private Function GetFileAttributes(intAttributes As Long) As String
    Dim arrAttr As Variant, i As Integer
    
    arrAttr = Array(vbReadOnly, "R", vbHidden, "H", vbSystem, "S", vbDirectory, "D", vbArchive, "A")  
    
    GetFileAttributes = "-----"  
    
    For i = 0 To UBound(arrAttr) Step 2
        If arrAttr(i) And intAttributes Then
            Mid(GetFileAttributes, i / 2 + 1, 1) = arrAttr(i + 1)
        End If
    Next
End Function
Private Sub CommandButton4_Click()
' Programm verlassen, auf 1. Worksheet alles löschen  
Dim lz3, lz4, m, n As Integer
lz3 = Worksheets("Check").Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row  
For m = 6 To lz3
For n = 1 To 7
Worksheets("Check").Cells(m, n) = ""  
Worksheets("Check").Cells(m, n).Interior.ColorIndex = 0  
Next n
Next m

Worksheets("Prüf-Protokoll").Unprotect Password:="xyz"  
lz4 = Worksheets("Prüf-Protokoll").Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row  
Worksheets("Prüf-Protokoll").Cells(lz4 + 1, 1).Value = Date  
Worksheets("Prüf-Protokoll").Cells(lz4 + 1, 2).Value = Time  
Worksheets("Prüf-Protokoll").Protect Password:="xyz"  

ThisWorkbook.Close SaveChanges:=True
With Application
.DisplayAlerts = False
.Quit
End With
End Sub
Kommentar vom Moderator tomolpi am Apr 14, 2020 um 20:44:22 Uhr
Codetags hinzugefügt

Content-Key: 564826

Url: https://administrator.de/contentid/564826

Printed on: April 26, 2024 at 07:04 o'clock

Member: beidermachtvongreyscull
beidermachtvongreyscull Apr 15, 2020 at 03:38:18 (UTC)
Goto Top
Moin,

Ich will nicht sagen, dass es unmöglich ist, aber ich befürchte, dass der Code dann einiges zu tun haben wird.

So hab ich Dich verstanden:

Es soll eine Dateiauswahl gefiltert werden, bei der nur Dateien angezeigt werden, die eine aktive Checkbox haben.

Das bedeutet, dass Excel alle Dateien erstmal öffnen muss, um nach diesem Kriterium zu suchen und dann die Liste aufbereitet.

"Looping through Files"

Ist es das, was Du willst?
Member: alexander01
alexander01 Apr 15, 2020 at 04:07:26 (UTC)
Goto Top
ja.

im Zuge des Öffnens kann dabei (bei aktivierter CheckBox) natürlich gleich nach den parametern untersucht werden.
Im prinzip muß, denke ich, der vorhandene Code nur angepaßt werden. Hier fehlt mir das fachwissen.
Gruß
Alexander
Member: monstermania
monstermania Apr 15, 2020 at 07:14:21 (UTC)
Goto Top
Die Idee, alle Excel-Dateien zu öffnen und nach der aktivierten Checkbox zu prüfen ist m.E. eine ganz schlechte Idee!
Bei solchen "Bandwurm-Aktionen" hängt sich Excel auch gern mal weg.

Es muss doch ein anderes Kriterium geben, nach dem geprüft werden kann (z.B. Datum der letzten Dateiänderung).

Gruß
Dirk
Member: beidermachtvongreyscull
beidermachtvongreyscull Apr 15, 2020 at 10:15:04 (UTC)
Goto Top
Was machbar wäre:

Du kannst die Form um ein Listenfeld erweitern, dann einen Command-Button einführen, der bei Click ein Verzeichnis durchläuft und
Dateien mit entsprechendem Kriterium, deren Name und Pfad in ein Array aufnimmt und damit die Listbox befüllt.

Dann haben die User ein visuelles Feedback.

Der übrige Code muss dann mit den gefundenen Daten arbeiten.

Ich halte das für möglich, ist aber zum einen nicht ganz so einfach in der Umsetzung und zusätzlich würder der "Loop through Files" beim ersten Mal recht lange dauern, denn Excel muss jede Datei öffnen, um die Checkbox zu prüfen und danach die gefundenen erneut.