Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Argumenttyp byRef unverträglich

Forumthread: Argumenttyp byRef unverträglich

Argumenttyp byRef unverträglich
13.03.2009 18:01:33
Tobias
Hallo allerseits,
wieso klappt das ohne probleme:
WaitShell ftp_command, vbMinimizedNoFocus, 120, True
wohingegen dies hier
dim showshell as string
showshell = vbMinimizedNofocus
WaitShell ftp_command, showshell, 120, True
zum Fehler führt (siehe Betreff)
Hab auch schon versucht als variant zu definieren, bzw. unter anführungszeichen zu setzen, keine änderung.
any help?
Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Argumenttyp byRef unverträglich
13.03.2009 18:19:07
Nepumuk
Hallo,
weil die Funktion einen Parameter vom Typ Long erwartet. Macht ja auch keinen Sinn, eine Zahl in einen String zu packen.
Gruß
Nepumuk
AW: Argumenttyp byRef unverträglich
13.03.2009 18:23:03
Tino
Hallo,
Argumenttyp byRef unverträglich
Kommt normalerweise wenn man versucht eine Variablen zu übergeben,
die einen anderen Typ entspricht.
Hier zwei Beispiele.
Falsch
Function Test(ByRef Wert As Long)
 Wert = Wert * 50
End Function

Sub TestMakro()
Dim Wert
Wert = 8
Test Wert
MsgBox Wert
End Sub


Richtig

Function Test(ByRef Wert As Long)
 Wert = Wert * 50
End Function

Sub TestMakro()
Dim Wert As Long
Wert = 8
Test Wert
MsgBox Wert
End Sub


Gruß Tino

Anzeige
Anmerkung
13.03.2009 18:32:32
Tino
Hallo,
ByRef bedeutet, dass sich die Werte auch in der aufrufenden Prozedur ändern,
dies muss man bei der Deklarierung in der Prozedur mit angeben.
Gegenstück ist ByVal
Diese Einstellung ist Standard und muss nicht angegeben werden.
Hier ändern sich die Werte in der aufrufenden Prozedur nicht, behalten also ihren ursprungswert.
Ich hoffe das ist richtig erklärt, nicht dass ich jetzt schimpfe von den Profis bekomme. ;-)
Gruß Tino
Anzeige
ist genau umgekehrt ;-) sorry oT.
13.03.2009 18:41:19
Tino
Nein ist nicht umgekehrt!
13.03.2009 18:59:32
Renee
Hi Tino,
nur der Ausdruck Werte auch in der aufrufenden Prozedur ändern, ist etwas verwirrend.
Es könnte heissen:
Wenn die aufgerufene Prozedur einen ByRef-Variable ändert, so wird diese in der aufrufenden Prozedur geändert!
GreetZ Renée
AW: Richtig, ein bisschen ausführlicher
13.03.2009 18:54:26
Renee
Hi Tino,
Im Prinzip stimmt die Erkärung so. ByRef ist nix anderes wie ein Zeiger auf die 'MemoryPosition', gibt also dem Empfänger direkt die Möglichkeit in diese zu schreiben. ByVal es wird der Wert übergeben und dieser in der lokalen Prozedur an einen neue 'MemoryPosition' geschrieben.
Kleine Demo:

Sub X()
Dim xy As String
xy = "HELLO WORLD"
MsgBox "Calling Y [byVal] with:" & xy, vbOKOnly, "Sub X"
Call Y(xy)
MsgBox "Return from Y is now:" & xy, vbOKOnly, "Sub X"
MsgBox "Calling Z [byRef] with:" & xy, vbOKOnly, "Sub X"
Call Z(xy)
MsgBox "Return from Z is now:" & xy, vbOKOnly, "Sub X"
End Sub
Sub Y(ByVal xy As String)
MsgBox "xy is now: " & xy & vbCrLf & _
"will be set to: HELLO MOON", vbOKOnly, "Sub Y"
xy = "HELLO MOON"
End Sub
Sub Z(ByRef xy As String)
MsgBox "xy is now: " & xy & vbCrLf & _
"will be set to: HELLO MOON", vbOKOnly, "Sub Z"
xy = "HELLO MOON"
End Sub


