Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Makro für Behälterauffüllung
#1
Guten Tag Zusammen,

ich habe eine Excel-Mappe in welcher die Füllgrade von Behältern in Minuten angegeben ist.
Die Teile aus den Behältern werden für Anlagen benutzt. Wenn ein Behälter leer ist, muss ein
neuer geliefert werden. Ein Zyklus ist jeweils zum Liefern der Behälter, dies dauert ca. 80min.
Innerhalb eines Zykluses können nur 6 Behälter nachgefüllt werden.

Nun habe ich die Zellen mit einer WENN-Bedingung aufgebaut, sodass pro Zyklus von jedem Behälter
80min abgezogen werden. Wenn ein Behälter leer wird und der Wert ins Negative geht, wird die Zelle
rot markiert und im nächsten Zyklus wieder auf den Startwert-Zykluszeit gesetzt.

Nun zu meinem Problem: Es können innerhalb eines Zykluses nur 6 Behälter aufgefüllt werden.
Ich hätte das Tabellenblatt gerne so, dass bei mehr als 6 roten Zellen in einer Spalte, nur die 6 mit der größten
negativen Zahl aufgefüllt werden. Die anderen Werte erhalten wieder -90 und werden dann im
nächsten Zyklus wieder aufgefüllt.

Zusätzlicher Wunsch: Wenn eine Zelle die Reichweite des Behälters im Negativen erreicht, soll die
Zelle tiefrot markiert werden.

Hätte jemand einen Vorschlag/Idee wie man so ein Makro aufbauen könnte?


Angehängte Dateien
.xlsx   Mappe1.xlsx (Größe: 41,46 KB / Downloads: 7)
Antworten Top
#2
Hallo

ich habe mir die Beispieldatei einmal angeschuit, da läuft einem doch ein leichter Schauer über den Rücken.  Das sieht mir eher nach Auftragarbeit aus?
Bei der Menge an Behältern den Überblick behalten, richtig zu entscheiden welche Behälter wann gefüllt werden m üssen. das ist keine leichte Aufgabe!
41 Spalten mal 50 Zeilen dürften nach meiner Rechnung 2050 Behälter sein die lüclenlos Überwacht werden müssen.  Das ist eine grosse Menge!

Unklar ist mir aber was genau das Makro bewirken soll, weil ja alles mit Formeln berechnet wird.  Die sollen sicher nicht gelöscht werden, oder???
Die Farbe bei Minus Zahlen tiefrot zu setzen dürfte am einfachsten über Bedingte Formatierung gehen. (Ohne Makro!)

Aber wie bringt man den Formeln bei wann ein Behäölter wieder gefüllt ist?  Und mit welchem Füllstand??  Das habe ich noch nicht verstanden.
Da bitte ich darum noch mal genau zu Erläutern wie das Makro in die bestehende Formelberechnungen eingreifen soll und darf.

mfg Gast 123
Antworten Top
#3
Moin,

die Behälter in einer Zeile sind ein und die Gleichen. Es sind insgesamt 50 Zeilen also 50 Behälter welche immer nachgefüllt werden.

Pro Zyklus (also pro Spalte) können in der Realität aber nur 6 Behälter wieder auf den Anfangswert aufgefüllt werden. D.h. wenn mehr als 6 Behälter in einer Spalte Rot markiert werden, sollen im nächsten Zyklus nur die 6 Behälter wieder auf den Startwert gesetzt werden, welche am meisten im Negativen sind. Die restlichen Behälter gehen weiter ins Minus und werden dann im übernächsten Zyklus wieder aufgefüllt.

Ich konnte das Problem in einem Python Code lösen, diesen aber noch nicht auf ein Makro übertragen. Hier ist ein Beispiel mit 12 Behältern.

import numpy as np

zyklen = 100
zykluszeit = 80
maxnegativ = 6

reichweite = np.array([220,238,238,238,238,249,257,257,308,367,367,469])

startwerte = np.copy(reichweite)

print(reichweite)

for i in range(zyklen):
    
    reihenfolge = np.argsort(reichweite)
    
    for j in range(len(reichweite)):
        
        if reichweite[j] > 0:
            reichweite[j] -= zykluszeit
            
        elif j in reihenfolge[:min(maxnegativ,len(reichweite))]:
            
            reichweite[j] = reichweite[j] + startwerte[j] - zykluszeit
            
        else: 
            reichweite[j] -= zykluszeit
     
    for k in range(len(reichweite)):
        if np.abs(reichweite[k]) > startwerte[k]:
            print("UNTERSCHREITUNG DES STARTWERTES IM NEGATIVEN NACH ZYKLUS: " + str(i+1))
            break
        
    print(reichweite)
Antworten Top
#4
Hallo

Python Code sagt mir michts, damit kenne ich mich nicht aus!   Ob es mir mit meinen bescheidenen VBA Kenntnissen gelingt das als Makro zu realisieren weiss ich nnicht???  Versuchen kann ichs ja mal, aber ohne jede Erfolgsgarantie!  Kann aber etwas dauern.

Sollten sich Kollegen mit besserem Programmierwissen am Thread beteiligen habe ich sicher nichts dagegen.

mfg Gast 123
Antworten Top
#5
Hallo

ich habe mal versucht deinen Phyton Code in VBA umzusetzen, mir fehlt aber jegliches Wissen wie der Phyton Code funktioniert???
Vielleicht weiss das ein Forum Kollege und kann ihn für dich komplett entschlüsseln.  Würde mich freuen!   Nun zu meinem Versuch:

Ich gehe davon aus das du programmieren kannst, dann musst du nur die typische Programmier Syntacs von VBA noch begreifen.
In meinem Code siehst du Einrückungen, die besagen das jeder Codeteil innerhalb dieser Einrückung abläuft. Vor allem bei For Next!

VBA Grundlagen:   jede For  Next Schleife muss mit Next abgeschlossen werden.  Auch innerhalb mehrerr For Next Schleifen!
If muss immer mit End If abgeschlossen werden!   Ich nehme an bei Python sind es die ":" Zeichen???
Bei Variablen und Array mit Index sind (k) Klammern erforderlich, keine [k]  Klammern!
Bei Print benutzen wir Debug.Print, wenn  du den Wert im VBA Direktfenster sehen willst.  Bei Bildschirm Anzeige mit MsgBox! 
Unklar ist mir was du mit np.Array und np.Copy definierst?  Was np besagt?   Ist das ein Objekt, eine Tabelle, ein Bereich???
Was wird mit mp.Copy(reichwerte)  genau definiert???  Das ist mir völlig unklar!
Error gibt es bei der Syntacs:  reihenfoilge(MIn...  weil Excel nicht weiss was du mit min meinst!  Das muss anders programmiert werden!

Wenn du die Details von VBA verstehst könnten wir versuchen beide zusammen den code ans laufen zu bekommen.  würde mich freuen!
So, genug für heute, Abendessen ....

mfg Gast 123

Code:
Sub Phyton_Code()
zyklen = 100
zykluszeit = 80
maxnegativ = 6

reichweite = np.Array(220, 238, 238, 238, 238, 249, 257, 257, 308, 367, 367, 469)
startwerte = np.Copy(reichweite)

Debug.Print (reichweite)

For Each i In Range(zyklen)

    reihenfolge = np.argsort(reichweite)

    For Each j In Range(Len(reichweite))
        If reichweite(j) > 0 Then
           reichweite(j) = zykluszeit    'Was bedeutet -= vor zykluszeit??
        ElseIf j = reihenfolge(Min(maxnegativ, Len(reichweite))) Then
           reichweite(j) = reichweite(j) + startwerte(j) - zykluszeit
        Else
           reichweite(j) = zykluszeit
        End If  '  Wo gehört das End If hin
    bext j
 
    For Each k In Range(Len(reichweite))
      If np.Abs(reichweite(k)) > startwerte(k) Then
         Debug.Print ("UNTERSCHREITUNG DES STARTWERTES IM NEGATIVEN NACH ZYKLUS: " + Str(i + 1))
         Exit Sub   'break = 'Abbrechen   '???
      End If
    Next k
 
Next i
  Debug.Print (reichweite)
End Sub
Antworten Top
#6
Moin,

Danke du hast mich schon ein ordentliches Stück weiter gebracht den Code in Excel zu übertragen. Ich bin gerade noch am Ausprobieren und versuche zu überlegen, wo das End if hinkommen muss. 

Zu deinen Fragen:
np beschreibt einen Vektor bzw. ein Array. Hier die Werte welche in der Klammer angegeben sind. Wenn man das auf Excel übertragen würde, müsste man einfach dieses ganze np (numpy) weglassen und einfach die ganze Spalte B nehmen und diese als Startwerte festlegen. 

Die letzte Zeile des Codes sagt einfach aus, dass die Berechnung abgebrochen werden soll, wenn ein negativer Startwert erreicht wird. Dies kann aber in Excel auch erstmal rausgelassen werden. Das -= kann in Excel durch ein einfaches - ersetzt werden.

Eigentlich ist mein einziges Problem noch diesen Befehl reihenfoilge(MIn... in Excel umzusetzen. Hier probiere ich gerade ein paar Sachen aus. Verstehst du denn was mit diesem Befehl erreicht wird?

Grüße
Antworten Top
#7
Hallo

freut mich das mein Versuch dir weitergeholfen hat.  Min sagt mir hier nichts, ich weiss aber das es Minimum ist!   Schau bitte mal diesen Befelhl an:
a = WorksheetFunction.Min()   ob der dir weiterhilft.  Dazu gibt es genaue Dateils im Microsoft Center.

Wenn du np als Bereich festlegen willst, oder die Daten laden willst, empfiehlt es sich über lz=LastZelle zu machen. Ich mache es üblicherweise so:

mfg Gast 123

Code:
Sub test()
a = WorksheetFunction.Min(xxx)
'Lastzell vom Tabelleende nach oben suchen
lz = Cells(Rows.Count, 1).End(xlUp).Row   '1=Spalte A
Set Rng = Range("B2:B" & lz) 'legt einen Range Bereich fest
np = Rng.Value               'lädt Daten aus Range in Array
End Sub
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste