vba: Funktion mit For-Schleife

TossExecutor

Ensign
Registriert
Juli 2021
Beiträge
167
Ich komme gerade nicht weiter. Ein Nachprogrammierbares Beispiel kann ich jetzt leider nicht zur Verfügung zu stellen, das wäre jetzt leider zu aufwändig. Vielleicht reicht es schon, wenn ihr mal drüber schaut.

Der Ausschnitt des Codes sieht so aus:

Public Function Prognose()​
AB "Merkmal_1", TableName, Time​
AB "Merkmal_2", TableName, Time​
AB "Merkmal_3", TableName, Time​
AB "Merkmal_4", TableName, Time​
AB "Merkmal_5", TableName, Time​
AB "Merkmal_6", TableName, Time​
End Function​
Public Sub AB(ByVal Feature As String, ByVal Name As String, ByVal Time As String)​
Dim Summand1, Summand2, Summand3, Summand4 As String​
Summand1 = Str(Summand(Feature, "[1, 2)"))​
Summand2 = Str(Summand(Feature, "[2, 3)"))​
Summand3 = Str(Summand(Feature, "[3, 4)"))​
Summand4 = Str(Summand(Feature, "[4, 5]"))​
For i = 1 To Time​
Name = TableName(i)​
CreateTable i, Name​
Update Name, Feature, Summand1, Summand2, Summand3, Summand4, Str(i) 'Time​
msg = MsgBox(Feature)​
Next​
For i = 1 To Time​
Name = TableName(i)​
SetMax Name, Feature​
RoundValues Name, Feature​
Next​
End Sub​

Fast Alles funktioniert super: Mit der Update Funktion werden alle Zeileneinträge einer Spalte verändert, zu einem Merkmal. Danach wird ein Maximum gesetzt und die Zahlen auf zwei Nachkommastellen gerundet. Auch das funktioniert einwandfrei. Aber: Aktuell wird immer nur das letzte Merkmal angewendet bzw. dort die Zeilen in der Spalte manipuliert. Konkret heißt das, dass die Spalte zu Merkmal 1-5 unverändert bleibt und nur Merkmal 6 richtig verändert wird. Wenn ich Merkmal 5 unter Merkmal 6 schiebe, wird nur Merkmal 5 verändert. Also immer nur der Letzte Aufruf der Funktion scheint zu klappen (AB "Merkmal_6", TableName, Time).

Um zu testen habe ich mit msg = MsgBox(Feature) mir den String des Merkmals mal ausgeben lassen und siehe da: die Merkmal 1-6 werden auf der untersten Ebene alle korrekt angezeigt. Für mich heißt das, dass die Übergabe funktioniert und auch das Aufrufen der Funktion an sich korrekt funktioniert. Aber dennoch wird immer nur die letzte Update Funktion scheinbar angewendet, wenn ich mir die Tabelle am Ende anschaue.

Ich stehe gerade ein bisschen auf dem Schlauch. Wenn die verschiedenen Merkmale als String nicht zurückgegeben worden wären, hätte ich es eher verstanden. So bin ich grad maximal verwirrt.

Kann man es annähernd nachvollzielen, was ich dort vorhabe? Oder hat vielleicht schon jemand eine Idee, was das Problem sein könnte?

Vielen Dank!
 
Eine Antwort kann ich jetzt leider nicht zur Verfügung zu stellen, das wäre angesichts nicht verwendeter Code-Tags, nicht verwendeter Einrückungen, ohne Minimalbeispiel, und ohne dass alle aufgerufenen Funktionen gezeigt werden, zu aufwendig.
 
BAGZZlash schrieb:
Eine Antwort kann ich jetzt leider nicht zur Verfügung zu stellen, das wäre angesichts nicht verwendeter Code-Tags, nicht verwendeter Einrückungen, ohne Minimalbeispiel, und ohne dass alle aufgerufenen Funktionen gezeigt werden, zu aufwendig.
Die Unterfunktionen hab nix mit dem Problem zu tun. Ich habe auch lediglich darum gebeten mal drüber zu schauen. Oft fällt einem etwas ein, auch wenn man kein funktionierendes Code Beispiel hat. Häufig hat man ja schon ähnliche Probleme gehabt und dann kann man einen Tipp geben, was man mal testen/überprüfen kann.

Ein fertigen Code wollte ich gar nicht. Wenn ich ein funktionierendes Minimalbeispiel schreiben würde, wäre ich ein ganzen Arbeitstag damit beschäftigt. Dann lohnt sich eine Frage zu stellen überhaupt nicht mehr.

Den kompletten Code darf ich aufgrund von Datenschutz ohnehin nicht teilen.
 
Falls jemand mal selbst in dasselbe Problem läuft: Das Problem war dieser Aufruf:
CreateTable i, Name​

Es hat wie schon vermutet alles funktioniert, allerdings hat dieser Aufruf in der ersten For-Schleife dazu geführt, dass neuen Tabellen immer wieder überschrieben wurden. Lösung war also die Erstellung der Tabellen in der obersten Ebene auszuführen.

So z.B. :
For i = 1 To Time​
n = GetTableName(i)​
CreateTable i, n​
Next​
 
Wie soll jemand in diese Situation kommen, wenn die Funktionen GetTableName und CreateTable deine eigene Kreation sind, oder habe ich hier irgendetwas übersehen?

Das ist auch der Grund warum dir keiner mit deinem Problem helfen konnte, denn es fehlen ganz essenzielle Informationen. Wenn dies allerdings in Excel eingebaute Funktionen sind, nehme ich alles zurück. Habe jetzt nicht all zu dolle danach gesucht.
 
Janush schrieb:
es fehlen ganz essenzielle Informationen
das sehe ich anders. Das war ein Logikproblem, daher muss man überhaupt nicht wissen was im Detail passiert.

Trotzdem vielen Dank fürs Reindenken :daumen:
 
Zurück
Oben