MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Excel
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 10.09.2019, 14:03   #16
Mase
MOF Koryphäe
MOF Koryphäe
Standard

Zitat: von Storax

Unsinn, es gilt immer noch mein erster Link.

Vorsicht; Schleife

Zitat: von Storax

Erläuterung, zwar Englisch aber IMHO sehr gut

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

__________________

gruß
Marco

Feedback erwünscht.
Wie ? -> Verwende hierzu das mittlere Symbol links.
Mase ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.09.2019, 14:22   #17
stau
Threadstarter Threadstarter
MOF User
MOF User
Standard

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 X<>Y 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.

__________________

Gruß
Horst
stau ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.09.2019, 14:35   #18
Storax
MOF Koryphäe
MOF Koryphäe
Standard

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 :-)

__________________

How do I ask a good question?

In a lot questions the OP has no idea what they're doing, they've found code on the internet, mixed it around and got something. They don't understand why that something doesn't work.
Usually, in these questions, the original poster is rather clueless, helping them on the question is only spoon feeding them, and there is little to no chance the question will help anyone in the future.

Press any key to continue - or any other key to abort.

Spoon feeding: provide (someone) with so much help or information that they do not need to think for themselves.

Geändert von Storax (10.09.2019 um 14:38 Uhr).
Storax ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.09.2019, 15:08   #19
stau
Threadstarter Threadstarter
MOF User
MOF User
Standard

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.

__________________

Gruß
Horst
stau ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.09.2019, 15:21   #20
Storax
MOF Koryphäe
MOF Koryphäe
Standard

Code in Code Tags (oben im Editor Fenster der Forensoftware auswählen oder manuell eingeben)Dieser Code läuft bei mir wie erwartet
Code:

Option Explicit

Sub HProg()
    Dim zf As Long
    zf = 3
    UProg zf

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

Private Sub UProg(ByRef zf As Long)
    
    '( danach in einer Schleife Prüfvorgänge, aufgrund derer die Variable zf bei Auffinden jeder Fehlerkonstellation um 1 erhöht wird.)
    
        zf = zf + 1
    
    ' ‘***** zum Testen ***********
    MsgBox "Endwert in UPro:" & zf
End Sub
Dieser Code läuft wie erwartet nicht
Code:

Option Explicit

Sub HProg()
    Dim zf As Long
    zf = 3
    UProg zf

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

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

__________________

How do I ask a good question?

In a lot questions the OP has no idea what they're doing, they've found code on the internet, mixed it around and got something. They don't understand why that something doesn't work.
Usually, in these questions, the original poster is rather clueless, helping them on the question is only spoon feeding them, and there is little to no chance the question will help anyone in the future.

Press any key to continue - or any other key to abort.

Spoon feeding: provide (someone) with so much help or information that they do not need to think for themselves.

Geändert von Storax (10.09.2019 um 15:24 Uhr).
Storax ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.09.2019, 15:35   #21
stau
Threadstarter Threadstarter
MOF User
MOF User
Standard

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.

__________________

Gruß
Horst
stau ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.09.2019, 15:41   #22
Zwenn
Neuer Benutzer
Neuer Benutzer
Standard

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:

Sub HProg()

  Dim zf As Long
  
  zf = 3
  MsgBox "Ausgangswert zf in Hauptprogramm: " & zf
  
  UProg zf
  
  MsgBox "Endwert zf in Hauptprogramm: " & zf
End Sub
Code:

Private Sub UProg(ByRef zf As Long)

  zf = zf + 1
  MsgBox "Endwert in UPro: " & zf
End Sub
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:

Private Sub UProg(zf As Long)

  zf = zf + 1
  MsgBox "Endwert in UPro: " & zf
End Sub
Übergibst Du hingegen byVal, wird wie gesagt mit einer Kopie als übergebenem Wert gearbeitet (Das Hauptprogramm bleibt wieder gleich):
Code:

Private Sub UProg(ByVal zf As Long)

  zf = zf + 1
  MsgBox "Endwert in UPro: " & zf
End Sub
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:

Sub HProg()

  Dim zf As Long
  Dim zfZurueck As Long
  
  zf = 3
  MsgBox "Ausgangswert zf in Hauptprogramm: " & zf & Chr(13) & _
         "Ausgangswert zfZurueck in Hauptprogramm: " & zfZurueck
  
  zfZurueck = UProg(zf)
  
  MsgBox "Ausgangswert zf in Hauptprogramm: " & zf & Chr(13) & _
         "Endwert zfZurueck in Hauptprogramm: " & zfZurueck
End Sub
Code:

Private Function UProg(ByVal zf As Long) As Long

  zf = zf + 1
  MsgBox "Endwert in UPro: " & zf
  
  'Die Rückgabe aus einer Funktion passiert
  'über die Zuweisung eines Ausdrucks an den
  'Funktionsnamen. Wobei der Ausdruck oft
  'eine Variable ist
  UProg = zf
End Function
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
Zwenn ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.09.2019, 17:18   #23
stau
Threadstarter Threadstarter
MOF User
MOF User
Standard

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.

