58414
Goto Top

Daten mit bestimmten Kriterien aus Textdatei in Excel einlesen

Hallo Community,

folgendes Ausgangsproblem stellt sich für mich als völligen Skript- Laien face-sad :

in einer DHCP Log- Datei befinden sich u.a. die MAC- Adresse, Hostname und Seriennummer von NAS- Platten, die ich gerne auslesen möchte.

bc4b5ac8e20d7e6ed21b48573966730e-bild1

Es interessieren nur die "Abschnitte" der Log- Datei, in denen Der Hostname mit "nas01" endet, also in denen es um die NAS- Platten geht (siehe Bild).
Es müssen nicht für jede NAS alle Angaben vorhanden sein.

Mein erster Schritt ist gewesen, ein VBA- Macro im Visual Basic Skript Editor von Excel zu schreiben, welches einfach alle Zeilen untereinander in eine Text-Datei schreibt, in denen die benötigten Daten stehen.

1. Frage:
Danach habe ich versucht, das ganze in Excel in der ersten Arbeitsmappe auch untereinander auszugeben (siehe Skript).
Wo steckt da der Fehler drin?


Sub nas01()

Const szSuch = "nas01" ' Such nas01
Const szSuch2 = "NAS01" 'Such NAS01
Const szSuch3 = "Comment = S/N" ' Such Comment S/N
Const szSuch4 = "MAC Address" ' Such MAC

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objSourceFile = objFSO.openTextFile("Pfad\zur\Datei\DHCP3TAB", 1) ' Quelldatei öffnen
Set objDestFile = Workbooks.Open("Pfad\zur\Datei\Mappe1.xls").Worksheets("Tabelle1") 'ZielDatei/-Tabelle


Do Until objSourceFile.AtEndOfStream ' Gesammtes TextDok durchgehen
szNextLine = objSourceFile.Readline ' Zeile aus Quelldatei einlesen
If InStr(szNextLine, szSuch) Then ' Wenn Suchtest vorhanden
objDestFile.writeline szNextLine ' Zeile in Zieldatei schreiben
End If
If InStr(szNextLine, szSuch2) Then ' Wenn Suchtest vorhanden
objDestFile.writeline szNextLine ' Zeile in Zieldatei schreiben
End If
If InStr(szNextLine, szSuch3) Then ' Wenn Suchtest vorhanden
objDestFile.writeline szNextLine ' Zeile in Zieldatei schreiben
End If
If InStr(szNextLine, szSuch4) Then ' Wenn Suchtest vorhanden
objDestFile.writeline szNextLine ' Zeile in Zieldatei schreiben
End If
Loop

End Sub

// EDIT: 2. Frage ist schon erledigt. Geht ja auch mit Bordmitteln, manchmal sieht man den Wald vor Bäumen nicht :P -> Suchen/Ersetzen
2. Frage:
Ich würde Ergebniszeilen wie "Hostname = xxxx" "MAC = xx.xx" "SN= xx" bekommen.
Wie ich kann die Bezeichnungen Hostname, MAC, SN im Anschluss entfernen? Diese Bezeichnungen werden ja spätestens sinnlos, wenn sie in Excel in Spalten stehen.


Vielen Dank!

Content-Key: 75248

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

Printed on: April 19, 2024 at 22:04 o'clock

Member: wakko
wakko Dec 05, 2007 at 11:16:47 (UTC)
Goto Top
Moin,

wenn ich das richtig sehe, schreibst du in eine xls-Datei wie in eine Textdatei.
Das geht so nicht.
Probier mal, vorweg ein
Dim objDestFile as Excel.Workbook
Danach kannst du in die Zellen der Excel-datei mit
objDestFile.Sheets(1).Cells(iSpalte, 1).value = szNextLine
Hoffe, der Ansatz hilft dir weiter.
Gruß,
Henrik
Mitglied: 58414
58414 Dec 05, 2007 at 11:54:32 (UTC)
Goto Top
könntest du den vollständigen Code mal posten?
Ich hatte den Skript - Schnipsel von woanders her geklaut, weiß was es zu bedeuten hat, kann allerdings überhaupt nicht mit VBA programmieren.

Wäre sehr dankbar!

Also ich habe die Lösung inzwischen auch über den Umweg der Text- Datei hinbekommen, aber ich würde es einfach sehr gerne wissen! Ich habe schon nach Lösungen gegooglet, werde dadurch aber nicht schlauer.
Member: wakko
wakko Dec 05, 2007 at 15:07:04 (UTC)
Goto Top
Naja, habe keine Testdatei, daher unngetestet und nur so neben der Arbeit
Sub nas01()
Dim ws As Excel.Worksheet, iRow%, strTemp$, datnr%
Const szSuch = "nas01" ' Such nas01  
Const szSuch2 = "NAS01" 'Such NAS01  
Const szSuch3 = "Comment = S/N" ' Such Comment S/N  
Const szSuch4 = "MAC Address" ' Such MAC  
datnr = FreeFile
Open "Pfad\zur\Datei\DHCP3TAB" For Input As #datnr 'Textdokument zum Lesen öffnen  
Set ws = ActiveWorkbook.Sheets(1)
i = 1
Do Until EOF(datnr) 'Abbruch bei Ende des Dokuments  
    Line Input #datnr, strTemp 'Zeile in strTemp einlesen  
    If InStr(strTemp, szSuch) > 0 _
        Or InStr(strTemp, szSuch2) > 0 _
        Or InStr(strTemp, szSuch3) > 0 _
    Then 'Vergleich mit Suchstring  
        ws.Cells(i, 1).Value = szNextLine 'Wert in Zelle schreiben  
        i = i + 1 'Zähler für nächste Zeile erhöhen  
    End If
Loop
Close #datnr
End Sub

MfG
Mitglied: 58414
58414 Dec 10, 2007 at 08:27:53 (UTC)
Goto Top
Nachtrag meinerseits:
Das funktionierte noch nicht ganz. Hab es etwas verändert. Das unten stehende Skript tat seine Arbeit gut.
Beim Import nach Excel fiel mir auf, dass Leerstellen in der Textdatei (also wenn der Text in der Zeile etwas eingerückt ist) in Excel durch ein Sonderzeichen dargestellt werden. Gibt es da eine Möglichkeit, dem korrekt nachzuhelfen?


Sub test()

Dim ws As Excel.Worksheet

Const szSuch = "nas01" ' Such nas01
Const szSuch2 = "NAS01" 'Such NAS01
Const szSuch3 = "Comment = S/N" ' Such Comment S/N
Const szSuch4 = "MAC Address" ' Such MAC

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objSourceFile = objFSO.OpenTextFile("Pfad\zur\Datei\DHCP3TAB", 1) ' Quelldatei öffnen
Set ws = ActiveWorkbook.Sheets(1) ' Zieldatei anlegen / überschreiben

i = 1
Do Until objSourceFile.AtEndOfStream ' Gesammtes TextDok durchgehen
szNextLine = objSourceFile.Readline ' Zeile aus Quelldatei einlesen


If InStr(szNextLine, szSuch) Then

ws.Cells(i, 1).Value = szNextLine 'Wert in Zelle schreiben
i = i + 1 'Zähler für nächste Zeile erhöhen ' Zeile in Zieldatei schreiben


ElseIf InStr(szNextLine, szSuch2) Then

ws.Cells(i, 1).Value = szNextLine 'Wert in Zelle schreiben
i = i + 1 'Zähler für nächste Zeile erhöhen ' Zeile in Zieldatei schreiben

ElseIf InStr(szNextLine, szSuch3) Then

ws.Cells(i, 1).Value = szNextLine 'Wert in Zelle schreiben
i = i + 1 'Zähler für nächste Zeile erhöhen ' Zeile in Zieldatei schreiben

ElseIf InStr(szNextLine, szSuch4) Then

ws.Cells(i, 1).Value = szNextLine 'Wert in Zelle schreiben
i = i + 1 'Zähler für nächste Zeile erhöhen ' Zeile in Zieldatei schreiben

End If

Loop

End Sub
Member: wakko
wakko Dec 12, 2007 at 09:35:55 (UTC)
Goto Top
Hi,

da kannst du die replace-Funktion nutzen,
also:
 szNextLine = replace (szNextLine, chr(9), "")  
chr(9) entspricht dem Tabulator, wenn das nicht läuft geht das evt. mit copy'n'paste des Zeichens aus Excel in deinen Quellcode. Wenn es nur Leerzeichen sind, kannst du auch die LTRIM-Funktion nutzen.

Gruß,
Henrik
Mitglied: 58414
58414 Dec 13, 2007 at 09:10:02 (UTC)
Goto Top
Mit Replace hat es wunderbar geklappt. Danke!