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!
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
gruß feder
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
gruß feder
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 253274
Url: https://administrator.de/contentid/253274
Ausgedruckt am: 22.11.2024 um 22:11 Uhr
4 Kommentare
Neuester Kommentar
Hallo Feder,
zu Problem 1 und 2:
einen Range kannst du ziemlich einfach in ein Array wandeln. In deinem Fall reicht hier folgendes:
zu Problem 3:
Schließe das Excel-Workbook und die Applikation korrekt, siehe oben.
Grüße Uwe
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
Zitat von @chef1568:
dein Script liest sich gut - funktioniert allerdings nicht.
Zeile 9: Typenkonflikt
läuft hier problemlos ...dein Script liest sich gut - funktioniert allerdings nicht.
Zeile 9: Typenkonflikt
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.