VBScript: 2D Array mit Bedingungen

amn.ssy

Erfahrenes Mitglied
Hallo,

zur Validierung mehrerer Exceldateien in einem Ordner schiebe ich zunächst alle Dateien in ein 1D Array. Das funktioniert schon mal :)
Im Anschluß arbeite ich diese "Liste" ab und öffne die Dateien nacheinander um alle Daten einer bestimmten Spalte in ein mehrdimensionales Array zu schreiben.
Dabei soll für jede Datei eine Spalte entstehen.
Nun kommt erschwerend hinzu, daß es mitunter Dateien gibt, die zusammen gehören und daher auch zusammen in der selben Spalte landen sollen.
Zu erkennen sind diese Dateien an den ersten 5 Zeichen im Dateinamen.
Testhalber habe ich 14 Dateien im Ordener von den jeweils 2 susammen gehören - somit sollte ein Array entstehen, das 7 Spalten und genauso viele Zeilen aufweist wie die beiden zusammen gehörenden Dateien benutzen (z.B. 1. Datei 6 Zeilen + 2. Datei 33 Zeilen = 39). Diese sollten im übrigen bei allen Dateien gleich sein. Ansonsten wäre dies schon eine Abbruchbedingung für das ganze Script.
Mit dem nachfolgenden Code bin ich heute schon mal ne ganze Ecke weitergekommen, doch nun hänge ich schon den ganzen Nachmittag fest an verschiedenen Fehler, die mir die Kontrollausgaben ('debug.print) zeigen.
Die Logik scheint einigermaßen zu stimmen, jedoch ist mein usedCells-Wert bei jeder 2. Datei bzw. wenn die Prüfung auf gleiche Dateien "fehl schlägt" um einiges zu hoch - 66!
Dies wäre der Wert der benutzen Zellen in der jeweils 2. Datei.
Ich nehme an, daß daher auch das Array nicht wie gewünscht gefüllt wird - die Array-Ausgaben am Schluss des Codes ziegen 6 Werte gefolgt von 33 "leere" und anschließend im weiteren Verlauf wieder 6 Werte. Diese 6 Werte sind jedoch richtig.
Ganz zum Schluss, wenn alle Dateien durch sind bekomme dann noch den Fehler, daß er die Datei ~... nicht öffnen kann.
Dies entspricht der ersten Datei die geöffnet wurde und scheinbar nicht richtig geschlossen wird.
Ich wür mich sehr freuen wenn mir jemand auf die Sprünge helfen kann.
Ziel des ganzen ist letztlich, daß in jeder Spalte die gleichen Werte in der gleichen Reihenfolge wie in der Nachbarspalte stehen.
Ist dies nicht der Fall wäre das die 2. Abbruchbedingung.
Visual Basic:
Option Explicit

Dim oFSO, oFolder, oFile
Dim oExcel, oWorkbook1, oWorkbook2
Dim usedCells, usedCellsAdd, countFiles
Dim tmpBNo, strBNo, Item
Dim aFiles(), aBNo()
Dim f, g, i, j, k

usedCells = 0
usedCellsAdd = 0
countFiles = 0

tmpBNo = ""
strBNo = "" 
Item = ""

f = 0
g = 0
i = 0
j = 0
k = 0
 
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oExcel = WScript.CreateObject("Excel.Application")
Set oFolder = oFSO.GetFolder("C:\GMD\input\RAW\")

countFiles = oFolder.Files.count
If countFiles < 1 then Msgbox("no files found")
ReDim aFiles(countFiles - 1)

	For each oFile In oFolder.Files
		aFiles(f) = oFile.Name
		f = f + 1
	next
     
	For i = LBound(aFiles) to UBound(aFiles) 
		oExcel.Visible = False
		Set oWorkbook1 = oExcel.Workbooks.Open(oFolder & "\" & aFiles(i))
		
		'debug.print
		msgbox "1. " & oWorkbook1.name
		
		if StrComp(Left(aFiles(i),5), Left(aFiles(i + 1),5),1) = 0 Then
			Set oWorkbook2 = oExcel.Workbooks.Open(oFolder & "\" & aFiles(i + 1))
			
		'debug.print
		msgbox "2. " & oWorkbook2.name
			usedCellsAdd = 0
			usedCellsAdd = oWorkbook2.Sheets("Quantitave Results").UsedRange.Rows.Count - 1
			oWorkbook2.saved = True
			oWorkbook2.close
		End If
		
		usedCells = oWorkbook1.Sheets("Quantitave Results").UsedRange.Rows.Count - 1
		usedCells = usedCells + usedCellsAdd
		
		'debug.print
		MsgBox usedCells
		
		Redim aBNo(usedCells - 1,UBound(aFiles))
		
			For j = 0 to usedCells - 1
				tmpBNo = oWorkbook1.Sheets("Quantitave Results").Range("F" & j + 2).value
				strBNo = Mid(tmpBNo, 12, 7)
				aBNo(j,k) = strBNo
			Next
				
		oWorkbook1.saved = True
		oWorkbook1.close
		oExcel.Quit
		
		if StrComp(Left(aFiles(i),5), Left(aFiles(i + 1),5),1) <> 0 Then k = k + 1
		
		'debug.print
		MsgBox k
		MsgBox UBound(aBNo)
		
		'Testausgabe Array
		For g = 0 to UBound(aBNo)
		Item = Item & aBNo(g,0) & " | " & aBNo(g,1) &vbcrlf
		Next
		MsgBox Item
		
	Next

Grüße
opiwahn
 

HonniCilest

Erfahrenes Mitglied
Ich habe mir den Code nicht genauer angeschaut, aber ich habe beim Überfliegen deines Textes sinngemäß folgendes herausgelesen:
UsedCells, Wert zu hoch, leere Zellen

Das lässt mich vermuten, dass dein Problem hier liegt:
Ein häufiger Fehler bei UsedRange (welches du für UsedCells verwendest) ist die Definition von "verwendeten Zellen". Du kannst es austesten, nimm ein neues Arbeitsblatt, markiere eine beliebige Range und formatiere sie z.B. mit einem Rahmen. Dann lass dir VBA die Adresse der UsedRange ausgeben. Sie wird dir den gesamten Bereich mit dem Rahmen ausgeben, ohne dass du auch nur einen Wert hast. Oder anders gesagt, für Excel ist eine verwendete Zelle jede Zelle, welche keine "Standardzelle" mehr ist, abgesehen von z.B. der Größe der Zelle.
 
Zuletzt bearbeitet:

Neue Beiträge