Excel-Dateien in Textdatei umwandeln mit VBS-Skript
Hallo!
Das ist ein wrikliches tolles Forum hier. Ich habe schon mehrfach sehr gute Beiträge gefunden und finde die Hilfestellungen und die Antworten klasse! .
Torztdem habe ich jetzt ein Problem, was ich nicht selber lösen kann (bestimmt, wenn ich ein oder zwei Jahre noch VBS lerne ;)).
Jetzt zu meinem Problem:
Ich habe eine mehrere Exceldateien, die ich per VBS Skript in Textdatei umwandeln möchte. Dafür habe ich hier schon dieses Tool Skript gefunden (siehe unten).
Leider ist das Problem, dass die Namen der Dateien von den des Datenblattes unterscheiden z.B. Name der Datei -> 1234.xls und des Blattes in der Excelmappe -> Blatt1.
Ich habe mir mit Batch und dem VBS-Skript eine Möglichkeit geschaffen, den Inhalt eines Ordners aufzulisten, daraus mehrere Batchdateien zu generieren, die mir wiederrum die Exceldateien (die sich in dem besagten Ordner befinden) umwandeln. Das funktioniert auch klassen, wenn der Dateiname mit dem Namen des Daten-Blattes in der Excelmappe enspricht, ansonsten läuft das VBS-Skript nicht durch (ist ja auch logisch, da er nicht auf das Tabellenblatt zugreifen kann).
Mal abgesehen von meinem Wahsinnskonstrukt in als Batchfile (möchte ich so behalten *g*) gibt es eine Möglichkeit in VBS das aktive Tabellenblatt zu verwenden und keinen festen Namen anzugeben?
Hier das VBS-Skript:
Hier:
sollte die Konstante durch eine Option ersetzt werden, die das aktive Tabellenblatt verarbeitet. Die Konstante "Tabelle" und der Tabellenname wird sonst über das Batch-Skript übergeben.
Des Weiteren habe ich auch noch nicht herausgefunden, wie man als Abbruchbedingung setzen kann, dass er aufhört den Text umzuwandeln, wenn mehr als fünf Zeilen ohne Inhalt sind.
Hier die Zeile:
.
Ich habe es schon mit Vergleichen der aktuellen Ziele mit der nachfolgenden, der daruaffolgenden etc. versucht, aber das hat nicht funktioniert, leider . Vielleicht gibt es da eine elegantere Lösung, als immer alle 50 Zeile zu nehmen.
Ich freue mich schon auf eure Tipps! ...
Das ist ein wrikliches tolles Forum hier. Ich habe schon mehrfach sehr gute Beiträge gefunden und finde die Hilfestellungen und die Antworten klasse! .
Torztdem habe ich jetzt ein Problem, was ich nicht selber lösen kann (bestimmt, wenn ich ein oder zwei Jahre noch VBS lerne ;)).
Jetzt zu meinem Problem:
Ich habe eine mehrere Exceldateien, die ich per VBS Skript in Textdatei umwandeln möchte. Dafür habe ich hier schon dieses Tool Skript gefunden (siehe unten).
Leider ist das Problem, dass die Namen der Dateien von den des Datenblattes unterscheiden z.B. Name der Datei -> 1234.xls und des Blattes in der Excelmappe -> Blatt1.
Ich habe mir mit Batch und dem VBS-Skript eine Möglichkeit geschaffen, den Inhalt eines Ordners aufzulisten, daraus mehrere Batchdateien zu generieren, die mir wiederrum die Exceldateien (die sich in dem besagten Ordner befinden) umwandeln. Das funktioniert auch klassen, wenn der Dateiname mit dem Namen des Daten-Blattes in der Excelmappe enspricht, ansonsten läuft das VBS-Skript nicht durch (ist ja auch logisch, da er nicht auf das Tabellenblatt zugreifen kann).
Mal abgesehen von meinem Wahsinnskonstrukt in als Batchfile (möchte ich so behalten *g*) gibt es eine Möglichkeit in VBS das aktive Tabellenblatt zu verwenden und keinen festen Namen anzugeben?
Hier das VBS-Skript:
Const ABZEILE = 1
Const ABSPALTE = 1
Const ANZSPALTEN = 20
Const TRENN = " "
Dim oDatei
Set fso = CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.Count < 3 Then
WScript.Echo "Angabe der Excel-Datei erforderlich!"
WScript.Quit(1)
End If
Set oArgs = WScript.Arguments
sXLDat = oArgs(0) 'datei zum lesen
outDat = oArgs(1) 'datei zum speichern
TABELLE = oArgs(2) 'tabelle der exceldatei
If Not fso.FileExists(sXLDat) Then
WScript.Echo sXLDat & " nicht gefunden!"
WScript.Quit(1)
End If
sXLSDatei = fso.GetFile(sXLDat).Path
sXLSPfad = Left(sXLSDatei, InStrRev(sXLSDatei, "\"))
sXLSName = Mid(sXLSDatei, InStrRev(sXLSDatei, "\") + 1)
sDateiName = Left(sXLSName, Len(sXLSName) - 4)
DATEI = outDat 'Zieldatei
Set oDatei = fso.OpenTextFile(DATEI, 2, True) 'Datei immer neu erstellen
On Error Resume Next
Set XL = WScript.CreateObject("Excel.Application")
If Err.Number Then Fehler Err.Number, Err.Description
Set oWB = XL.Workbooks.Open(sXLSDatei)
iZeile = ABZEILE
With oWB.Worksheets(TABELLE)
Do While (iZeile < 50)
sZeile = .Cells(iZeile, ABSPALTE).Value
For i = 2 To ANZSPALTEN
sZeile = sZeile & TRENN & .Cells(iZeile, ABSPALTE + i - 1).Value
Next
IF .Cells(iZeile, ABSPALTE).Value = "" THEN
sZeile = " "
oDatei.WriteLine sZeile
END IF
IF .Cells(iZeile, ABSPALTE).Value <> "" THEN
oDatei.WriteLine sZeile
END IF
iZeile = iZeile + 1
IF Zeile > 65536 Then Exit Do
Loop
End With
oDatei.Close
oWB.Saved = True
XL.Application.Quit
Hier:
With oWB.Worksheets(TABELLE)
Des Weiteren habe ich auch noch nicht herausgefunden, wie man als Abbruchbedingung setzen kann, dass er aufhört den Text umzuwandeln, wenn mehr als fünf Zeilen ohne Inhalt sind.
Hier die Zeile:
Do While (iZeile < 50)
Ich habe es schon mit Vergleichen der aktuellen Ziele mit der nachfolgenden, der daruaffolgenden etc. versucht, aber das hat nicht funktioniert, leider . Vielleicht gibt es da eine elegantere Lösung, als immer alle 50 Zeile zu nehmen.
Ich freue mich schon auf eure Tipps! ...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 114763
Url: https://administrator.de/forum/excel-dateien-in-textdatei-umwandeln-mit-vbs-skript-114763.html
Ausgedruckt am: 25.12.2024 um 14:12 Uhr
7 Kommentare
Neuester Kommentar
Hallo RackZak und willkommen im Forum!
Ein Ansatz für beides (mit der Möglichkeit, weiterhin auch Tabellennamen übergeben zu können):
Grüße
bastla
Ein Ansatz für beides (mit der Möglichkeit, weiterhin auch Tabellennamen übergeben zu können):
Const ABZEILE = 1
Const ABSPALTE = 1
Const ANZSPALTEN = 20
Const TRENN = " "
Dim oDatei
Set fso = CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.Count < 2 Then 'zumindest Ein- und Ausgabedatei müssen übergeben werden
WScript.Echo "Angabe der Excel-Datei erforderlich!"
WScript.Quit(1)
End If
Set oArgs = WScript.Arguments
sXLDat = oArgs(0) 'datei zum lesen
outDat = oArgs(1) 'datei zum speichern
If WScript.Arguments.Count >2 Then
TABELLE = oArgs(2) 'tabelle der exceldatei
End If
If Not fso.FileExists(sXLDat) Then
WScript.Echo sXLDat & " nicht gefunden!"
WScript.Quit(1)
End If
sXLSDatei = fso.GetFile(sXLDat).Path
sXLSPfad = Left(sXLSDatei, InStrRev(sXLSDatei, "\"))
sXLSName = Mid(sXLSDatei, InStrRev(sXLSDatei, "\") + 1)
sDateiName = Left(sXLSName, Len(sXLSName) - 4)
DATEI = outDat 'Zieldatei
Set oDatei = fso.OpenTextFile(DATEI, 2, True) 'Datei immer neu erstellen
On Error Resume Next
Set XL = WScript.CreateObject("Excel.Application")
If Err.Number Then Fehler Err.Number, Err.Description
Set oWB = XL.Workbooks.Open(sXLSDatei)
iZeile = ABZEILE
If TABELLE <> "" Then
Set WS = oWB.Worksheets(TABELLE)
Else
Set WS = oWB.ActiveSheet
End If
With WS
Do While iLeer < 5
sZeile = .Cells(iZeile, ABSPALTE).Value
For i = 2 To ANZSPALTEN
sZeile = sZeile & TRENN & .Cells(iZeile, ABSPALTE + i - 1).Value
Next
If .Cells(iZeile, ABSPALTE).Value = "" THEN
sZeile = " "
iLeer = iLeer + 1 'Zähler für leere Zellen erhöhen
Else
iLeer = 0 'Letzte Zelle war nicht leer - Zählung rücksetzen
End If
oDatei.WriteLine sZeile
iZeile = iZeile + 1
If iZeile > 65536 Then Exit Do
Loop
End With
oDatei.Close
oWB.Saved = True
XL.Application.Quit
bastla
Zitat von @RackZak:
Mal abgesehen von meinem Wahsinnskonstrukt in als Batchfile
(möchte ich so behalten *g*) gibt es eine Möglichkeit in VBS
das aktive Tabellenblatt zu verwenden und keinen festen Namen
anzugeben?
Hier kannst du doch einfach alle Tabellen durchlaufen und den Bneutzten Bereich abfragen mit:Mal abgesehen von meinem Wahsinnskonstrukt in als Batchfile
(möchte ich so behalten *g*) gibt es eine Möglichkeit in VBS
das aktive Tabellenblatt zu verwenden und keinen festen Namen
anzugeben?
> On Error Resume Next
> Set XL = WScript.CreateObject("Excel.Application")
> If Err.Number Then Fehler Err.Number, Err.Description
> Set oWB = XL.Workbooks.Open(sXLSDatei)
>
For Each objWorkSheet In oWB.Sheets
objWorkSheet.Activate
Set Datenbereich=objWorkSheet.UsedRange
ErsteZeile = Datenbereich.Cells(1).Row
ErsteSpalte = Datenbereich.Cells(1).Column
LetzteZeile = Datenbereich.Cells(Datenbereich.Cells.Count).Row
LetzteSpalte = Datenbereich.Cells(Datenbereich.Cells.Count).Column
' Dein Code hierher
Next
Ich habe es schon mit Vergleichen der aktuellen Ziele mit der nachfolgenden, der daruaffolgenden etc. versucht, aber das hat nicht > funktioniert, leider . Vielleicht gibt es da eine elegantere Lösung, als immer alle 50 Zeile zu nehmen.
S.o.Gruß
LotPings
PS: Habe das aus alten Code-Schnipseln zusammengesucht, habe im Moment kein MS Office im Zugriff. Also keine Garantie für nichts
Hallo RackZak!
Abgesehen davon, dass sich die Schleifenbedingung von "While" auf "Until" ändern würde, könntest Du das natürlich auch mit AND (und etwas abgekürzt, da "Value" per Default verwendet wird) lösen:
Wie Deine Anforderung - 5 leere Ze(i/l)len ist als Abbruchbedingung doch eher ungewöhnlich - genau aussieht, hast Du ja nicht wirklich beschrieben, daher kämen natürlich (zumindest als Berechnungsbasis) die von LotPings aufgezeigten "UsedRange"-Varianten ebenso infrage wie etwa
zur Ermittlung der letzten verwendeten Zeile der Spalte A (unter Excel <= 2003) oder vielleicht doch auch nur die einfache Version
Grüße
bastla
Abgesehen davon, dass sich die Schleifenbedingung von "While" auf "Until" ändern würde, könntest Du das natürlich auch mit AND (und etwas abgekürzt, da "Value" per Default verwendet wird) lösen:
Do Until (.Cells(iZeile, ABSPALTE) = "" AND .Cells(iZeile+1, ABSPALTE) = "" AND .Cells(iZeile+2, ABSPALTE) = "")
.Range("A65536").End(xlUp).Row
Do While .Cells(iZeile, ABSPALTE) <> ""
bastla