Webservice mit Array von Arrays Rückgabe

dignsag

Erfahrenes Mitglied
Hallo zusammen,

ich habe in einem VBA-Projekt (Excel) einen Webservice eingebunden was bisher auch alles wunderbar funktioniert.
Jetzt rufe ich aber eine Methode auf, die ein Array von Arrays zurückgibt.

Ich weiß wie ich sowas unter .Net definiere:

Code:
Dim arr()() as String

Das klappt aber unter VBA nicht. Im Grunde ist das ja nichts anderes als ein zweidimensionales Array. Aber ich hab nicht die leiseste Ahnung wie ich ein "undefiniertes" (nicht dimensioniertes) Array deklariere.

Code:
Dim arr( , ) as String

Geht nicht.
Das ganze als Variant zu deklarieren geht auch nicht.
Hat sonst noch jemand eine Idee?


Zweite Frage:
Wie sag ich denn einer Funktion in VBA das ich ein Array zurückgeben will?

Vielen Dank schonmal im Voraus.
 
zum beispiel so

Visual Basic:
Private Function tet(dim1 As Integer, dim2 As Integer)
    Dim a() As String
    ReDim Preserve a(dim1, dim2)
    tet = a()
End Function

Public Sub defineAndShowArr()
 Dim b() As String
 b = tet(1, 2)
 Call MsgBox(UBound(b, 2))

End Sub

Grüsse bb
 
Hallo zusammen,

ich habe in einem VBA-Projekt (Excel) einen Webservice eingebunden was bisher auch alles wunderbar funktioniert.
Jetzt rufe ich aber eine Methode auf, die ein Array von Arrays zurückgibt.

Ich weiß wie ich sowas unter .Net definiere:

Code:
Dim arr()() as String
Das klappt aber unter VBA nicht. Im Grunde ist das ja nichts anderes als ein zweidimensionales Array. Aber ich hab nicht die leiseste Ahnung wie ich ein "undefiniertes" (nicht dimensioniertes) Array deklariere.

Code:
Dim arr( , ) as String
Geht nicht.
Das ganze als Variant zu deklarieren geht auch nicht.
Hat sonst noch jemand eine Idee?


Zweite Frage:
Wie sag ich denn einer Funktion in VBA das ich ein Array zurückgeben will?

Vielen Dank schonmal im Voraus.

Visual Basic:
Dim myArray() as String 'Einfach ein leeres, undimensioniertes Array deklarieren

ReDim myArray(1 to 10, 1 to 100)     'Jetzt legen wir die Anzahl Dimensionen fest

Rückgabe eines Arrays als Funktionsergebnis nur per Referenz
Visual Basic:
Public Sub DoSomething(myArray() as String)

      Debug.Print myArray(1)
      myArray(1)="Eintrag nach Sub"

End Sub

Sub Main()
Dim arrTest(1 to 10) as String

   arrTest(1)="Eintrag vor Sub"
   Debug.Print arrTest(1)
   DoSomething arrTest
   Debug.Print arrTest(1)

End Sub
 
Zuletzt bearbeitet:
Rückgabe des Arrays als qualifizierter Array
Visual Basic:
Private Function tet(dim1 As Integer, dim2 As Integer) as String()
' bzw.
Private Function tet(dim1 As Integer, dim2 As Integer) as String  (,)
Grüsse bb
 
Rückgabe des Arrays als qualifizierter Array
vb Code:
  1. Private Function tet(dim1 As Integer, dim2 As Integer) as String()
  2. ' bzw.
  3. Private Function tet(dim1 As Integer, dim2 As Integer) as String (,)

Grüsse bb

Das funktioniert nicht... VBA denkt bei dieser variante ich würde die String()-Funktion aufrufen.

Rückgabe eines Arrays als Funktionsergebnis nur per Referenz.

