# Webservice mit Array von Arrays Rückgabe



## dignsag (31. Juli 2008)

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:


```
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.


```
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.


----------



## Alex F. (31. Juli 2008)

zum beispiel so 


```
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


----------



## Zvoni (31. Juli 2008)

dignsag hat gesagt.:


> 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.
> ...




```
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

```
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
```


----------



## Alex F. (31. Juli 2008)

Rückgabe des Arrays als qualifizierter Array 

```
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


----------



## dignsag (31. Juli 2008)

brainbyte hat gesagt.:


> Rückgabe des Arrays als qualifizierter Array
> vb Code:
> 
> Private Function tet(dim1 As Integer, dim2 As Integer) as String()
> ...



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:
> 
> Dim myArray() as String 'Einfach ein leeres, undimensioniertes Array deklarieren
> 
> ...



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."


----------



## Alex F. (31. Juli 2008)

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


----------



## Zvoni (31. Juli 2008)

brainbyte hat gesagt.:


> Also ich habe es bei mir mit excel vba getestet und das funktionierte einwandfrei.
> Zeig doch mal deine Umsetzung.
> 
> bei deiner kopie von zvoni
> ...



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


```
Public Function DoSomething(arrHinein() as string, arrRaus() as string)

End Function
```


----------



## Alex F. (31. Juli 2008)

@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


----------



## Zvoni (1. August 2008)

> @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


 
Mag sein, aber funktionieren tuts trotzdem


----------



## ronaldh (1. August 2008)

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


----------



## dignsag (28. November 2008)

Also nochmal: 

Ich habe mittlerweile rausgefunden, das in der Programmierung zwischen multidimensionalen Arrays und verzweigten Arrays unterschieden wird. Und ich bekomme vom Webservice ein verzweigtes Array zurück.

Hat jemand eine Vorstellung davon wie das in VBA aussehen könnte, bzw. wie man ein verzweigtes Array verarbeitet?


----------

