chef1568
Goto Top

Optimierung VB Script - Exceldatei einlesen und bearbeiten und als CSV speichern

Hallo,

ich habe ein VB Script erstellt, dass eine XLS einliest und alle Werte in einem Array speichert.
Hintergrund: Ich habe des Öfteren Dateien die ich im XML-Format erhalte. Diese muss ich etwas bearbeiten (suchen/ersetzen) und im CSV-Format ablegen.
Daher ist es mir nicht möglich dies über ein Excel-Makro zu lösen.

Leider ist es derzeit so dass das Script nur für das Einlesen der Werte schon ewig benötigt - das parsen der Daten ist hierbei noch gar nicht integriert!


dim arrImport() 		'Importarray aus Downloaddatei  
dim r, c			'temp Zähler Row/Column  
dim path, filename		'Pfad zum Ablageort der Downloaddatei  
dim usedColumn, usedRow

'Defaultwerte setzen  
path = "C:\Users\######\AppData\Local\Temp\Scripting\"  
filename = "excelexport_12175_2.xls"  
usedColumn = 0
usedRow = 0

'Erzeuge Objekt  
Set objXLS = WScript.CreateObject("Excel.Application")  
objXLS.Workbooks.open path + filename

'Ermittlung der verwendeten Spalten/Zeilen  
do While not objXLS.Cells(1, usedColumn + 1) = ""  
	usedColumn = usedColumn + 1
loop
Do While Not objXLS.Cells(usedRow + 1, 1) = ""  
	usedRow = usedRow + 1
loop

'Import der Tabelle in ein Array  
ReDim arrImport(usedRow,usedColumn)
for r = 1 to usedRow
	for c = 1 to usedColumn
		arrImport(r,c) = objXLS.Cells(r,c)
	next
next

' Testausgabe  
msgbox usedColumn
msgbox usedRow
msgbox arrImport(13060,1)

set objXLS = nothing


Problem 1
Ber Bereich unter "Ermittlung der verwendeten Spalten/Zeilen"benötigt schon ziemlich lange da ich Zelle für Zelle überprüfe - hat jemand eine performantere Lösung?

Problem 2
Der Import der Daten in das Array benötigt gefühlt ewig...

Problem 3
Selbst wenn das Script beendet und mit "nothing" wurde wird die Datei anscheinend noch weiterhin verwendet (im Task Manager ist Excel.exe auch noch aktiv)


Ich wäre für Optimierungsvorbschläge sehr dankbar face-smile
gruß feder

Content-Key: 253274

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

Printed on: April 18, 2024 at 04:04 o'clock

Member: colinardo
Solution colinardo Oct 28, 2014 updated at 23:11:26 (UTC)
Goto Top
Hallo Feder,
zu Problem 1 und 2:
einen Range kannst du ziemlich einfach in ein Array wandeln. In deinem Fall reicht hier folgendes:
dim arrImport, objXLS, objWB, path, filename
path = "C:\Users\######\AppData\Local\Temp\Scripting\"  
filename = "excelexport_12175_2.xls"   
Set objXLS = CreateObject("Excel.Application")  
'Eventuelle Dialoge/Warnmeldungen unterdrücken  
objXLS.DisplayAlerts = False
set objWB = objXLS.Workbooks.open(path & filename)

'Bereich in Array kopieren  
arrImport = objWB.Worksheets(1).UsedRange

'Testdaten aus Array ausgeben  
msgbox arrImport(100,1) 

'Workbook und Excel schließen  
objWB.Close false
objXLS.DisplayAlerts = True
objXLS.Quit

Set objWB = Nothing
Set objXLS = Nothing

zu Problem 3:
Schließe das Excel-Workbook und die Applikation korrekt, siehe oben.

Grüße Uwe
Member: chef1568
chef1568 Oct 28, 2014 at 22:51:19 (UTC)
Goto Top
Hallo colinardo,

dein Script liest sich gut - funktioniert allerdings nicht.
Zeile 9: Typenkonflikt

wenn ich arrImport() verwende kommt die Meldung: ausserhalb des gültigen Bereichs


mfg
Member: colinardo
colinardo Oct 28, 2014 updated at 23:11:26 (UTC)
Goto Top
Zitat von @chef1568:
dein Script liest sich gut - funktioniert allerdings nicht.
Zeile 9: Typenkonflikt
läuft hier problemlos ...

ausserhalb des gültigen Bereichs
Das Array das übergeben wird ist nicht 0-basiert sondern 1-basiert. Du versucht hier vermutlich einen nicht existenten Arraywert auszugeben.
Member: chef1568
chef1568 Oct 28, 2014 at 23:12:13 (UTC)
Goto Top
Ja, das Script funktioniert jetzt.
Ich hatte noch die Variablendeklaration drinnen^^

Danke für deine Hilfe