datenbanknachbau mit excel - Konzeption?
13.12.2017 09:58:22
biba
ich möchte/muss mit Excel eine datenbank simulieren und mach mir gerade gedanken über die geschwindigkeit von aktualisierungen bzw. der effizienz in der vba programmierung.
Folgende Situation:
ich habe ca. 1500 einzelne Tabellenblätter in ca. 30 Dateien in denen verschiedene Daten zu jeweils einem Objekt enthalten sind. Also jedes Tabellenblatt für ein Objekt.
Die Objekte lassen sich in drei Ebenen klassifizieren.
Der Code für die verschiedenenen Ebenen ist fix vorgegeben und lässt sich auch problemlos auslesen.
Zur Veranschaulichung: Die Objektnummer setzt sich wie folgt zusammen AABBBBCC)
AA hat 26 verschiedene Ausprägungen, BBBB 140 und CC 9.
Problematisch ist aber das es immer mehrere Objete mit der gleichen Nummer gibt.
Also eigentlich müsste die Nummer so ausschauen AABBBBCCD :)
Variable D kann ich aber nicht in die Objektblätter schreiben sondern muss beim kopieren der daten dynamisch erzeugt werden, da sich die Objekte ändern können, die Variable D aber immer mit eins beginnen und aufsteigend sein muss.
Für eine Auswertungsdatei (eigentlich mehrere, aber das soll hier nicht Thema sein) sollen diese Objektdaten regelmäßig aktualisiert werden.
Die Auswertungsdatei ist folgendermaßen aufgebaut:
Die Tabellenblätter sind nach AA benannt und immer gleich aufgebaut. BBBB steht also immer in der gleichen Spalte und in Zeile 47 (mal für das BSp. als X1 bezeichnet) oder 97 oder 147 oder ....
CC steht, je nach Wert in Zeile X1 plus 9 oder 16 oder 21 oder.... ( nennen wir das mal Y1)
Je nachdem wie viele Objekte es mit einem identischen Code AABBBBCC gibt müssen also die Daten in Zeile Y1 oder Y1 + 1... geschrieben werden.
AA,BBBB und CC haben also für jeden individuellen wert eine Fixe Zeile.
Wobei AA das Tabellenblatt bezeichnet und idR. BBBB immer nur auf einem bestimmten Tabellenblatt vorkommt (mit ausnahme von einigen Objekten die kein spezifischen BBBB Wert haben also 9999 als Dummy) und CC eine unterkategorie von BBBB ist. CC gbit es aber für jedes BBBB.
Anders gesagt, BBBB ist also idR. das Hauptidentifikationsmerkmal, aber nicht immer :(
Ich könnte also einen Code schreiben der die Daten kopiert und je nach Ausprägung von AABBBBCC in eine bestimmte Zeile schreibt und in Abhängigkeit von D eine Zeile dazu addiert. Finde ich aber ziemlich uneffektiv, da das Ganze abertausende Codezeilen (und mir damit ein haufen Arbeit) schafft.
und, ein weiteres Problem: Die aktualisierung dauert ewig.... passiert aber i.d.R. nachts, also nicht das Hauptproblem. Ist aber in Einzelfällen dann schon ätzend, wenn die aktualisierung während der Arbeitszeit passieren muss.
Wie könnte man das rationaler schaffen?
Mit einer Abgleichsliste? z.B. nach dem Muster wenn AA=01 BBBB=1234 und CC gleich 01 dann Blatt(01),Zeile 97 ? und später nach dem Motto kopiere die Daten in die Zeile die im Abgleichsblatt steht?
BBBB ist in der Auswertungsdatei fix eingeschrieben. Man könnte also auch sagen: Kopiere die Daten in Blatt (AA) und suche hier nach dem Code BBBB und schreibe -in abhängigkeit von CC die Daten in die jeweilige Zeile. Der Abstand von CC zu dem Wert BBBB ist im Auswertungsblatt fix. Würde also wahnsinnig viel Code sparen. Was dann aber mit der Variable D machen?
Oder?
Oder?
Bin etwas ratlos, da ich ansonsten für solche Aufgaben auf ein Datenbanksystem zurückgreifen konnte. In diesem Fall (viele, viele Anwender) muss aber mit Excel gearbeitet werden :(
Hier der Code der das veranschaulichen soll:
'Verschiedene Annahmen werden getroffen, wie die Datei erfassung und festlegung der Variablen. Führe ich hier aus Platzgründen aber nicht weiter aus... Nur die relevanten variablen möchte ich für das Beispiel aufzeigen:
...
Dim WbQuelle as workbook, WbZiel as Workbook
Dim lngZeileA1 as long 'und noch 1259 weitere Zeilenvariablen (140 BBBB mal je 9 CC)
Dim Dummy_AA as string, Dummy_BBBB as integer, Dummy_CC as integer
...
'Die erste Quelldatei wird geöffnet und die Daten ausgelesen... Das Ganze muss natürlich für alle Quelldateien durchgeführt werden. Hier nur mal exemplarisch an einem verkürztem Beispiel ....
WbQuelle1.Activate
For Each sh In ActiveWorkbook.Worksheets
sh.Activate
Dummy_AA = Range (AL1).Value
Dummy_BBBB = Range (B23).Value
Dummy_CC = Range (AL2).value
lngZeileA1 = 61 'Die Zuordnung von BBBB=1234 und CC=01 zu lngZeileA1 würde ich für dieses Bsp. über eine Abgleichsliste machen. Dass ganze natürlich für alle 1260 Fälle :)
If BBBB = 1234 And CC = 01 then
Range("B1:B23").Copy
WbZiel.Worksheets("dummy_AA").cells(lngzeileA1, 1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
lngzeileA1 = lngzeileA1 + 1
End If
If BBBB = 1234 And CC = 02 then
Range("B1:B23").Copy
WbZiel.Worksheets("dummy_AA").cells(lngzeileA2, 1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
lngzeileA2 = lngzeileA2 + 1
End If
'Jetzt kämen der Code für die weiteren Ausprägungen von CC
....
' und dann natürlich für die weiteren Werte von BBBB
If BBBB = 1234 And CC = 01 then
Range("B1:B23").Copy
WbZiel.Worksheets("dummy_AA").cells(lngzeileB1, 1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
lngzeileB1 = lngzeileB1 + 1
End If
.....
Der Code funktioniert so in echt, ich hoff also dass ich hab keine Rechtschreibfähleer hier im Beispiel eingebaut hab:)
Hier nochmals meine Frage an die ultimativen Excel Cracks:
Wie kann der Code beschaffen sein, dass
-ich nicht 1260 Bedingungen schreiben muss. (Prio1) und
-Die aktualiserung verhältnismäßig zügig geht (Prio2)
Ich hoffe das Beispiel ist verständlich geschriebn und es findet sich jemand der Spaß an einer solch komplexen Aufagbe hat :)
Schon mal ein herzliches Dankeschön an alle!!!!!!
Gruß