__________________

Gruß
Horst
stau ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.09.2019, 17:19   #24
EarlFred
MOF Guru
MOF Guru
Standard

Zitat:

erhalte ich die genannte Fehlermeldung, die (@EarlFred) keine Code-Nr. hat.

Den CODE, der den Fehler verursacht, wollte ich sehen!

Zitat:

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.

Genau deswegen.

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

__________________

Datum und Uhrzeit, Makrorekorder-Code entschlacken, {Matrixformeln}
Tutorials zu Pivottabellen: Kurzeinstieg; Dynamischer Datenbereich; Daten und Zeiten gruppieren
Für 8 meiner Beiträge haben sich die Hilfesuchenden mit einer Spende an Wikipedia, die Tafeln oder Hilfe für krebskranke Kinder eV bedankt (das entspricht 0,054% per 13.08.2019) - eine tolle Geste!

Geändert von EarlFred (10.09.2019 um 17:22 Uhr).
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.09.2019, 09:23   #25
stau
Threadstarter Threadstarter
MOF User
MOF User
Standard

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.

__________________

Gruß
Horst
stau ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.09.2019, 12:32   #26
HKindler
MOF User
MOF User
Standard

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:

Function LongPlus(x As Long, Y As Long) As Long
LongPlus = X + Y
End Function
auch funktionieren, wenn Integerwerte oder sogar Double an X oder Y übergeben werden.

__________________

Gruß,
Helmut

Win10 (64Bit) / Office365 (32Bit)
HKindler ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.09.2019, 12:54   #27
Storax
MOF Koryphäe
MOF Koryphäe
Standard

@HKindler: Funktioniert eben nicht, wenn ByRef übergeben wird. Und das ist der Default!

Code funktioniert wie erwartet nicht
Code:

Option Explicit

Function LongPlus(x As Long, Y As Long) As Long
    LongPlus = x + Y
End Function

Sub test()
    Dim i As Integer
    Dim j As Integer
    
    i = 42
    j = 1

    Dim res As Long
    res = LongPlus(i, j)
    Debug.Print res

End Sub
Was Du meinst ist Übergabe ByVal. Code funktioniert, wie erwartet
Code:

Option Explicit

Function LongPlus(ByVal x As Long, ByVal Y As Long) As Long
    LongPlus = x + Y
End Function

Sub test()
    Dim i As Integer
    Dim j As Integer
    
    i = 42
    j = 1

    Dim res As Long
    res = LongPlus(i, j)
    Debug.Print res

End Sub
Aber grundsätzlich hast Du Recht, Macromastery

Zitat:

You should avoid passing basic variable types using ByRef. There are two main reasons for this:

The person passing a value may not expect it to change and this can lead to bugs that are difficult to detect.
Using parentheses when calling prevents ByRef working – see next sub section

__________________

How do I ask a good question?

In a lot questions the OP has no idea what they're doing, they've found code on the internet, mixed it around and got something. They don't understand why that something doesn't work.
Usually, in these questions, the original poster is rather clueless, helping them on the question is only spoon feeding them, and there is little to no chance the question will help anyone in the future.

Press any key to continue - or any other key to abort.

Spoon feeding: provide (someone) with so much help or information that they do not need to think for themselves.

Geändert von Storax (11.09.2019 um 13:00 Uhr).
Storax ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.09.2019, 13:03   #28
HKindler
MOF User
MOF User
Standard

Hi Storax,

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.

__________________

Gruß,
Helmut

Win10 (64Bit) / Office365 (32Bit)
HKindler ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.09.2019, 13:27   #29
EarlFred
MOF Guru
MOF Guru
Standard

Zitat:

auch funktionieren, wenn Integerwerte oder sogar Double an X oder Y übergeben werden.

Zitat:

You should avoid passing basic variable types using ByRef. There are two main reasons for this:

The person passing a value may not expect it to change and this can lead to bugs that are difficult to detect.
Using parentheses when calling prevents ByRef working – see next sub section

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.

__________________

Datum und Uhrzeit, Makrorekorder-Code entschlacken, {Matrixformeln}
Tutorials zu Pivottabellen: Kurzeinstieg; Dynamischer Datenbereich; Daten und Zeiten gruppieren
Für 8 meiner Beiträge haben sich die Hilfesuchenden mit einer Spende an Wikipedia, die Tafeln oder Hilfe für krebskranke Kinder eV bedankt (das entspricht 0,054% per 13.08.2019) - eine tolle Geste!
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.09.2019, 15:54   #30
Storax
MOF Koryphäe
MOF Koryphäe
Standard

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

__________________

How do I ask a good question?

In a lot questions the OP has no idea what they're doing, they've found code on the internet, mixed it around and got something. They don't understand why that something doesn't work.
Usually, in these questions, the original poster is rather clueless, helping them on the question is only spoon feeding them, and there is little to no chance the question will help anyone in the future.

Press any key to continue - or any other key to abort.

Spoon feeding: provide (someone) with so much help or information that they do not need to think for themselves.
Storax ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:58 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.