PDA

Vollständige Version anzeigen : funtionen: variabeln die mit byRef übergeben wurden ändern


clemix
14.03.2009, 12:15
Hallo,
ich versuche mich gerade an einer Funktion mit der ich gerne globale Variabeln ändern würde.

ich hab mir das so geacht:


Option Compare Database
Option Explicit

Dim var1 As Integer

Sub funktion(ByRef para1 As Integer)

para1 = 1

End Sub

Private Sub Befehl0_Click()

var1 = 4
funktion (var1)
MsgBox var1

End Sub



Eigentlich müsste er doch jetzt 1 ausgeben und nicht 4, oder??

was mach ich da falsch?

gruß: clemix

Nepumuk
14.03.2009, 12:33
Hallo clemix,

das Problem sind die Klammern um var1. Die bewirken nämlich folgendes:

Call funktion ((var1))

Mit den Klammern erzwingst du 1. eine Typenkonvertierung (auch wenn es nichts zu konvertieren gibt) und 2. eine Übergabe ByVal aus der aufrufenden Prozedur heraus.

Also:

entweder auf die Klammern verzichten: funktion var1

oder die Prozedur anständig aufrufen: Call funktion(var1)

clemix
14.03.2009, 16:19
hey danke, soweit versteh ich des aber:
Wie schreib ich das, wenn ich gerne hätte, das die Funktion etwas zurückgibt,
und ich ihr mehrere Parameter geben will, einen davon als Ref?


gruß

Nepumuk
14.03.2009, 16:57
Hallo,

eine Function kann nur einen Wert zurückgeben, du kannst ihr aber bis zu 30 Werte übergeben. Wenn du mehrere Werte zurück haben willst, dann musst du eine "normale" Sub-Routine benutzen.

Beispiel für die Anwendung einer Function:

<nobr><span style="font-family:Courier New,Arial; font-size:9pt ;" ><b><span style="color:#000080"; >Public</span> <span style="color:#000080"; >Sub</span> Beispiel1()</b><br />&nbsp;&nbsp;&nbsp;&nbsp;MsgBox Multiply(10, 5)<br /><b><span style="color:#000080"; >End</span> <span style="color:#000080"; >Sub</span></b><br /><br /><b><span style="color:#000080"; >Private</span> <span style="color:#000080"; >Function</span> Multiply(dblValue <span style="color:#000080"; >As</span> Double, dblMultiplier <span style="color:#000080"; >As</span> <span style="color:#000080"; >Double</span>) <span style="color:#000080"; >As</span> <span style="color:#000080"; >Double</span></b><br />&nbsp;&nbsp;&nbsp;&nbsp;Multiply = dblValue * dblMultiplier<br /><b><span style="color:#000080"; >End</span> <span style="color:#000080"; >Function</span></b><br /></span></nobr>

Die übergebenen Werte sind in diesem Fall Konstanten. Du kannst aber natürlich auch Variablen übergeben, du musst nur darauf achten, dass die Datentypen der aufrufenden Prozedur mit denen der aufgerufenen übereinstimmen.

Die Übergabe aus deinem ersten Posting macht übrigens gar keinen Sinn, da du die Variable als öffentlich deklariert hast, ist sie sowieso in allen Prozeduren der Projektes bekannt.

Die Übergabe ByRef ist Standard, und muss nicht angegeben werden. Nur Übergaben ByVal musst du explizit angeben. Wobei die Übergabe ByRef schneller ist als die ByVal, da hier nur der Pointer (die Speicheradresse) in Stackframe (Arbeitsspeicher) übergeben wird. Mit der Methode ByVal muss erst eine weitere Variable angelegt und der Wert des Parameters reingeschrieben werden.

ebs17
14.03.2009, 18:11
Vergleiche Anlage: