Merls Blog

Dieses und Jenes
Subscribe

Bestimmte Zeilen in Excel aus Txt einlesen und zählen

März 20, 2009 By: Merl Category: Code, Windows

Schon lustig wohin einen die Arbeit so treiben kann. Ich bin ja als als alter Linuxer kein Fan von VisualBasic. Da wir aber nunmal auf Vista Kisten schaffen und da M$ Office drauf ist blieb mir, um meiner Faulheit zu folgen und meine Calls in Zukunft fast automatisch zählen zu lassen, nichts weiter übrig, als mich in VBA reinzufuchsen.

Um das zu bewerkstelligen muß aus einer Fehler-Log-Datei der Inhalt in ein Excel-Sheet und alles was kein Call ist gelöscht werden. Ursprünglich war das einfach Copy&Paste und jede 2. Zeile löschen.

Dabei hat sich dann aber erwiesen, manchmal sind 1. und 2. Zeile vertauscht und manchmal steht Mist drin, also ist das Script gewachsen zu einem „Lösch alles was nicht da sein soll“. Als das Fertig war hat ein Kollege mich drauf gebracht, daß das so ja noch voll langweilig ist, weil es eigentlich nicht viel macht was man icht von Hand auch könnte .. also hab ichs noch gepimpt und jetzt list es auf Knopfdruck automatisch die Dastei ein, löscht alle Daten die entweder nicht von Heute sind (wenn das Worksheet neu ist) oder nicht dem Dateinamen des Worksheets entsprechen (z.B: 19.03.2009) und danach auch gleich noch den ganzen überflüssigen schlonz und gibt am Ende noch brav als MsgBox aus wieviel Calls ich gemacht habe.

Um euch den Source natürlich nicht vorzuenthalten bin ich nach einiger Suche auch auf ein sehr gutes WordPress Plugin gestoßen, mit dem man den Source ordentlich mit Highlighting darstellen kann: SyntaxHighlighterPlus, das auf dem SyntaxHighlighter von Alex Gorbatchev beruht, den auch WordPress.com selbst für ihre Blogs verwenden

Sub Delete_Non_Call_Row()

Set xRng = Selection ' Auswahl in Objekt setzen
del = True
I = 0 ' Zählvariable um die Zeile, die die Zelle enthält nachher auch löschen zu können

For xRowCounter = 1 To xRng.Rows.Count
For xCellCounter = 1 To xRng.Columns.Count
I = I + 1
If xRng.Cells(I).Value Like "*Incoming Call*" Then
del = False
End If
Next xCellCounter

If del Then
xRng.Cells(I).EntireRow.Delete
I = I - xRng.Columns.Count ' Die Zeile ist weg, also die Zählvariable
' auch für die neuen Zeilen setzen
End If
del = True
Next xRowCounter

End Sub

Sub Einlesen_der_Calls()
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;Pfad:zurDatei.txt", Destination:=Range("$A$1"))
.Name = "vba"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub

Sub Delete_Altes_Datum(tableDate)

Set xRng = Selection ' Auswahl in Objekt setzen
del = True
I = 0 ' Zählvariable um die Zeile, die die Zelle enthält nachher auch löschen zu können
colCount = xRng.Columns.Count

For xRowCounter = 1 To xRng.Rows.Count
For xCellCounter = 1 To colCount
I = I + 1
If xRng.Cells(I).Value Like tableDate + " *" Then
del = False
End If
Next xCellCounter

If del Then
xRng.Cells(I).EntireRow.Delete
I = I - colCount ' Die Zeile ist weg, also die Zählvariable
' auch für die neuen Zeilen setzen
End If
del = True
Next xRowCounter

End Sub

Sub Calls_in_aktives_Sheet()
If ActiveSheet.Name Like "Tabelle*" Then
ActiveSheet.Name = Date
End If
ActiveSheet.Range("A1:A" + CStr(ActiveSheet.UsedRange.Rows.Count)).Delete
ActiveSheet.Range("A1").Select
Call Einlesen_der_Calls
ActiveSheet.Range("A1:A" + CStr(ActiveSheet.UsedRange.Rows.Count)).Select
Call Delete_Altes_Datum(ActiveSheet.Name)
ActiveSheet.Range("A1:A" + CStr(ActiveSheet.UsedRange.Rows.Count)).Select
Call Delete_Non_Call_Row
ActiveSheet.Range("A" + CStr(ActiveSheet.UsedRange.Rows.Count)).Select
MsgBox (CStr(ActiveSheet.UsedRange.Rows.Count) + " Calls am " + CStr(ActiveSheet.Name))
End Sub

Sub Calls_in_neues_Sheet()
Sheets.Add
Call Calls_in_aktives_Sheet
End Sub

Update 26.09.2010:
Ich habe heute das Plugin für den Syntaxhighlighter auf SyntaxHighlighter ComPress von Andre Gärtner geändert.
Das hat unter anderem den Vorteil, dass es die benötigten JavaScript Dateien dynamisch einbindet und damit weniger Ladezeit benötigt. Außerdem nutzt es das aktuelle SyntaxHighlighter JS, das für Copy&Paste kein Flash mehr benötigt.

Leave a Reply

*