Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Excel-Dateien in Textdatei umwandeln mit VBS-Skript

Frage Entwicklung VB for Applications

Mitglied: RackZak

RackZak (Level 1) - Jetzt verbinden

27.04.2009, aktualisiert 18.10.2012, 6957 Aufrufe, 7 Kommentare

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:

01.
Const ABZEILE = 1 
02.
Const ABSPALTE = 1 
03.
Const ANZSPALTEN = 20 
04.
Const TRENN =	"	" 
05.
 
06.
Dim oDatei 
07.
Set fso = CreateObject("Scripting.FileSystemObject") 
08.
 
09.
	If WScript.Arguments.Count < 3 Then 
10.
		WScript.Echo "Angabe der Excel-Datei erforderlich!" 
11.
		WScript.Quit(1) 
12.
	End If 
13.
 
14.
 
15.
 
16.
Set oArgs = WScript.Arguments 
17.
sXLDat = oArgs(0) 'datei zum lesen 
18.
outDat = oArgs(1) 'datei zum speichern 
19.
TABELLE = oArgs(2) 'tabelle der exceldatei 
20.
 
21.
	If Not fso.FileExists(sXLDat) Then 
22.
		WScript.Echo sXLDat & " nicht gefunden!" 
23.
		WScript.Quit(1) 
24.
	End If 
25.
 
26.
sXLSDatei = fso.GetFile(sXLDat).Path 
27.
sXLSPfad = Left(sXLSDatei, InStrRev(sXLSDatei, "\")) 
28.
sXLSName = Mid(sXLSDatei, InStrRev(sXLSDatei, "\") + 1) 
29.
sDateiName = Left(sXLSName, Len(sXLSName) - 4) 
30.
 
31.
DATEI = outDat 'Zieldatei 
32.
Set oDatei = fso.OpenTextFile(DATEI, 2, True) 'Datei immer neu erstellen 
33.
 
34.
On Error Resume Next 
35.
Set XL = WScript.CreateObject("Excel.Application") 
36.
If Err.Number Then Fehler Err.Number, Err.Description 
37.
Set oWB = XL.Workbooks.Open(sXLSDatei) 
38.
 
39.
iZeile = ABZEILE 
40.
With oWB.Worksheets(TABELLE) 
41.
    		Do While (iZeile < 50) 
42.
        		sZeile = .Cells(iZeile, ABSPALTE).Value 
43.
        		For i = 2 To ANZSPALTEN 
44.
            			sZeile = sZeile & TRENN & .Cells(iZeile, ABSPALTE + i - 1).Value 
45.
        		Next 
46.
			IF .Cells(iZeile, ABSPALTE).Value = "" THEN 
47.
				sZeile = "	" 
48.
				oDatei.WriteLine sZeile 
49.
			END IF 
50.
			IF .Cells(iZeile, ABSPALTE).Value <> "" THEN 
51.
				oDatei.WriteLine sZeile 
52.
			END IF 
53.
				iZeile = iZeile + 1 
54.
				IF Zeile > 65536 Then Exit Do 
55.
    		Loop 
56.
	End With 
57.
 
58.
oDatei.Close 
59.
oWB.Saved = True 
60.
XL.Application.Quit
Hier:
01.
 With oWB.Worksheets(TABELLE)
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:
01.
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! ...
Mitglied: RackZak
27.04.2009 um 16:08 Uhr
Das erste habe ich schon einmal gelöst...

...irgendwie hatte es vorher nicht funktioniert jetzt geht es mit:
01.
With oWB.ActiveSheet
Vorher habe ich das OWB vergessen.

Hat noch jemand eine Idee für die Schleife?
Bitte warten ..
Mitglied: bastla
27.04.2009 um 16:19 Uhr
Hallo RackZak und willkommen im Forum!

Ein Ansatz für beides (mit der Möglichkeit, weiterhin auch Tabellennamen übergeben zu können):
01.
Const ABZEILE = 1 
02.
Const ABSPALTE = 1 
03.
Const ANZSPALTEN = 20 
04.
Const TRENN =	"	" 
05.
 
06.
Dim oDatei 
07.
Set fso = CreateObject("Scripting.FileSystemObject") 
08.
 
09.
If WScript.Arguments.Count < 2 Then 'zumindest Ein- und Ausgabedatei müssen übergeben werden 
10.
    WScript.Echo "Angabe der Excel-Datei erforderlich!" 
11.
    WScript.Quit(1) 
12.
End If 
13.
 
14.
 
15.
 
16.
Set oArgs = WScript.Arguments 
17.
sXLDat = oArgs(0) 'datei zum lesen 
18.
outDat = oArgs(1) 'datei zum speichern 
19.
If WScript.Arguments.Count >2 Then 
20.
    TABELLE = oArgs(2) 'tabelle der exceldatei 
21.
End If 
22.
 
23.
If Not fso.FileExists(sXLDat) Then 
24.
    WScript.Echo sXLDat & " nicht gefunden!" 
25.
    WScript.Quit(1) 
26.
End If 
27.
 
28.
sXLSDatei = fso.GetFile(sXLDat).Path 
29.
sXLSPfad = Left(sXLSDatei, InStrRev(sXLSDatei, "\")) 
30.
sXLSName = Mid(sXLSDatei, InStrRev(sXLSDatei, "\") + 1) 
31.
sDateiName = Left(sXLSName, Len(sXLSName) - 4) 
32.
 
33.
DATEI = outDat 'Zieldatei 
34.
Set oDatei = fso.OpenTextFile(DATEI, 2, True) 'Datei immer neu erstellen 
35.
 
36.
On Error Resume Next 
37.
Set XL = WScript.CreateObject("Excel.Application") 
38.
If Err.Number Then Fehler Err.Number, Err.Description 
39.
Set oWB = XL.Workbooks.Open(sXLSDatei) 
40.
 
41.
iZeile = ABZEILE 
42.
If TABELLE <> "" Then 
43.
    Set WS = oWB.Worksheets(TABELLE) 
44.
Else 
45.
    Set WS = oWB.ActiveSheet 
46.
End If 
47.
 
48.
With WS 
49.
    Do While iLeer < 5 
50.
        sZeile = .Cells(iZeile, ABSPALTE).Value 
51.
        For i = 2 To ANZSPALTEN 
52.
            sZeile = sZeile & TRENN & .Cells(iZeile, ABSPALTE + i - 1).Value 
53.
        Next 
54.
        If .Cells(iZeile, ABSPALTE).Value = "" THEN 
55.
            sZeile = "	" 
56.
            iLeer = iLeer + 1 'Zähler für leere Zellen erhöhen 
57.
        Else 
58.
            iLeer = 0 'Letzte Zelle war nicht leer - Zählung rücksetzen 
59.
        End If 
60.
        oDatei.WriteLine sZeile 
61.
 
62.
        iZeile = iZeile + 1 
63.
        If iZeile > 65536 Then Exit Do 
64.
    Loop 
65.
End With 
66.
 
67.
oDatei.Close 
68.
oWB.Saved = True 
69.
XL.Application.Quit
Grüße
bastla
Bitte warten ..
Mitglied: RackZak
27.04.2009, aktualisiert 18.10.2012
Klasse!

Wie immer bin ich begeistert )))...

Vielen Dank!

P.S. Wenn du dich erinnerst hast du das Gerüst mal gebastelt....

Hier der Link von 2007:

http://www.administrator.de/forum/batch-datei-um-excel-datei-in-text-da ...

Kann man den Abbruch nicht auch mit mehreren Bedingungen machne? Zum Beispiel:

01.
 Do While (.Cells(iZeile1, ABSPALTE).Value = "" AND .Cells(iZeile2, ABSPALTE).Value = "" AND .Cells(iZeile3, ABSPALTE).Value = "") 
Ich hatte irgendwie gelesen, dass man in VB mehrere Bedingungen verknüpfen kann (nicht mit AND aber mit einen anderen Junktor, doch hat das bei mir nie funktioniert) Ich würde dann nach jedem durchzählen iZeile1 und iZeile2 und iZeile3 erhöhen, sodass iZeile2=iZeile1+1 und iZeile3=iZeile2+1 ist...

...oder geht das nicht? (nur rein interessehalber, ob ich auf der richtigen Spur war *g*)
Bitte warten ..
Mitglied: LotPings
27.04.2009 um 18:36 Uhr
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?

01.
> On Error Resume Next 
02.
> Set XL = WScript.CreateObject("Excel.Application") 
03.
> If Err.Number Then Fehler Err.Number, Err.Description 
04.
> Set oWB = XL.Workbooks.Open(sXLSDatei) 
05.
> 
Hier kannst du doch einfach alle Tabellen durchlaufen und den Bneutzten Bereich abfragen mit:
01.
For Each objWorkSheet In oWB.Sheets 
02.
  objWorkSheet.Activate 
03.
  Set Datenbereich=objWorkSheet.UsedRange 
04.
    ErsteZeile = Datenbereich.Cells(1).Row 
05.
    ErsteSpalte = Datenbereich.Cells(1).Column 
06.
    LetzteZeile = Datenbereich.Cells(Datenbereich.Cells.Count).Row 
07.
    LetzteSpalte = Datenbereich.Cells(Datenbereich.Cells.Count).Column 
08.
 
09.
'  Dein Code hierher 
10.
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
Bitte warten ..
Mitglied: RackZak
27.04.2009 um 18:57 Uhr
Ist auch gut . In die Richtung (benutzter Bereich) habe ich auch schon einmal meine Gedanken schweifen lassen, aber ich kann halt kein VB. *G*

Danke!
Bitte warten ..
Mitglied: bastla
27.04.2009 um 19:50 Uhr
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:
Do Until (.Cells(iZeile, ABSPALTE) = "" AND .Cells(iZeile+1, ABSPALTE) = "" AND .Cells(iZeile+2, ABSPALTE) = "")
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
.Range("A65536").End(xlUp).Row
zur Ermittlung der letzten verwendeten Zeile der Spalte A (unter Excel <= 2003) oder vielleicht doch auch nur die einfache Version
Do While .Cells(iZeile, ABSPALTE) <> ""
Grüße
bastla
Bitte warten ..
Mitglied: RackZak
27.04.2009 um 20:26 Uhr
Genauso hatte ich mir das vorgestellt.

In der ursprünglichen Variante hattest du angegeben, dass wenn eine leere Zeile ist, dass er dann die Schleife beendet. (sofern ich es richtig verstanden hatte - Programmierung ist nicht wirklich mein Gebiet)

Bei mir kann es sein, dass mehrere leere Zeilen existieren, aber nie mehr als fünf (deswegen so komische Abbruchbedingungen)...

...das es eine Alternative gibt, in dem man die "UsageRange"-Variante verwende, war mir nicht klar (sonst wäre ich hier ja das VB-Genie ;) ...) aber es ist natürlich besser als meine Variante. (Unwissenheit halt *g*)

Die Until-Schleife hatte ich auch gefunden, aber das hat irgendwie nicht fkt. Mit deinem Aufbau klappt es aber perfekt .

Also vielen Dank nochmal! Fünf von fünf Sternen für Schnelligkeit und die guten Tipps!

Gruß

RackZak
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Microsoft Office
Mehr als 20 Excel Dateien öffnen gleichzeitig (7)

Frage von PizzaPepperoni zum Thema Microsoft Office ...

Windows 7
gelöst Batch-Skript oder VBS Skript zum Sichern von Office Vorlagen (2)

Frage von Ceejaay zum Thema Windows 7 ...

Batch & Shell
gelöst VBS Script in eine Textdatei ausgeben (VBS mit Batch zusammenführen) (5)

Frage von Luuke257 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...