hugoundertaker
Goto Top

Excelsoftwareauswertung

Hallo zusammen,

ich habe folgendes Problem:

Wir bekommen in der Firma zum Testen für ca. 1 Jahr eine neue Software eingesetzt. Nun soll darüber eine Auswertung in einer ExcelTabelle erfolgen. Die Ausgangstabelle beinhaltet ca. 20000 Zeilen. Diese Zeilen sind in Spalten "Benutzer" "Fehlercode" "Anzahl" unterteilt.
Also z.B. "MüllerRaum1" "10" "5", "MeierRaum1" "0" "50", "SchmidtRaum3" "2" "1" usw. Diese Zeile wird jedesmal bei der Anmeldung erzeugt. Am Ende der Tabelle kommt außerdem eine ca. 10 Zeilen lange Legende. Dieses pro Tag.
Nun soll ich am nächsten Tag eine Auswertung in einer extra Tabelle machen, wo zum einen halt pro Benutzer der Fehler und die Anzahl jeweils als Gesamtsumme erscheint und der prozentuale Wert zur Anzahl der Gesamtanzahl aller Anmeldungen. Dabei gibt es noch das Problem, das es eine Benutzer "TestPC" gibt, der einen speziellen Fehlercode "33" produziert. Dieser Benutzer darf in der Einzelübersicht mit dem Fehlercode "33" nicht erscheinen. Außerdem sollen alle Anmeldungen mit dem Fehlercode "0" (fehlerfrei) von allen Benutzern in der Auswertung pro Benutzer nicht erscheinen. Die Anzahl von der Anmeldung von allen Benutzern(auch "TestPC") mit Fehlercode "0" muss aber mit in der Gesamtsumme aller Anmeldugen mitgezählt werden, der Fehlercode "33" vom Benutzer "TestPC" darf aber nicht mitgezählt werden.
Außerdem muss sich die Tabelle und die Formeln dynamisch der Ausgangstabelle anpassen können, weil es zum einen immer wieder weitere Benutzer geben wird und auch weitere Fehlercodes auftreten können.
Die Legende, die unten dran hängt, kann für die Auswertungstabelle wegfallen.
Also am Ende soll es ungefähr so aussehen:
Benutzer Code Anzahl Prozent
MüllerRaum1 10 30 2%
MeierRaum1 11 10 1%

Gesamtanmeldungen 10000

Danke schonmal.

Hugo

Content-ID: 189410

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

76109
76109 11.08.2012, aktualisiert am 17.08.2012 um 11:16:42 Uhr
Goto Top
Hallo Hugo!

Sollte in etwa so gehen:
Option Explicit
Option Compare Text

Private Const ExternPath = "E:\Test\Ausgabe.xls"                    'Pfad der Ausgabedatei  

Private Const HeaderLine = "Benutzer;Fehlercode;Anzahl;Prozent"     'Überschrift Zeile 1  
Private Const StartLine = 2                                         'Daten ab Zeile 2  

Private Const ErrMsg1 = "Die Ausgabedatei nicht gefunden!"  
Private Const ErrMsg2 = "Die Ausgabedatei kann nicht geöffnet werden!"  

