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-ID: 207778

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

Ausgedruckt am: 20.11.2024 um 13:11 Uhr

SlainteMhath
SlainteMhath 10.06.2013 um 15:11:33 Uhr
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
thl1966
thl1966 10.06.2013 um 15:30:21 Uhr
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
SlainteMhath
SlainteMhath 10.06.2013 um 15:35:00 Uhr
Goto Top
Hier wird der Umgang mit Arrays in VBScript ausführlich erklärt.
thl1966
thl1966 10.06.2013 um 15:40:30 Uhr
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?
SlainteMhath
SlainteMhath 10.06.2013 um 15:45:32 Uhr
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
thl1966
thl1966 10.06.2013 um 15:55:29 Uhr
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!
bastla
bastla 10.06.2013 aktualisiert um 16:05:35 Uhr
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)?
thl1966
thl1966 10.06.2013 um 16:12:24 Uhr
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
thl1966
thl1966 10.06.2013 um 16:19:25 Uhr
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
bastla
bastla 10.06.2013, aktualisiert am 11.06.2013 um 00:02:30 Uhr
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 ...
76109
76109 10.06.2013 aktualisiert um 17:28:21 Uhr
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
Friemler
Friemler 10.06.2013 um 21:55:41 Uhr
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
bastla
bastla 10.06.2013 aktualisiert um 22:22:48 Uhr
Goto Top
... und als Beispiel für die Verwendung:
Test Stadt, StadtName, Land, LandName
WScript.Echo StadtName & " in " & Land  
Grüße
bastla
Biber
Biber 10.06.2013 aktualisiert um 22:35:14 Uhr
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
Friemler
Friemler 10.06.2013 um 23:08:12 Uhr
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
thl1966
thl1966 11.06.2013 um 06:45:01 Uhr
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