thl1966
Goto Top

VBS: Mehrere Rückgabewerte einer Funktion -. Wie geht das?

Hallo an alle Forenteilnehmer,

wie kann ich einer VBS-Funktion mehrere Rückgabeparameter liefern lassen.

Hinergrund:

Habe eine VBS-Funktion geschrieben, die den Standort, die Stadt etc. aus den OUs liest.

Übergabeparameter sind keine

Rückgabeparameter sind vier String-Variablen.

Bei einer einzelnen Variable weiß ich das?

Muss ich das evtl. über ein Rückgabe-Array lösen?

Wenn ja, was muss ich in meiner Funktion wie schreiben und was in meinem Hauptprogramm?

Vielen Dank im Voraus!

Thomas

Content-Key: 207778

Url: https://administrator.de/contentid/207778

Printed on: April 23, 2024 at 15:04 o'clock

Member: SlainteMhath
SlainteMhath Jun 10, 2013 at 13:11:33 (UTC)
Goto Top
Moin,

Ja, das geht über Array - in etwa so:

dim y(4)
y=blubb()

function blubb() 
   dim x(4)
   blubb=x
end function

lg,
Slainte
Member: thl1966
thl1966 Jun 10, 2013 at 13:30:21 (UTC)
Goto Top
Hallo Slainte,

danke für die Info.

Wie kann ich die 4 Variablen mit Werte zurückgeben.

Beispiel

In Funktion:

Var1 = "Wert1"
Var2 = "Wert2"
Var3 = "Wert3"
Var4 = "Wert5"

Wie sieht der Aufruf außerhalb der Funktion aus und in der letzten Zeile der Funktion?

lg
Thomas
Member: SlainteMhath
SlainteMhath Jun 10, 2013 at 13:35:00 (UTC)
Goto Top
Hier wird der Umgang mit Arrays in VBScript ausführlich erklärt.
Member: thl1966
thl1966 Jun 10, 2013 at 13:40:30 (UTC)
Goto Top
Danke dir für den Link.

Das schau ich mir mal an.

Der Umgang mit Array ist mir im Allgemeinen klar, nur bei der Rückgabe von einer Funktion aus.

Mein erster Test war wie folgt:

Funktion Test1()
..Code..
..Code..

DIM ArrayRueckgabeWerte(4)
Test1 = join(ArrayRueckgabeWerte(Var1,Var2,Var3, Var4)
End Function


Aufruf:

DIM ArrayWerte(4)
ArrayWerte(0) = Test1

Wenn ich von 0-3 die Werte auslesen lasse, komme ich nicht an die einzelnen Werte.

Habe ich da einen Denkfehler?
Member: SlainteMhath
SlainteMhath Jun 10, 2013 at 13:45:32 (UTC)
Goto Top
Test1 = join(ArrayRueckgabeWerte(Var1,Var2,Var3, Var4)
geht nicht, Richtig ist:
  ArrayRueckgabeWerte(0)=var1;
  ArrayRueckgabeWerte(1)=var2;
....
  Test1 = ArrayRueckgabeWerte;
end function;

Aufruf:
DIM ArrayWerte(4)
ArrayWerte = Test1
Member: thl1966
thl1966 Jun 10, 2013 at 13:55:29 (UTC)
Goto Top
Bekomme leider außerhalb der Funktion einen Typenkonflikt-Fehler Code: 800A000D

Hier der Code:

Funktion .....
Code...
Code..
DIM ArrayRueckgabeStandortdaten (4)

ArrayRueckgabeStandortdaten(0) = strStandortStadt
ArrayRueckgabeStandortdaten(1) = strStandortStadtName
ArrayRueckgabeStandortdaten(2) = strStandortLand
ArrayRueckgabeStandortdaten(3) = strStandortLandName

Netzwerk_Standort_ermitteln = ArrayRueckgabeStandortdaten

End Function

Außerhalb der Funktion:

Dim ArrayWerte(4)
ArrayWerte = Netzwerk_Standort_ermitteln ' hier kommt der Fehler!
Member: bastla
bastla Jun 10, 2013 updated at 14:05:35 (UTC)
Goto Top
Hallo thl1966 und SlainteMhath!

Nur als Anmerkung: Natürlich ist die Verwendung einer Function die elegantere und programmiertechnisch zu bevorzugende Variante - einfacher ginge es aber mit einem Sub: Da in VBS ja alle Variablen global sind, genügt es, die benötigten Variablen vor dem Aufruf des Sub zu deklarieren / initialisieren, und sie dann im Sub mit den Werten zu befüllen ...

Grüße
bastla

P.S.: @ thl1966: Magst Du nicht auch Deine Codeschnipsel passend hier)?
Member: thl1966
thl1966 Jun 10, 2013 at 14:12:24 (UTC)
Goto Top
Hallo Bastla,

vielen Dank für die Info.
Das hilft mir sehr.

PS: Mein Codeschnipsel ist ca. 500 Zeilen groß.
Mit ging es eigentlich nur um die Rückgabewerte.

Es sind zu vielen Firmenspezifische Dinge im Code, dass ich das nicht komplett posten kann.

Mich würde aber trotzdem interessieren, warum ich einen Typfehler bekomme?

Hast du das vielleicht eine Idee?

Gruß
Thomas
Member: thl1966
thl1966 Jun 10, 2013 at 14:19:25 (UTC)
Goto Top
Habs endlich hinbekommen, dank dem Hinweis von Bastla,

Hier der Code:

Function .....

' 4 Variablen als Array zurückgeben!

DIM ArrayRueckgabeStandortdaten (4)

ArrayRueckgabeStandortdaten(0) = strStandortLand
ArrayRueckgabeStandortdaten(1) = strStandortLandName
ArrayRueckgabeStandortdaten(2) = strStandortStadt
ArrayRueckgabeStandortdaten(3) = strStandortStadtName

Netzwerk_Standort_ermitteln = ArrayRueckgabeStandortdaten

End Function

'Dim ArrayWerte(4)

strStandortLand =Netzwerk_Standort_ermitteln

msgbox strStandortLand(0)
msgbox strStandortLand(1)
msgbox strStandortLand(2)
msgbox strStandortLand(3)


Jetzt werden die Werte einzeln außerhalb der Funktion ausgegeben.

Nochmals vielen Dank an alle.

Gruß
Thomas
Member: bastla
bastla Jun 10, 2013 updated at 22:02:30 (UTC)
Goto Top
Hallo thl1966!

Das Array ist unnötig - Du kannst unmittelbar auf "strStandortLand" etc zugreifen, wenn es die Variable(n) vor dem Aufruf der Function / des Sub im Hauptprogramm bereits gibt ...

Grüße
bastla

P.S.: Ich hoffe, die Tatsache, dass Dein geposteter Code noch immer keine passende Formatierung aufweist, liegt nicht an daran, dass Dich das Verwenden von <code>- / </code>-Tags überfordert ...
Mitglied: 76109
76109 Jun 10, 2013 updated at 15:28:21 (UTC)
Goto Top
Hallo zusammen!

Der Vollständigkeit halber noch die Luxusvarianteface-wink
Class StandortDaten
    Public Land
    Public LandName
    Public Stadt
    Public StadtName
End Class

Call Test

Sub Test()
    With GetStandortDaten()
        MsgBox .Land
        MsgBox .LandName
        MsgBox .Stadt
        MsgBox .StadtName
    End With
End Sub

Function GetStandortDaten()
    Set GetStandortDaten = New StandortDaten
    
    With GetStandortDaten
        .Land = "Ein Land"  
        .LandName = "Ein LandName"  
        .Stadt = "Eine Stadt"  
        .StadtName = "Ein StadtName"  
    End With
End Function

Gruß Dieter
Member: Friemler
Friemler Jun 10, 2013 at 19:55:41 (UTC)
Goto Top
...und damit wir wirklich komplett sind: Es gibt auch noch die Möglichkeit, die Parameter einer Function/Sub als ByRef zu deklarieren:

Sub Test(ByRef strStandortStadt, ByRef strStandortStadtName, ByRef strStandortLand, ByRef strStandortLandName)
  strStandortStadt = "ABC"  
  strStandortStadtName = "DEFG"  
  strStandortLand = "USA"  
  strStandortLandName = "ASU"  
End Sub

Stichwort: Call by Reference

Gruß
Friemler
Member: bastla
bastla Jun 10, 2013 updated at 20:22:48 (UTC)
Goto Top
... und als Beispiel für die Verwendung:
Test Stadt, StadtName, Land, LandName
WScript.Echo StadtName & " in " & Land  
Grüße
bastla
Member: Biber
Biber Jun 10, 2013 updated at 20:35:14 (UTC)
Goto Top
und damit wir ganz, ganz, ganz komplett sind (um @friemlers Schlusswort noch zu toppen)...

Wenn du eine Function brauchst mit mehreren Rückgabewerten, dann überprüfe deinen Programmfluss und deine unterstellte Programmlogik.
Da muss ein (Denk-)fehler enthalten sein.

Wenn vermeintlich die Notwendigkeit für "mehrere Rückgabewerte" gegeben zu sein scheint, dann ist es (wenn die jeweilige Programmiersprache es zulässt) über "globale Variablen" lösbar - wa im Falle VBS ja keinen Rückschritt bedeutet (siehe bastlas Kommentar oben).

Friemlers Hinweis auf "ByRef"-Parameter-Übergabe ist auch okay, aber grundsätzlich führt diese Programmierung sehr schnell dazu, dass ganz schnell aus den oben beschriebenen 4 "Rückgabewerten" dann 4 plus ein Returnwert für "erfolgreich/Fehler" plus einen für den Fehlertext und einer für den Schweregrad des Errors...usw werden.

Versuche, dich auf einen Rückgabewert einer Funktion zu beschränken.

Grüße
Biber
Member: Friemler
Friemler Jun 10, 2013 at 21:08:12 (UTC)
Goto Top
Zitat von @Biber:
...dass ganz schnell aus den oben beschriebenen 4 "Rückgabewerten" dann 4 plus ein Returnwert für
"erfolgreich/Fehler" plus einen für den Fehlertext und einer für den Schweregrad des Errors...usw werden.

Falls aber der erste Parameter NULL ist, wird der zweite Parameter als Pointer auf eine SubSite-Structure interpretiert, über die...

Woher kenne ich das bloß? face-wink

Gruß
Friemler
Member: thl1966
thl1966 Jun 11, 2013 at 04:45:01 (UTC)
Goto Top
Danke euch alle für die wertvollen Tipps.

beschäftige mich erst seit ca. 5 Woche mit VBA. Komme sonst aus der Powershell-Ecke.

Das mit der Codeformatierung habe ich nicht gewusst. Werde es in Zukunft beachten.

Gruß

Thomas