Ja das is mir schon klar. Damit verändere ich ja aber das übergebene Array und das will ich nicht.
Ich hab allerdings festgestellt wenn man einen Variant als Rückgabewert der Funktion definiert dann macht VBA daraus einfach das korrekte Array das man in der Funktion auch als Returnwert zurückgibt.

vb Code:
  1. Dim myArray() as String 'Einfach ein leeres, undimensioniertes Array deklarieren
  2. ReDim myArray(1 to 10, 1 to 100) 'Jetzt legen wir die Anzahl Dimensionen fest

Auch das funktioniert nicht. Wenn meine Webservicemethode ein zweidimensionales Array zurückgibt, und ich versuch das in ein eindimensionales rein zu klopfen fliegt mir das Programm um die Ohren. Hier funktioniert allerdings auch der Variant-Trick nicht!

Es muss doch einen Weg geben zu sagen: "Ich will ein Array mit zwei dimensionen, das aber noch nicht festgelegt ist."
 
Also ich habe es bei mir mit excel vba getestet und das funktionierte einwandfrei.
Zeig doch mal deine Umsetzung.

bei deiner kopie von zvoni
Dim myArray(,) as String
ReDim myArray(1 to 10, 1 to 100)

fehlt das Komma bei der Deklaration

Grüsse bb
 
Also ich habe es bei mir mit excel vba getestet und das funktionierte einwandfrei.
Zeig doch mal deine Umsetzung.

bei deiner kopie von zvoni
Dim myArray(,) as String
ReDim myArray(1 to 10, 1 to 100)

fehlt das Komma bei der Deklaration

Grüsse bb

Und ich habe eben meine Variante (ohne Komma) in Excel2003/VBA getestet, ohne dass ich angemeckert wurde. Wer hat nun recht? :-)

dignsag:
Was spricht denn gegen Rückgabe per Referenz? Ich gebe Funktions-Resultate fast nur auf diesen Weg zurück. Deswegen kann ich das ganze nämlich als Sub, anstatt als Function definieren. Wenn es sensitiver Code ist, deklariere ich das ganze als Function mit Return-Wert boolean, in welchem ich angebe, ob die Function sauber durchgelaufen ist. Dadurch spare ich mir teilweise viel Fehler-Auffang-Gedöns.
Die einzigste Situation, wo ich einen Return-Datentyp anderst als Boolean/Long verwende, sind Auflistungsklassen für Objekte. Himmel, ich verwende ja nicht einmal "String" als Funktions-Rückgabewert.

EDIT: Wenn du das "Ur"-Array nicht verändern willst, dann deklarier doch ein zweites im Funktionskopf

Visual Basic:
Public Function DoSomething(arrHinein() as string, arrRaus() as string)

End Function
 
Zuletzt bearbeitet:
@dignsag: Ich würde den Array als Parameter per Val ( byval myarray() as String) übergeben und dann als Funktions parameter zurück geben. Die Übergabe per Value hat den Vorteil, dass alle Änderungen innerhalb der Funktion am Array nicht in der aufrufenden Funktion schlagend werden.


@Zvoni: Da du ja auch ohne Option Explicit arbeitest wundert es mich nicht das er nicht meckert, abgesehen davon muss ich nicht recht haben.
Grüsse bb
 
Ich stimme da bb zu. Wenn das Ur-Array nicht verändert werden soll, ist die Übergabe ByVal genau richtig, genau dafür gibt es ja diese Möglichkeit.

Und im Übrigen bin ich auch der Meinung, dass Option Explicit zum sauberen Programmieren dazu gehört. Und ich verstehe überhaupt nicht, was dagegen spricht. Schließlich ist dies vor allem eine Hilfe, dass man nicht versehentlich Variable falsch deklariert, was dann später zu Fehlern führen kann, deren Ursache nur sehr schwierig zu finden und zu beheben sind. Bei Nicht-Deklaration macht VB in der Regel einen Variant draus, der immer problematisch ist.

Grüsse
ronaldh
 
Zurück