Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1056to1060
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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?

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
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
Anzeige
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
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
AW: Anmerkung
13.03.2009 20:40:14
Tobias
ich las und lernte.
besten dank.
und have a good beer.
greez from graz.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige