Das Clever-Excel-Forum.de - Treffen
findet vom 15. - 17. September 2017 in Friedrichroda /
Thüringen / Region Großer Inselsberg statt. Hotelbuchung ab sofort möglich.

Syntax für eine Funktion mit 2 oder mehreren Rückgabewerten
#1
Hallo liebe Experten und VBA-Granaten,

ich habe folgendes Problem mit dem Rückgabewert von Funktionen:

Code:
Sub Funk()
Debug.Print Testen(2, 2)
End Sub

Function Testen(x As Integer, y As Integer)
x = x + 10
y = 2 * y
Testen = x
End Function

Wie ihr seht werden der obigen Funktion Testen 2 Werte übergeben. Durch die Codezeile Testen = x besitzt die Funktion dann genau einen Rückgabewert. Ich möchte jetzt aber gerne wissen, was ich tun muß, damit die Funktion Testen nicht nur den neuen Wert für x, sondern auch den berechneten Wert für y zurückgibt. Also wie der Code auszusehen hat, damit die Funktion Testen statt einem, zwei Rückgabewerte besitzt.

Danke für eure Hilfe
to top
#2
Hi,

meinst Du das?

Code:
Function Testen(x As Integer, y As Integer)

x = x + 10
y = 2 * y
Testen = x & ", " & y

End Function

Gruß
Max
to top
#3
Hallöchen,

neben der Rückgabe als String kannst Du das auch als Array zurückgeben, oder Du nimmst globale variable, oder Du nutzt byref.
Ich nehme beim Dim jetzt mal keine Rücksicht auf die typen.

Code:
Dim x, y

Sub Funk()
Dim retCode

'Fuer globale Variablen
retCode = Testen1(2, 2)
Debug.Print "Testen1", x, y

'Fuer byRef
'bea: gleicher Variablentyp in Sub und Function!
u = 2: v = 2
retCode = Testen2(u, v)
Debug.Print "Testen2", u, v

'Fuer array
retCode = Testen3(2, 2)
Debug.Print "Testen3", retCode(0), retCode(1)

End Sub

Function Testen1(a As Integer, b As Integer)
x = a + 10
y = 2 * b
End Function

Function Testen2(ByRef u, ByRef v)
u = u + 10
v = 2 * v
End Function

Function Testen3(u As Integer, v As Integer)
u = u + 10
v = 2 * v
Testen3 = Array(u, v)
End Function

'usw.
   \\\|///      Hoffe, geholfen zu haben.
   ( ô ô )      Grüße, André aus G in T  
 ooO-(_)-Ooo    (Excel 97-2016)
[-] Folgende(r) 1 Benutzer sagt Danke an schauan für diesen Beitrag:
Wulfi
to top
#4
Sicher meint sie das nicht, Max,
denn du erzeugst nur einen, aus 2 Werten zusammengebastelten Rückgabewert.
Die richtige Lösung wäre hier bspw Testen = Array(x, y), wobei die UDF in Zellformeln dann als Matrixformel (über 2 nebeneinanderliegende Zellen) notiert werden muss, damit beide Werte auch angezeigt werden. Bei Aufruf in einer Subprozedur (wie hier gezeigt) muss eine Variable (hier varName) mit dem Funktionsergebnis belegt werden, für die dann der Ausdruckbefehl Debug.Print varName(1) & vbTab & varName(2) oder Debug.Print Join(varName, vbTab) lauten kann.
Gruß, Castor
[-] Folgende(r) 2 Benutzer sagen Danke an Castor für diesen Beitrag:
Rabe, Wulfi
to top
#5
Ergänzung: Alternativ kann im konkreten Fall auch ohne zusätzliche Variable gearbeitet werden. Dann muss aber Debug.Print Join(Testen(x, y), vbTab) verwendet werden, wobei im gezeigten Bsp wohl x=y=2 interpretiert werden kann.
Castor
[-] Folgende(r) 1 Benutzer sagt Danke an Castor für diesen Beitrag:
Wulfi
to top
#6
Hallo Schülerin,

es gibt da noch das Schlüsselwort ParamArray:

Code:
Sub Funk()
  Debug.Print Join(Testen(2, 2), ", ")
End Sub

Function Testen(ParamArray XY())
  XY(0) = XY(0) + 10
  XY(1) = XY(1) * 2
  Testen = XY
End Function

Gruß Uwe
[-] Folgende(r) 1 Benutzer sagt Danke an Kuwer für diesen Beitrag:
Wulfi
to top
#7
Hallo Schülerin,

hier noch mal erweitert für die Ausgabe in Zellen:

Code:
Sub Funk()
  'Debug.Print Join(Testen(2, 2), ", ")
  'Ausgabe in nebeneinanderliegenden Zellen
  Range("B2:C2").Value = Testen(2, 2)
  'Ausgabe in untereinanderliegenden Zellen
  Range("B4:B5").Value = Application.Transpose(Testen(2, 2))
End Sub

Function Testen(ParamArray XY())
  XY(0) = XY(0) + 10
  XY(1) = XY(1) * 2
  Testen = XY
End Function

Gruß Uwe
[-] Folgende(r) 1 Benutzer sagt Danke an Kuwer für diesen Beitrag:
Wulfi
to top
#8
Hallöchen,

und wenn man es flexibel haben will und in der Funktion nicht weiß, wieviel da auf einen zukommt und was gerechnet werden soll, dann so:

Code:
Sub FunkFlex()
  Debug.Print Join(TestenFlex("2+10", "2*2"), ", ")
End Sub

Function TestenFlex(ParamArray XY())
Dim iCnt
For iCnt = LBound(XY) To UBound(XY)
  XY(iCnt) = Application.Evaluate(XY(iCnt))
Next
TestenFlex = XY
End Function
   \\\|///      Hoffe, geholfen zu haben.
   ( ô ô )      Grüße, André aus G in T  
 ooO-(_)-Ooo    (Excel 97-2016)
[-] Folgende(r) 1 Benutzer sagt Danke an schauan für diesen Beitrag:
Wulfi
to top


Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  bestimmte Zeile aus mehreren Dateien in eine Tabelle kopieren Fabian1208 3 51 22.03.2017, 13:07
Letzter Beitrag: Fabian1208
  Excel 2013: Druckbereich auswählen in mehreren Tabellenblätter & dann eine pdf Datei islamash 5 99 17.03.2017, 23:14
Letzter Beitrag: schauan
  WENN Funktion mit mehreren Daten bully_on_drums 22 275 03.03.2017, 18:19
Letzter Beitrag: bully_on_drums
  Brauche bitte Formel-Syntax Wilfried 10 197 02.03.2017, 19:17
Letzter Beitrag: steve1da
  ZÄHLENWENNS mit ODER Funktion madmaddin 7 165 02.03.2017, 13:04
Letzter Beitrag: BoskoBiati
  WENN Funktion: Entweder Datum oder bestimmter Wert Ahnunglos 8 186 16.02.2017, 11:32
Letzter Beitrag: Ahnunglos
  dbmin mit 2 Variablen oder andere Funktion ? geschm 2 110 13.02.2017, 10:37
Letzter Beitrag: geschm
  sverweis oder index oder was??? hanne55 30 787 08.02.2017, 19:24
Letzter Beitrag: hanne55
  SVERSWEIS oder doch eine andere Funktion Hoshy1 4 145 26.01.2017, 15:07
Letzter Beitrag: Hoshy1
  Funktion anwenden auf bestimmte Zellen definiert durch eine Bedingung in selber Zeile Lor4x 5 172 22.01.2017, 18:25
Letzter Beitrag: atilla

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste