Hallo liebe VBA'ler,
ich habe mich inzwischen selbst in VBA eingearbeitet und eine (für meine Begriffe) hinreichend komplexe Funktion gebaut. Ziel ist es, dass Mitarbeiter mit verschiedenen Qualifikationen pro Schicht verteilt werden und das Makro meldet, ob noch Bedarf an einer Qualifikation ist oder zuviele Mitarbeiter da sind.
Das Problem ist bei der Einbindung in Excel. Ich benutze das Makro als Function [nicht als Sub], damit ich es mehrfach für jede Qualifitkation aufrufen kann. Da ich damit eine Jahresplanung machen möchte (mit 3 Schichten pro Tag, bei 20 verschiedenen Qualifikationen), wird das Makro pro Tag 3 * 20 = 60 mal aufgerufen. Das passt noch von der Rechenleistung. Aber wenn ich das auf 365 Tage hochskalieren bedeutet das, dass das Makro 60 * 365 = 21900 aufgerufen wird. Das sprengt die Rechenleistung von Excel. Das passiert bereits, wenn ich die Makrofunktion bereits auf einen Monat großziehe geht Excel bereits in die Knie.
Gibt es Ideen, wie ich das in einen Bereich kriege der handhabbar ist?
Danke für eure Zeit.
Seb
Hier der Codeschnipsel:
Function Schichtenbesetzung(AUFRUF VIELER VARIABLEN)
# DEFINITION VIELER VARIABLEN
# EIN PAAR ÜBERPRÜFUNGEN (auf die Sinnigkeit der Variablen)
# Zwei Schleifen über das gesamte Array (20 Spalte, 100 Zeilen)
mit einfachen Berechnungen
Do While (Unterbesetzt = False) And (AllesVerteilt = False)
'Abbruchbedingungen
' Entweder Es geht nicht mit der Verteilung, d.h. wir sind unterbesetzt
' Oder alle Mitarbeiter sind verteilt.
MinWert = 1000 'initiale hochsetzen des minimal counters so groß werden wir es wohl nie brauchen
PositionsSpeicherJ = 0 'Initial auf 0 setzen
' VORSICHT der Positionsspeicher kann natürlich auch
' bei nullbleiben
'Additionen mit Boolean ergeben negativ Zahlen (True = -1, FALSE = 0)
'Vergleich dieser Summe mit Vorgaben ÜBER alle Qualifikationen
' Schleife 1 bis 16
' - Vergleich dieser Summe mit Vorgaben ÜBER alle Qualifikationen
' => kleinste Differenz auswählen (zwei Variabeln nötig, kleinste Zahl und QualifkationsNummer)
' Schleifen Ende
'Feld(i,j) wo die Anwesheit aller Mitarbeiter und ihre Qualifikation vermerkt ist
'Feldvorgabe(j), Vorgaben für die Qualifikationen
'Jetzt soll geprüft werden, bei welche Qualifikation der größte Bedarf ist bei kleinster Menge vorhandener Mitarbeiter
' D.h. wir bauen eine Schleife, die über alle Qualifikationen die Anzahl
' der Mitarbeiter zusammenrechnent und diese Wert vergleicht mit der Vorgabe (mittels Differenz).
Notwendigkeit = False
For j = 1 To Bereich_AnzSpa
If Notwendigkeit = False Then
If FeldVorgabe(j) > 0 Then 'der Minimalwert ist nur sinnvoll, wenn er benötigt wird
MerkWert = 0
For i = 1 To Bereich_AnzZei
MerkWert = MerkWert + Feld(i, j)
' Summen der Anwesenden Qualifikationen bestimmen
Next i
'MsgBox "MerkwertSchleife:" & MerkWert & " und Postition:" & j
MerkWert = -(MerkWert) - FeldVorgabe(j)
'Hiermit wird der Merkwert die positive Summe einer Qualifikation
'über alle Mitarbeiter
'MsgBox "MerkwertSchleife:" & MerkWert & " und Postition:" & j
If MerkWert < 0 Then 'Prüfen ob in dieser Qualifikation überhaupt noch genug Leute da sind.
Unterbesetzt = True
UnterbesetzteQualifikation = j 'Ausgabespeicherwert
End If
If MerkWert = 0 Then
Notwendigkeit = True
PositionsSpeicherJ = j
j = Bereich_AnzSpa
End If
If Notwendigkeit = False Then
If MerkWert < MinWert Then
MinWert = MerkWert
PositionsSpeicherJ = j
End If
End If
End If
End If
Next j
' Ergebnis: Der Positionsspeicher mit der Aussage in welcher Qualifkation ein Mitarbeiter besetzt
' werden soll. Nächster Schritt => rausfinden welcher Mitarbeiter die geringste Flexibilität hat.
' Den Mitarbeiter mit der geringsten Flexibilität finden (wird gleichzeitig genutzt, ob
' ein Mitarbeiter überhaupt anwesend ist.
Loop
# AUSGABE DES ERGEBNIS
# zwei Schleifen über ein einzeiliges Array (ca. 100 Einträge)
End Function
|