Thema Datum  Von Nutzer Rating
Antwort
Rot Lösung für zu hohen Rechenaufwand // MakroFunktion
29.06.2013 20:57:00 Seb
NotSolved
29.06.2013 21:01:06 Gast34835
NotSolved

Ansicht des Beitrags:
Von:
Seb
Datum:
29.06.2013 20:57:00
Views:
2590
Rating: Antwort:
  Ja
Thema:
Lösung für zu hohen Rechenaufwand // MakroFunktion

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

 


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
Rot Lösung für zu hohen Rechenaufwand // MakroFunktion
29.06.2013 20:57:00 Seb
NotSolved
29.06.2013 21:01:06 Gast34835
NotSolved