Sub GetExternData()
    Dim oFso As Object, oWkb As Workbook, oWks As Worksheet, oUserList As Object, oKey As Variant
    Dim aValues As Variant, sUserCode As String, iNextLine As Long, iCount As Long, i As Long
    
    'Externe FileSystem-Funktionen einbinden  
    Set oFso = CreateObject("Scripting.FileSystemObject")  
    
    'Prüfen ob die Ausgabedatei existiert, ansonsten Fehlermeldung ausgeben und abbrechen  
    If oFso.FileExists(ExternPath) = False Then
        MsgBox ErrMsg1, vbExclamation, "Fehler...":  Exit Sub  
    End If
    
    'Fehlerbehandlung Aus  
    On Error Resume Next
    
    'Ausgabedatei öffnen und der Object-Variablen oWkb zuweisen  
    Set oWkb = Workbooks.Open(ExternPath)
    
    'Prüfen ob die Ausgabedatei geöffnet wurde, ansonsten Fehlermeldung ausgeben und abbrechen  
    If Err Then
        MsgBox ErrMsg2, vbExclamation, "Fehler...":  Exit Sub  
    End If
    
    'Fehlerbehandlung wieder Ein  
    On Error GoTo 0
    
    'Das 1.Tabellenblatt der Ausgabedatei der Object-Variablen oWks zuweisen  
    Set oWks = oWkb.Sheets(1)
    
    'Assoziatives Array zum katalogisieren der einzelnen Benutzer mit Fehlercode und Anzahl  
    Set oUserList = CreateObject("Scripting.Dictionary")  
    'Vergleichsmethode Text (Klein/Großschreibung nicht unterscheiden)  
    oUserList.CompareMode = vbTextCompare
    
    'Die erste Zeilennummer in der Ausgabedatei-Tabelle festlegen  
    iNextLine = StartLine
    
    'Alle Zeilen in der Ausgabedatei bis zur 1. Leerzeile einlesen  
    Do While oWks.Cells(iNextLine, "A").Text <> ""  
        'Aktuelle Zeile in der Ausgabedatei bearbeiten  
        With oWks.Rows(iNextLine)
            'Nur auswerten, wenn Benutzer ist nicht TestPC und Spalte B/C enthält eine Zahl (kein Text)  
            If Not .Columns("A") Like "TestPc" And IsNumeric(.Columns("B")) And IsNumeric(.Columns("C")) Then  
                'Katalog-Schlüssel (Key) = Benutzername + Fehlercode z.B. "Computer1" + "11" = "Computer1$11"  
                sUserCode = .Columns("A") & "$" & .Columns("B")  
                'Prüfen ob Benutzer schon mit dem gleichen Fehlercode schon im Katalog existiert  
                If oUserList.Exists(sUserCode) Then  'Wenn ja, dann Katalog-Item = Aktuelle Anzahl + Anzahl  
                    oUserList.Item(sUserCode) = oUserList.Item(sUserCode) + .Columns("C")  
                Else  'Wenn nein, dann Katalog-Key + Katalog-Item (Anzahl) dem Katalog hinzufügen  
                    oUserList.Add sUserCode, CInt(.Columns("C"))  
                End If
            End If
        End With
        'Nächste Zeile in Ausgabedatei festlegen  
        iNextLine = iNextLine + 1
    Loop
    
    'Ausgabedatei nach dem Einlesen wieder schließen  
    oWkb.Close False
    
    'Gesamtsumme ermitteln (iCount)  
    For Each oKey In oUserList.Keys
        iCount = iCount + oUserList.Item(oKey)
    Next
    
    'Diese Arbeitsmappe Tabelle1 aktivieren  
    ThisWorkbook.Sheets(1).Activate

    'Zell-Inhalte löschen  
    Cells.ClearContents
    
    'Überschrift in 1. Zeile schreiben (Fett, Zentriert)  
    With Range("A1").Resize(1, 4)  
        .Font.Bold = True
        .Value = Split(HeaderLine, ";")  
        .HorizontalAlignment = xlCenter
    End With
    
    'Die erste Zeilennummer in der Auswertungstabelle festlegen  
    iNextLine = StartLine
    
    'Katalog auslesen und in die Auswertungstabelle eintragen  
    For Each oKey In oUserList.Keys
        With Rows(iNextLine)  'Aktuelle Zeile  
            aValues = Split(oKey, "$")  'Katalog-Schlüssel in Benutzer und Fehlercode aufsplitten  
            If aValues(1) <> 0 Then 'Test ob Fehlercode <> 0, wenn ja dann Eintragen  
                .Columns("A") = aValues(0)                      '=Benutzername  
                .Columns("B") = aValues(1)                      '=Fehlercode  
                .Columns("C") = oUserList.Item(oKey)            '=Anzahl  
                .Columns("D").NumberFormat = "0.00%"            '=Zellformat Prozent  
                .Columns("D") = oUserList.Item(oKey) / iCount   '=Prozent  
                iNextLine = iNextLine + 1                       'Nächste Zeile in Auswertungstabelle festlegen  
            End If
        End With
    Next
    
    'Auswertungstabelle nach Benutzername sortieren  
    Columns("A:D").Sort Key1:=Range("A2"), Header:=xlYes, MatchCase:=False  
    
    'Text mit Gesamtanmeldungen in Auswertungstabelle eintragen  
    Cells(iNextLine + 1, "A") = "Gesamtanmeldungen: " & iCount  
End Sub

Gruß Dieter

[edit] Prüfung hinzugefügt, ob externe Datei existiert oder nicht geöffnet werden kann [/edit]
[edit] Noch eingefügt: Zellinhalte löschen, bevor die Daten importiert werden [/edit]
hugoundertaker
hugoundertaker 13.08.2012 um 12:18:17 Uhr
Goto Top
Hallo,
erstmal danke für das bisherige.
Aber er kommt immer auf die Fehlermeldung:
Fehler bei Kompilieren:Methode oder Datenobjekt nicht gefunden
Beim Debuggen wird in der Zeile 17
"Set oWkb = Workbooks.Open(ExternPath): Set oWks = oWkb.Sheets(1)" ".Sheets" markiert. Irgendwie finde ich aber nicht was da fehlt.

Danke schonmal.
Hugo
76109
76109 13.08.2012 aktualisiert um 12:46:59 Uhr
Goto Top
Hallo Hugo!

Da fehlt offensichtlich in Codezeile 4 Deine Pfadangabe für die Ausgabe.xlsface-wink


Gruß Dieter
hugoundertaker
hugoundertaker 13.08.2012 um 13:17:37 Uhr
Goto Top
Hallo Dieter,

tut mir leid, aber die Pfadangabe ist mit drin.
Geht trotzdem nicht.

Grüße
Hugo
76109
76109 14.08.2012 um 10:54:27 Uhr
Goto Top
Hallo Hugo!

Habe den Quellcode mal insoweit geändert, dass nun geprüft wird, ob die externe Datei existiert oder nicht geöffnet werden kann.


Gruß Dieter
hugoundertaker
hugoundertaker 15.08.2012 um 11:54:54 Uhr
Goto Top
Hallo Dieter,

tut mir leid. Läuft jetzt zwar durch tut aber nichts außer
oben in der ersten Zeile die Daten "Benutzer;Fehlercode;Anzahl;Prozent" einzufügen.
Habe das Problem wegen der Gesamtsumme durch eine Zusatztabelle selber gelöst. Bloss die Dynamik geht noch nicht. Kann man das über eine Zusatztabelle lösen? Also z.B. eine Tabelle, in der einmal eine Grundauflistung von den Benutzern mit Fehlercode steht und diese dann die Ausgangstabelle durchsucht und wenn der Wert ("Benutzer" + "Fehlercode") noch nicht vorhanden, dieses an diese Zusatztabelle anhängt und dann die Auswertung über diese Zusatztabelle läuft?

Danke.
Hugo
76109
76109 15.08.2012 um 12:44:03 Uhr
Goto Top
Hallo Hugo!

tut mir leid. Läuft jetzt zwar durch tut aber nichts außer oben in der ersten Zeile die Daten "Benutzer;Fehlercode;Anzahl;Prozent" einzufügen.
Soll wohl heißen, dass Deine Pfadangabe doch falsch war?

Wenn der Code nicht durchläuft kann das folgende Ursachen haben:
- Die Startzeile ist eine Leerzeile
- Die Einträge Benutzer, Fehlercode und Anzahl befinden sich nicht in Spalte A, B und C

Gruß Dieter
hugoundertaker
hugoundertaker 16.08.2012 um 08:56:33 Uhr
Goto Top
Morgen Dieter,

also soweit läuft es jetzt. Allerdings ist es etwas merkwürdig. Er schreib mir einmal oben in die Zeile 2, Spalte A die Gesamtsumme der Anmeldungen mit Text und Summe in ein Feld und das gleich nochmal in der letzten Zeile. Irgendwie scheint er sich in der Felder falsch zu verschieben, weil ich dann auch in der Zeile 2 bei den Prozenten aber einen Wert habe, der mir aber unten fehlt. Außerdem hat er bei einem Benutzer merkwürdiger weise zwei Fehlercodes garnicht aufgeführt.

Danke.
Hugo
76109
76109 16.08.2012 um 10:46:45 Uhr
Goto Top
Hallo Hugo!

also soweit läuft es jetzt. Allerdings ist es etwas merkwürdig. Er schreib mir einmal oben in die Zeile 2, Spalte A die Gesamtsumme der Anmeldungen mit Text und Summe in ein Feld und das gleich nochmal in der letzten Zeile. Irgendwie
Das kann ich absolut nicht nachvollziehen, zumal diese Zeile als allerletzte Anweisung nur einmal ausgeführt wird und von daher eigentlich nur am Ende stehen kann???

Habe im Code noch eine neue Codezeile in Zeile 59 eingefügt. Für alle Fälle Sheet-Inhalt löschen, bevor Daten eingelesen werden.


Gruß Dieter
hugoundertaker
hugoundertaker 16.08.2012 um 15:17:53 Uhr
Goto Top
Hallo Dieter,

ich weiß nicht was sich jetzt verbogen hat, aber es geht garnichts mehr.
Ich habe eine bereinigte Tabelle als Grundlage mit den Spalten A "Benutzer", B "Fehlercode" und C "Anzahl" in der ersten Spalte.
Die Pfadangabe stimmt jetzt auch!! Ausgabe.xls ist vorhanden.
Er schreibt nichts mehr in die Ausgabetabelle und schreibt nur noch in der Grundlagentabelle in die ersten Zeile in die jeweiligen Spalten "Benutzer" "Fehlercode" "Anzahl" und "Prozent" in Fett aber sonst tut sich garnichts mehr.
Kannst Du mal bitte Deinen Code überprüfen ob plötzlich was anders ist?

Danke.
Hugo
76109
76109 16.08.2012 aktualisiert um 15:59:08 Uhr
Goto Top
Hallo Hugo!

Hab's überprüft und bei mir funktionierts?

Wo hast Du eigentlich den Code eingefügt? In einem Modul in einer seperaten Arbeitsmappe?


Gruß Dieter
hugoundertaker
hugoundertaker 17.08.2012 um 08:37:57 Uhr
Goto Top
Morgen Dieter,

ja das war gestern doch etwas konfus bei mir. Wirklich in falscher Arbeitsmappe gewesen. Hatte mir die Vorgehensweise vom ersten funktionieren vor lauter Begeisterung nicht gemerkt.

Also es klappt wunderbar. Ganz herzlichen Dank.

Nun nur noch eine kleine Bitte:
Da ich bisher nicht ganz soviel mit Excel zu tun hatte, es jetzt
aber doch öfters mal brauche, könntest Du Deinen Code noch ein bisschen erklären. Reicht ja vielleicht schon, einfach Kommentare in die Zeilen einfügen. Dann kann ich das mir noch genauer durchlesen und auch verstehen und vielleicht auch die Informationen zukünfig verwenden.

Aber wirklich nochmals ganz herzlichen Dank.

Und ein schönes Wochenende
Hugo
76109
76109 17.08.2012 aktualisiert um 10:12:58 Uhr
Goto Top
Hallo Hugo!

Der Einfachheit halber, kannst Du die Makro-Datei auch als Vorlage (*.xlt) speichernface-wink

Gegebenenfalls könnte ich noch einen Öffnen-Dialog hinzufügen, falls sich der Dateiname der Ausgabe-Datei ändert?


Die entsprechenden Kommentare füge ich dem obigen Code noch hinzu...


Gruß und ebenfalls ein schönes Wochenende

Dieter