GreetZ Renée

Anzeige
AW: Anmerkung
13.03.2009 19:02:23
Nepumuk
Hallo Tino,
das ist schon richtig so!!!
ByRef übergibt der aufgerufenen Prozedur die Speicheradresse der Variablen. ByVal legt eine neue Varianble an, in welche der Wert geschrieben wird. Konstanten werden aber trotz ByRef und Änderung in der aufgerufenen Prozedur, in der Aufrufenden Prozedur nicht geändert. Konstanten werden anscheinend automatisch ByVal übergeben auch wenn ich es anders angegebe.
Public Sub Test1()
    Const Konstante = 1
    Call Test2(Konstante)
End Sub

Public Sub Test2(ByRef Wert As Long)
    Wert = 999
End Sub

Du kannst übrigens die Typenkonvertierung auch erzwingen:
Public Sub Test1()
    Dim strVariable As String
    strVariable = "1"
    Call Test2((strVariable))
End Sub

Public Sub Test2(ByRef lngWert As Long)
    Debug.Print lngWert
End Sub

Das hat allerdings zur Folgen, dass eine solche Übergabe wieder automatisch ByVal erfolgt:
Public Sub Test1()
    Dim lngVariable As Long
    Call Test2((lngVariable))
    Debug.Print lngVariable
    Call Test2(lngVariable)
    Debug.Print lngVariable
End Sub

Public Sub Test2(ByRef Wert As Long)
    Wert = 999
End Sub

Da ist noch viel Dunkel wo gleißendes Licht sein sollte.
Gruß
Nepumuk
Anzeige
AW: Anmerkung
13.03.2009 19:18:03
Tino
Hallo,
na mit den Fachbegriffen kann ich nicht so um mich schmeißen,
aber ich weis wie man damit umgehen kann. (hoffe ich zumindest) ;-)
Ich meinte was Standard und was nicht Standard ist,
sorry wenn ich mich da ungeschickt ausgedrückt habe.
ByRev ist Standard
ByVal muss man angeben.
Gruß Tino
Anzeige
ByRev ist Standard, oh no...
13.03.2009 19:49:43
so
ByRef
ohne Worte
13.03.2009 20:01:46
Tino
Sub Ref_Test1(ByRef Wert As Long)
 Wert = Wert * 10
End Sub

Sub Ref_Test2(Wert As Long)
 Wert = Wert * 10
End Sub

'________________________________________
 
Sub Test1()
Dim Wert As Long
Wert = 8
 Ref_Test1 Wert

 MsgBox Wert
End Sub

Sub Test2()
Dim Wert As Long
Wert = 8
 Ref_Test2 Wert

 MsgBox Wert
End Sub


Anzeige
AW: ohne Worte
13.03.2009 20:04:23
robert
hi tino,
du hast ByRev geschrieben, darauf die nachricht
oh no
gruß
robert
gehe Bier trinken, wer kommt mit? oT.
13.03.2009 20:07:01
Tino
treffpunkt ? (in wien) owT
13.03.2009 20:11:26
robert
Anzeige
AW: Anmerkung
13.03.2009 20:40:14
Tobias
ich las und lernte.
besten dank.
und have a good beer.
greez from graz.
;
Anzeige

Infobox / Tutorial

Argumenttyp ByRef unverträglich in Excel VBA verstehen


Schritt-für-Schritt-Anleitung

  1. Verstehe den Unterschied zwischen ByRef und ByVal:

    • ByRef übergibt eine Referenz auf die Variable, sodass Änderungen in der aufgerufenen Prozedur auch die ursprüngliche Variable beeinflussen.
    • ByVal übergibt den Wert der Variable, was bedeutet, dass Änderungen keine Auswirkungen auf die ursprüngliche Variable haben.
  2. Überprüfe die Deklaration deiner Variablen:

    • Stelle sicher, dass die Datentypen übereinstimmen. Wenn eine Funktion beispielsweise ByRef Wert As Long erwartet, muss die übergebene Variable ebenfalls vom Typ Long sein.
  3. Beispiel zur Verwendung:

    Sub Beispiel()
       Dim Wert As Long
       Wert = 5
       Test Wert
       MsgBox Wert ' zeigt 10, da Wert in Test geändert wurde
    End Sub
    
    Sub Test(ByRef Wert As Long)
       Wert = Wert * 2
    End Sub

Häufige Fehler und Lösungen

  • Fehler: Argumenttyp ByRef unverträglich: Dieser Fehler tritt auf, wenn du eine Variable übergibst, die nicht mit dem erwarteten Typ übereinstimmt.

    • Lösung: Überprüfe die Variablendeklaration. Achte darauf, dass du den korrekten Datentyp verwendest.
  • Fehler: Typkonvertierung: Manchmal kann es notwendig sein, die Typen explizit zu konvertieren, um den Fehler zu vermeiden.

    • Lösung: Verwende CStr(), CInt(), CLng() etc. um Typen zu konvertieren.

Alternative Methoden

  • Verwendung von ByVal statt ByRef: Wenn du nicht möchtest, dass die ursprüngliche Variable verändert wird, kannst du ByVal verwenden.

  • Erzwinge die Typenkonvertierung:

    Call Test2(CLng(Wert))
  • Verwende Variant: Wenn du unsicher bist, kannst du die Variable als Variant deklarieren. Dies kann jedoch zu weiteren Komplikationen führen und sollte mit Bedacht eingesetzt werden.


Praktische Beispiele

Beispiel 1: Falsche Verwendung von Typen

Sub Test1()
    Dim Wert As String
    Wert = "5"
    Test2 Wert ' Fehler: Argumenttyp ByRef unverträglich
End Sub

Sub Test2(ByRef Wert As Long)
    Wert = Wert + 5
End Sub

Beispiel 2: Richtige Verwendung von ByRef

Sub Test3()
    Dim Wert As Long
    Wert = 5
    Test3 Wert ' Korrekte Verwendung
    MsgBox Wert ' Ausgabe: 15
End Sub

Sub Test3(ByRef Wert As Long)
    Wert = Wert + 10
End Sub

Tipps für Profis

  • Dokumentiere deine Funktionen: Klare Kommentare helfen anderen (oder dir selbst später), den Code besser zu verstehen.
  • Vermeide unnötige Typenkonvertierungen: Halte deine Variablen vom richtigen Typ, um die Performance zu optimieren und Fehler zu vermeiden.
  • Teste deinen Code regelmäßig: Verwende Debugging-Tools, um schnell zu erkennen, wo der Fehler auftritt.

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen ByRef und ByVal? ByRef gibt eine Referenz auf die originale Variable weiter, sodass Änderungen innerhalb der Funktion auch die originale Variable beeinflussen. ByVal hingegen übergibt nur den Wert, sodass die originale Variable unverändert bleibt.

2. Wie kann ich den Fehler "Argumenttyp ByRef unverträglich" vermeiden? Achte darauf, dass die Datentypen der Variablen übereinstimmen. Verwende den richtigen Datentyp bei der Deklaration und beim Aufruf der Funktion.

3. Was passiert, wenn ich eine Konstante an eine ByRef-Funktion übergebe? Konstanten werden in der Regel automatisch als ByVal behandelt, das bedeutet, dass Änderungen an der Konstante in der aufgerufenen Prozedur nicht zurückgegeben werden.

4. Kann ich ByRef mit verschiedenen Datentypen kombinieren? Nein, du solltest sicherstellen, dass der übergebene Datentyp mit dem erwarteten Datentyp übereinstimmt, um Fehler zu vermeiden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige