Office: Unterprogrammtechnik Wertrückgabe an Hauptprogramm falsch

Helfe beim Thema Unterprogrammtechnik Wertrückgabe an Hauptprogramm falsch in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; von Storax Unsinn, es gilt immer noch mein erster Link. Vorsicht; Schleife *biggrin.gif* von Storax Erläuterung, zwar Englisch aber IMHO sehr gut... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von stau, 7. September 2019.

  1. Unterprogrammtechnik Wertrückgabe an Hauptprogramm falsch


    Vorsicht; Schleife *biggrin.gif*

    Jetzt erinnere ich mich, woher ich diesen Artikel habe.
    Fettes Like dafür.
     
  2. Hallo Mase,

    Hier die wesentlichen Codes:

    Sub HProg()
    Dim zf As Integer
    zf = 3
    UProg zf
    ´***********
    ´ Zum Testen

    MsgBox "Ausgangswert zf: " & zf
    If zf > 3 Then
    Antwort = MsgBox("Fehler", 4, _
    "Es liegt mindestens ein Fehler vor")
    End If
    End Sub

    Private Sub UProg (ByRef zf As Integer)
    zf = 3
    ( danach in einer Schleife Prüfvorgänge, aufgrund derer die Variable zf bei Auffinden jeder Fehlerkonstellation um 1 erhöht wird.)
    If XY then
    zf = zf + 1
    End If
    ‘***** zum Testen ***********
    MsgBox "Endwert in UPro:" & zf
    End Sub

    Dass ich im aufrufenden Programm noch die Variabel auf 3 setze, ist vermutlich Unsinn.
    Wie ich schrieb: So läuft das. Sobald ich Integer durch Long ersetze, erhalte ich die genannte Fehlermeldung, die (@EarlFred) keine Code-Nr. hat.
    Durch die hilfsweise eingesetzten Msgbox-Anweisungen sehe ich, dass die Wertübergabe funktioniert.
     
  3. Bitte Option Explicit benutzen und den ganzen Code posten.
    Und das bitte in Code Tags!

    X und Y sind nicht deklariert, jedenfalls nicht im obigen Code.

    @Mase: Gerne und wahrscheinlich Endlosschleife :-)
     
  4. Unterprogrammtechnik Wertrückgabe an Hauptprogramm falsch

    Hallo Storax,
    Option Explicit habe ich selbstverständlich verwendet, jedoch unterlassen, das mit zu posten.
    Mit X und Y wollte ich lediglich andeuten, dass auf Basis gewisser Bedingungen im VBA dieser Zähler erhöht wird.
    Mit meinen Msgbox-Anweisungen wurde mir ja bestätigt, dass bei Verwendung von Integer alles korrekt abläuft.

    Meine beiden doch etwas umfangreicheren Programme möchte ich nicht komplett im Forum publizieren. Da bitte ich Dich um Verständnis. Gäbe es eine Möglichkeit, die Codes Dir direkt zuzuleiten? Ich weiß, dass dies eine Zumutung ist und will Dir diesen Prüfaufwand gar nicht zumuten.

    Gibt das, was ich zuletzt gepostet habe, schon etwas her, was auf eine Fehlerquelle deutet?

    Erlaube mir als Laie noch die Frage: Was bedeutet und wie erstellt man "in Code Tags"?

    Auf jeden Fall möchte ich hier mal zum Ausdruck bringen, dass ich meine Kenntnisse mit Hilfe der Fachleute hier im Forum schon erheblich erweitert habe und danke auch Dir an dieser Stelle.
     
  5. Code in Code Tags (oben im Editor Fenster der Forensoftware auswählen oder manuell eingeben)Dieser Code läuft bei mir wie erwartet
    Code:
    Dieser Code läuft wie erwartet nicht
    Code:
     
  6. Hallo Storax,

    Ei der Daus!
    Ich dachte, dass ich zuvor einen solch blöden Fehler nicht eingebaut hätte, sondern da, wo jetzt Integer steht auch überall Long stehen gehabt hätte.

    Jetzt habe noch einmal (bzw. 2x) Integer durch Long ersetzt - und es läuft.
    Es tut mir leid, Dir Deine Zeit durch meine Unachtsamkeit geklaut zu haben.

    Herzlichen Dank.
     
  7. Hallo Horst,

    um Deine Verwirrung mal zu komplettieren ... Du rufst zwar ein Unterprogramm auf, aber es wird kein Wert zurückgegeben. Was Du machst ist die Manipulation eines Wertes an einer bestimmten Stelle im Speicher, auf die sowohl Dein Hauptprogramm, wie auch Deine Unter-Sub zugreifen. Das machst Du mit byRef, was unnötig ist, da byRef der Standard ist. Das Gegenstück ist byVal, womit für das Unterprogramm eine Kopie des Wertes aus dem Hauptprogramm an das Unterprogramm übergeben wird.

    Hier mal Dein Code aufs nötigste entrümpelt, um zu veranschaulichen, was der Unterschied von byRef und byVal ist.

    byRef:
    Code:
    Code:
    Als erstes wird der Wert für zf aus dem Hauptprogramm in einer MessageBox ausgegeben: 3
    Dann folgt die Ausgabe des Wertes im Unterprogramm: 4
    Zum Schluss die Ausgabe des Wertes im Hauptprogramm: 4

    Wie Du siehst, sind die beiden Endwerte gleich 4. Das liegt am byRef und der Tatsache das sowohl das Haupt- wie auch Unterprogramm auf die gleiche Speicherstelle zugreifen, wie ich eingangs erläutert habe.

    Das byRef die Standardeinstellung ist, kannst Du einfach prüfen, indem Du den Zusatz im Kopf des Unterprogramms weglässt. Es werden exakt die gleichen Werte angezeigt (Das Hauptprogramm bleibt gleich):
    Code:
    Übergibst Du hingegen byVal, wird wie gesagt mit einer Kopie als übergebenem Wert gearbeitet (Das Hauptprogramm bleibt wieder gleich):
    Code:
    Die Ausgabe ist nun folgende:
    Ausgangswert im Hauptprogramm: 3
    Endwert im Unterprogramm: 4
    Endwert im Hauptprogramm: 3

    Wie leicht zu erkennen ist, verfällt der Wert beim Aufruf mit byVal einfach wieder. Du kannst ihn nicht im Hauptprogramm verwenden, weil er eben nicht zurückgegeben wird. Willst Du Werte aus einem Unterprogramm zurückgeben, musst Du statt mit Sub, mit Function arbeiten, die ihrerseits einen Rückgabetyp zugewiesen bekommt:
    Code:
    Code:
    Das steht zwar auch alles noch ausführlicher in den Links, die die Kollegen Dir bereits genannt haben, aber ich dachte vielleicht wird es anschaulicher für Dich, wenn Du es anhand Deines eigenen Beispiels erklärt bekommst.

    Es gibt natürlich noch mehr zu Unterprogrammen zu wissen, z.B. zur Sichtbarkeit von Variablen, aber ich denke, wenn Du diesen Mechanismus erstmal verstanden hast, kannst Du den nächsten Schritt immernoch gehen. Fragen dazu kommen dann auch automatisch.

    Viele Grüße,

    Zwenn
     
  8. Unterprogrammtechnik Wertrückgabe an Hauptprogramm falsch

    Hallo Zwenn,

    Mir ist schon fast peinlich, welche Mühe Ihr Euch mit mir macht.

    Dass byRef überflüssig ist, wusste ich sogar. :-)
    Deine Beispiele sind sehr übersichtlich und gut für mich zu verstehen.
    So wie Du es beschrieben hast in Deinem byRef-Beispiel, habe ich es ja nun geschrieben.

    Jetzt habe ich auch noch byRef weggelassen und wie zu erwarten ist das Ergebnis immer noch korrekt.
    Vielen Dank.
     
  9. Den CODE, der den Fehler verursacht, wollte ich sehen!

    Genau deswegen.

    Würde mich die FehlerNUMMER oder FehlerBESCHREIBUNG interessieren, würde ich danach fragen.
     
  10. Hallo EarlFred,

    Entschuldige. Ich hatte das falsch verstanden.
    Hat sich nun aber erledigt, weil ich wie schon geschrieben vermutlich einmal Integer und zum anderen Long codiert hatte.
     
  11. Hi,

    eine Anmerkung von mir: wenn ein Unterprogramm übergebene Variablen verändert, dann ist es nur sehr schwer irgendwelche Fehler oder unerwartete Ergebnisse zurück zu verfolgen. Besser ist es, in so einem Fall keine Sub sondern eine Function zu verwenden.

    Vor allem kann man dann Variablen wesentlich flexibler übergeben. So würde z.B. ein Programm wie Code:
    auch funktionieren, wenn Integerwerte oder sogar Double an X oder Y übergeben werden.
     
  12. \@HKindler: Funktioniert eben nicht, wenn ByRef übergeben wird. Und das ist der Default!

    Code funktioniert wie erwartet nicht
    Code:
    Was Du meinst ist Übergabe ByVal. Code funktioniert, wie erwartet
    Code:
    Aber grundsätzlich hast Du Recht, Macromastery
     
  13. Unterprogrammtechnik Wertrückgabe an Hauptprogramm falsch

    Hi Storax,

    upps *upps stimmt, du hast recht. genau das habe ich gemeint, allerdings das ByVal beim Tippen unterschlagen. Man sollte das doch immer erst im VBE eintippen und testen.
     
  14. Der Vorteil von ByRef besteht doch gerade auch darin, dass es eben keinen Typ-Mischmasch gibt (und wenn doch mal gewünscht, dann eher mit Variant). Wenn die vorstehende Beispielfunktion einen übergebenen Double-Wert in Long wandelt (rundet), wundert man sich auch, wenn die Nachkommastellen verschluckt werden.
    Es liegt doch in der Hand des Programmiers, eben die Argumente nicht zu ändern, dann spricht nämlich überhaupt nichts gegen die Verwendung und es entsteht kein Fehler, wenn Argumente falsch geklammert übergeben werden. Ergebnisse liefert eben der definierte Rückgabewert der Funktion.
     
  15. Das hat jetzt eher mit dem Casting von VBA zu tun.
    Dafür gibt es in VB.NET Option Strict On

    Wie immer gilt: Man sollte wissen, was man tut *mrcool
     
Thema:

Unterprogrammtechnik Wertrückgabe an Hauptprogramm falsch

Die Seite wird geladen...
  1. Unterprogrammtechnik Wertrückgabe an Hauptprogramm falsch - Similar Threads - Unterprogrammtechnik Wertrückgabe Hauptprogramm

  2. Vergleich zweier Tabellen und Wertrückgabe

    in Microsoft Excel Hilfe
    Vergleich zweier Tabellen und Wertrückgabe: Guten Tag, ich benötige Hilfe bei einer Vergleichsaufstellung: Zwei Tabellen (1+2) geben in einer Spalte Registrierungsnummern wieder und in einer zweiten Spalte Beträge. Ich benötige eine...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden