Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
820to824
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
820to824
820to824
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

1 oder n Array ?

1 oder n Array ?
18.11.2006 08:02:01
IngoH
Guten Morgen Forum,
zu meinem Projekt gehört auch eine Personalverwaltung.
Um die Datensätze der Mitarbeiter thematisch zu gliedern,
habe ich eine Mappe nach folgendem Prinzip angelegt.
In Tabelle 1 befinden sich die Grunddaten wie Name, geb.Datum und
Personalnummer.
In allen anderen Tabellen steht in Spalte A nur noch die Personalnummer
als Suchkriterium und die jeweiligen Daten
nach Thema (Zeitwirtschaft, Funktion usw.)
Jede Tabelle wird in ein eigenes Array geladen ; je nach benötigtem
Vorgang werden nur die notwendigen Tabellen geladen.
Das klappt praktisch auch sehr gut.
Nun bin ich mit dem entwickeln dieses Teils durch und überlege, alle Daten nur noch in ein Array zu laden. Würde mir das merkliche Vorteile bringen ?
Ist z.B. das Suchen in einer anderen Dimension aber im gleichen Array schneller als in einem anderen Array ?
Gruß, Ingo

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 1 oder n Array ?
18.11.2006 09:19:51
fcs
Hallo Ingo,
so wie du die Daten beschrieben hast bleibt dein Array immern noch ein zweidimensinales Array.
Die Zeilenzahl (Anzahl Mitarbeiter) ist identisch, die Spalten-Zahl ist der Summe der Spalten in den einzelnen Tabellen abzüglich der Spalten für die Peronalnummer.
Aus beispielsweise
Dim array1(100,5), array2(100,7), array3(100,6), array4(100,8)
wird
Dim arrayAlle(100,23)
Ich nehme an, dass alle Arrays als Variant deklariert sind, da du immer unterschiedliche Variablen-Typen innerhalb der Arrays hast (String, Zahlen, Datums-/Zeitangaben, Boolsche).
Falls du einige der Arrays als ein Variablen-Typ (z.B. String) deklariert hast, dann solltest du die Arrays nicht zusammenfassen, da es bei einigen Funktionen zu Problemen/unerwarteten Ergebnissen kommen könnte - z.B. Sortieren wenn plötzlich Zahlen und Strings in einer Spalte gemischt vorkommen. Außerdem wird der benötigte Arbeitsspeicher durch Varant-Variablen meist stärker in Anspruch genommen.
Wenn du nur gemischte Datentypen in deinen Teilarrays verarbeitest und sich die Zahl der zu verwaltenden Mitarbeiter in Grenzen hält spricht eigentlich nichts dagegen die Daten in einem Array zusammenzufassen.
Du solltest allerdings auch daran denken, dass du praktisch alle Verweis-Funktionen und viele Variablen für Spalten im Code anpassen muss. Bei einem funktionierenden Code hast du da die Chance jede Menge Fehler wieder einzubauen bei begrenztem Nutzen für die Code-Pflege und nicht unbedingt wesentlich höherer Verarbeitungsgeschwindigkeit.
Gruss
Franz
Anzeige
AW: 1 oder n Array ?
18.11.2006 10:42:34
IngoH
Hallo Franz,
"Aus beispielsweise
Dim array1(100,5), array2(100,7), array3(100,6), array4(100,8)
wird Dim arrayAlle(100,23)"
Ich dachte eher an redim arrayAlle(X-Personal,16Tabellen,Y-MaxSpalten)
Dann sind die Daten immer noch nach Thema zusammen (16Tabellen).
Für die Codepflege verspreche ich mir eher einen Vorteil.
Alle relevanten Variablen sind zentral verwaltet und ich würde,
bei aktuell 16 Tabellen(Array) eine Menge Schleifen einsparen.
Danke für Deine Ausführungen;
bestärken mich eigentlich, an einem ausgeschlafenen Tag
den Code zu "entrümpeln"
Schönes WE und Gruß, Ingo
Anzeige
AW: 1 oder n Array ?
18.11.2006 09:49:36
ingUR
Hallo, Ingo,
Franz hat bereits darauf hingewiesen, dass die Antwort auf Deine Frage sehr davon abhängt, wie Dieen Datensätze aufgebaut sind.
Ferner wird entscheidend, welche Such-/Sortierfunktionen du verwendestet.
Zu überlegen ist, ob Deine Daten in einer Type-Defintion gut aufgehoben sind.
Hier einmal ein Grundgerüst für das Testen, das Du insbesondere bezogen aif die von dir verwendete Suchfunktion ausweiten kannst (ggf. suchalgirithmus beschreiben/benennen und ich versuche diesen einzubauen).
Option Explicit
Const MAXITEMS = 2000
Const MAXRUNS = 1000
Dim iM1(MAXITEMS) As Integer, sM2(MAXITEMS, 2) As String, dM3(MAXITEMS) As Date
Type Record
m1 As Integer
m2(2) As String
m3 As Date
End Type
Dim BigM(MAXITEMS) As Record
Dim StartZeit As Date, EndeZeit As Date
Sub Fill3Arrays()
Dim i As Long, s As Long, r As Long
Randomize
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
iM1(i) = i
sM2(i, 1) = Chr(65 + Int(26 * Rnd)) & "elmann & i"
sM2(i, 2) = Chr(65 + Int(26 * Rnd)) & "enick" & Int(i * Rnd)
dM3(i) = Now - 500 * Rnd
BigM(i).m1 = iM1(i)
For s = 1 To 2
BigM(i).m2(s) = sM2(i, s)
Next s
BigM(i).m3 = dM3(i)
Next i
Next r
EndeZeit = Time
End Sub
Sub FillITEMSWith3M()
Dim i As Long, s As Integer, r As Long
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
BigM(i).m1 = iM1(i)
For s = 1 To 2
BigM(i).m2(s) = sM2(i, s)
Next s
BigM(i).m3 = dM3(i)
Next i
Next r
EndeZeit = Time
End Sub
Sub Fill3MwithBigM()
Dim i As Long, s As Long, r As Long
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
iM1(i) = BigM(i).m1
For s = 1 To 2
sM2(i, s) = BigM(i).m2(s)
Next s
dM3(i) = BigM(i).m3
Next i
Next r
EndeZeit = Time
End Sub
Sub FillRecsArray()
Dim i As Long, s As Long, r As Long
Randomize
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
BigM(i).m1 = i
BigM(i).m2(1) = Chr(65 + Int(26 * Rnd)) & "elmann & i"
BigM(i).m2(2) = Chr(65 + Int(26 * Rnd)) & "enick" & Int(i * Rnd)
BigM(i).m3 = Now - 500 * Rnd
Next i
Next r
EndeZeit = Time
End Sub
Sub TimeCheck()
Dim strMsg(20) As String, totalMsg As String, maxStrLen As Integer
Dim z As Integer, maxZ As Integer, Zeit(20) As Double
z = 1: maxZ = maxZ + 1
Fill3Arrays
strMsg(z) = "Füllen von drei Feldern"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = 2: maxZ = maxZ + 1
FillRecsArray
strMsg(z) = "Füllen von einem Type-Array"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = 3: maxZ = maxZ + 1
FillITEMSWith3M
strMsg(z) = "Füllen von einem Type-Array mit drei Arrays"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit) - StartZeit
z = 4: maxZ = maxZ + 1
Fill3MwithBigM
strMsg(z) = "Füllen von drei Arrays mit einem Type-Array"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
For z = 1 To maxZ
totalMsg = totalMsg & vbLf & _
strMsg(z) & Space(maxStrLen + 5 - Len(strMsg(z))) & _
Format(Zeit(z), "0.000000")
Next
MsgBox totalMsg
End Sub
Ich hoffe das Programm ist soweit verständlich im Ablauf, wobei als Aufrufprozedur TimeCheck dient, in die auch erweiterungen nach dem vier vorgestellten Mustertest erfolgen können.
    z = 5: maxZ = maxZ + 1
MeinTest 'Sub-Routineaufruf, mit den zu testenen Anweisungen
strMsg(z) = "Beschreibung MeinTest"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit

Der zu testende Anweisungsblock ist durch
    StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
next i
Next r
EndeZeit = Time
einzufassen, wobei MAXRUNS und MAXITEMS als Konstanten gesetzt sind.
Gruß,
Uwe
Anzeige
AW: 1 oder n Array ?
18.11.2006 11:03:00
IngoH
Hallo Uwe,
die Suche ist ganz simpel gestrickt.
Das Array_Grunddaten muß immer geladen werden und wird
überwiegend in einer ListBox angezeigt.
Nach Auswahl eines Mitarbeiters setze ich PPIndex = Auswahl
und klappere dann mit
Do Until Arr_Personal_Fahrerlaubnis(i, 1) = PPIndex
die entsprechenden Array ab.
(Tabellen können z.Zt. alle unterschiedlich sortiert sein)
Hmm... alleine das damit gedanklich Befassen jetzt im Gespräch führt mir
vor Augen, dass ich schon eher ans Umschreiben hätte denken soll.
Die Entstehung von div. Array geht natürlich mit der Schrittweisen Entwicklung
des "Personalmoduls" einher. Ich behalte beim Entwickeln einfach besser den
Überblick, wenn ich nicht zuviele Zusammenhänge berücksichtigen muß.
Zusammenfassen kann man später immer noch.
Vielen Dank für Deine Testroutine; bin ja mal gespannt, wie sich
die geplanten Veränderungen in meinem Programmablauf ggf. auswirken.
Schönes WE und Gruß, Ingo
Anzeige
AW: 1 oder n Array ?
18.11.2006 13:00:32
ingUR
Hallo, Ingo,
Deine Frage, die mich veranlaßte, eine einfache Zeitmessungsuntersuchung zu starten (korrigierte und erweiterte Routinen sie unten), die das zu erwartende Ergebnis liefert, dass das Suchen in Feldern von Typen-definierten Datensätzen länger dauert als das Suchen in einer Spalte eines mehrdimensionalen Feldes.
Jedoch erlangst Du damit m.E. eine bessere Übersicht und Wartungsmöglichkeit Deiner Daten, wenn Du mit typendefinierten Datensätzen arbeitest.
Es ist zu überlegen, ob das Sortieren selbst über ein Indexfeld - meistens sollte der Datenbereich einer Integervariablen ausreichen, entpr. 216/2-1 = 32767 bzw. Long, wenn mehr als die Hälfte aller möglichen Tabellenzeilen gefüllt sind - erfolgen sollte, zumal wenn du planst, die Zugriffsroutinen auf die Einträge generell zu verändern.
Gruß,
Uwe
Korrigierter und ergänzter Programmcode
Option Explicit
'Ausführungszeit mit diesen (Const-)Paramtern ca. 22 sek.
Const MAXITEMS = 20000
Const MAXRUNS = 100
Const SUCHWORT = "Anton"
Dim iM1(MAXITEMS) As Integer, sM2(MAXITEMS, 2) As String, dM3(MAXITEMS) As Date
Type Record
m1 As Integer
m2(2) As String
m3 As Date
End Type
Dim BigM(MAXITEMS) As Record
Dim StartZeit As Date, EndeZeit As Date
Sub Fill3Arrays()
Dim i As Long, s As Long, r As Long
Randomize
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
iM1(i) = i
sM2(i, 1) = Chr(65 + Int(26 * Rnd)) & "elmann & i"
sM2(i, 2) = Chr(65 + Int(26 * Rnd)) & "enick" & Int(i * Rnd)
dM3(i) = Now - 500 * Rnd
Next i
Next r
EndeZeit = Time
sM2(MAXITEMS - 3, 2) = SUCHWORT
End Sub
Sub FillITEMSWith3M()
Dim i As Long, s As Integer, r As Long
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
BigM(i).m1 = iM1(i)
For s = 1 To 2
BigM(i).m2(s) = sM2(i, s)
Next s
BigM(i).m3 = dM3(i)
Next i
Next r
EndeZeit = Time
End Sub
Sub Fill3MwithBigM()
Dim i As Long, s As Long, r As Long
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
iM1(i) = BigM(i).m1
For s = 1 To 2
sM2(i, s) = BigM(i).m2(s)
Next s
dM3(i) = BigM(i).m3
Next i
Next r
EndeZeit = Time
End Sub
Sub FillRecsArray()
Dim i As Long, s As Long, r As Long
Randomize
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
BigM(i).m1 = i
BigM(i).m2(1) = Chr(65 + Int(26 * Rnd)) & "elmann & i"
BigM(i).m2(2) = Chr(65 + Int(26 * Rnd)) & "enick" & Int(i * Rnd)
BigM(i).m3 = Now - 500 * Rnd
Next i
Next r
EndeZeit = Time
BigM(MAXITEMS - 3).m2(2) = SUCHWORT
End Sub
Sub SearchInBigM()
Dim i As Long, s As Long, r As Long, Index As Long
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
If BigM(i).m2(2) = SUCHWORT Then Exit For
Next i
Index = i
Next r
EndeZeit = Time
End Sub
Sub SearchIn3M()
Dim i As Long, s As Long, r As Long, Index As LoadPictureConstants
StartZeit = Time
For r = 1 To MAXRUNS
For i = 0 To MAXITEMS
If sM2(i, 2) = SUCHWORT Then Exit For
Next i
Index = i
Next r
EndeZeit = Time
End Sub
Sub TimeCheck()
Dim strMsg(20) As String, totalMsg As String, maxStrLen As Integer
Dim z As Integer, maxZ As Integer, Zeit(20) As Variant
z = z + 1:   maxZ = maxZ + 1
Fill3Arrays
strMsg(z) = "Füllen von drei Feldern"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = z + 1: maxZ = maxZ + 1
FillRecsArray
strMsg(z) = "Füllen von einem Type-Array"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = z + 1: maxZ = maxZ + 1
FillITEMSWith3M
strMsg(z) = "Füllen von einem Type-Array mit drei Arrays"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = z + 1: maxZ = maxZ + 1
Fill3MwithBigM
strMsg(z) = "Füllen von drei Arrays mit einem Type-Array"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = z + 1: maxZ = maxZ + 1
SearchInBigM
strMsg(z) = "Suchen in Type-Array"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
z = z + 1: maxZ = maxZ + 1
SearchIn3M
strMsg(z) = "Suchen in drei Arrays"
maxStrLen = IIf(maxStrLen < Len(strMsg(z)), Len(strMsg(z)), maxStrLen)
Zeit(z) = EndeZeit - StartZeit
For z = 1 To maxZ
totalMsg = totalMsg & vbLf & _
strMsg(z) & Space(maxStrLen + 5 - Len(strMsg(z))) & _
Format(Zeit(z), "hh:mm:ss")
Next
MsgBox totalMsg
End Sub

Anzeige
Sortieren
18.11.2006 15:26:33
IngoH
Hi Uwe,
vielen Dank für Deine Unterstützung !
Sortieren über Indexfeld war die Initialzündung.
Testweise folgeder Ablauf:
-Die Tabelle Grunddaten habe ich um die Spalte Index erweitert.
-Ich sortiere alle Tabellen nach der Personalnummer, um gleiche Positionen zu erhalten
-In der Spalte Grunddaten/Index trage die Nummerierung 1 bis n ein
und lasse die Tabelle nach Namen sortieren
(Sortieren über die Worksheet-Funktion geht ja quasi in NullKommaNix)
-Erfolgt jetzt über eine ListBox die Auswahl eines Namen, habe ich in der Zeile Index
die Position in den anderen Dimensionen des Array auch ohne Suche/Schleifen
Was sagt der Fachmann dazu ?
Anzeige
AW: Sortieren
18.11.2006 17:43:31
ingUR
Hallo, Ingo,
was der Fachmann sagt, das kann ich Dir nicht sagen , aber auch als Laie kann ich mich noch nicht in Deine Datenstruktur genau hineinfinden, da Du anscheinend meinst, eine Mischung aus "Tabellendatenbank" und VBA-Array verwenden zu müssen.
Das Selektieren eines Eintrages aus einer Listbox und danach den Bezug zu die Teileinträgen des Datensatzes, der auf mehrere Tabellen verteilt sein können, sollte doch eigentlich über die VBA-Find-Funktion möglich sein. Das sortieren wiederum könnte vor der Zuweisung doch über die VBA-Sort-Funktion erfolgen, oder was spricht dagegen?
Einzig, wenn du eine "saubere" Datenbankverwaltung in VBA simulieren möchtest, ist es m.E. erforderlich die Einträge aus den Tabellen in ein Array zusammenzuführen (Datensätze speichern, lesen usw.) und da würde ich vermutlich bei unterschiedlichen Datentypen je Datensatz eine benutzerdefinierte Variable (Type) vorsehen - in der "Luxusausführung" gar eine Klasse kreiirenen.
Fazit: Da ich Deine eigentliche Anwendung und die erfolrderliche Datenstruktur in ihr nicht kenne, ist es mir nicht möglich zu übersehen, ob der von dir beschriebene Weg, wirklich der optimalste ist; gangbar ist er aber schon.
Gruß,
Uwe
Anzeige
ich arbeite dran,antwort dauert noch (o.T.)
18.11.2006 21:59:56
IngoH

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige