Domino 9 und frühere Versionen > ND9: Entwicklung

Array von Arrays zurück geben

<< < (2/2)

ascabg:
Hallo,

@ghostmw,
Den Array hat er doch zu diesem Zeitpunkt schon.

--- Code: ---Dim resultArray() As Variant

--- Ende Code ---
Und er bekommt den Fehler ja bei getData = resultArray.
Und da ist der Array doch schon erfolgreich geschrieben.

Was ich mich aber gerade frage ist, ist es überhaupt möglich mehrdimensionale Arrays als
Rückgabewert einer Funktion zu haben.


Andreas

ghostmw:
... nicht ganz, die erste Antwort bezog sich auf

dim result as Variant (also ohne die Klammern)

HH:
Der Weg über eine Hilfsvariable und auch


--- Code: ---If Not IsArray ( resultArray ) Then ReDim resultArray( rowArrayIndex ) Else ReDim Preserve resultArray ( rowArrayIndex )

--- Ende Code ---

bringen leider weiterhin den Type missmatch.

Abär:

Da ich sonst schon des öfteren mit Arrays von Objekten gearbeitet habe, habe ich mir für den die Excel-Row eine eigene, simple Klasse erstellt:


--- Code: ---Class ExcelRowData
Public columnValues As Variant
End Class

--- Ende Code ---

Die nutze ich dann wie folgt:


--- Code: --- Function getData( xlSheet As Variant, columnCount As Integer ) As Variant
If columnCount = 1 Then
Print "Abbruch, Spaltenanzahl = 0"
Exit Function
End If

On Error GoTo fehler

Dim i As Integer
Dim currentRow As Integer
currentRow = m_titleRowNumber + 1
Dim currentColumn As Integer
currentColumn = 1

Dim rowArrayIndex As Integer
rowArrayIndex = 0
Dim columnArrayIndex As Integer
columnArrayIndex = 0

Dim resultArray() As Variant

Dim cellValue As String
cellValue = xlSheet.cells( currentRow, m_cancelColumnNumber ).value
Do While cellValue <> ""
ReDim Preserve resultArray( rowArrayIndex )
'hier weise ich dem Array Element das ExcelRowData Objekt zu
Set resultArray( rowArrayIndex) = me.getColumnDataAsObject(xlSheet, Currentrow, Columncount)
rowArrayIndex = rowArrayIndex + 1
currentRow = currentRow + 1
cellValue = xlSheet.cells( currentRow, m_cancelColumnNumber ).value
Loop

For i = 0 To UBound( resultArray )
Dim rowDataObject As New ExcelRowData
Set rowDataObject = resultArray(i)
Print i & " = " & Join( rowDataObject.columnValues , "~" )
Next
Stop

getData = resultArray

weiter:
Exit Function
fehler:
MsgBox Error & Chr(13) & "Zeile: " & Erl & Chr(13) & "Nr.: " & Err & Chr(13) & "Modul: " & "getData", 16, "Fehler"
Resume weiter
End Function

--- Ende Code ---


--- Code: --- Function getColumnDataAsObject( xlSheet As Variant, currentRow As Integer, columnCount As Integer ) As excelRowData
On Error GoTo fehler

Dim colDataObject As New ExcelRowData
colDataObject.columnValues = getColumnDataArray( xlSheet, currentRow, columnCount )

Set getColumnDataAsObject = colDataObject

weiter:
Exit Function
fehler:
MsgBox Error & Chr(13) & "Zeile: " & Erl & Chr(13) & "Nr.: " & Err & Chr(13) & "Modul: " & "getColumnDataArray", 16, "Fehler"
Resume weiter
End Function

--- Ende Code ---


--- Code: --- Function getColumnDataArray( xlSheet As Variant, currentRow As Integer, columnCount As Integer ) As Variant
On Error GoTo fehler

Dim columnValuesArray() As String
Dim columnArrayIndex As Integer
Dim i As Integer
'Print "columnCount = " & columnCount
ReDim columnValuesArray(  0 To columnCount -1 )
columnArrayIndex = 0
For i = 0 To columnCount -1
columnValuesArray(i) = xlSheet.cells( currentRow, i+1 ).value
Next

getColumnDataArray = columnValuesArray

weiter:
Exit Function
fehler:
MsgBox Error & Chr(13) & "Zeile: " & Erl & Chr(13) & "Nr.: " & Err & Chr(13) & "Modul: " & "getColumnDataArray", 16, "Fehler"
Resume weiter
End Function

--- Ende Code ---

Also folgere ich: Array von Arrays geht nicht als Rückgabewert einer Funktion bzw. Methode, Array von (eigenen) Objekten funktioniert. Oder ziehe ich die falschen Schlüsse?

Danke für die Antworten!

Gruß
Hubert

jBubbleBoy:
Mit Hilfe einer Array-Klasse lässt sich das lösen. Die Array-Klasse hat auch den Vorteil das der Code übersichtlicher wird. Die Array-Klasse bitte nach eigenem Bedarf erweitern, hier nur ein minimales und funktionierendes Beispiel:

--- Code: ---Class dnArray
ar() As Variant
index As Integer

Sub New
ReDim ar(0)
End Sub

Sub addValue(v As Variant)
ReDim Preserve ar(index)
If TypeName(v) = "DNARRAY" Then
Set ar(index) = v
else
ar(index) = v
End If
index = index + 1
End Sub

Function getArray As Variant
getArray = ar
End Function
End Class

Sub Initialize
On Error GoTo errorz

Dim array As dnArray
Dim inneresArray As dnArray

Set array = getData
ForAll x In array.getArray
Set inneresArray = x
ForAll y In inneresArray.getArray
Print y
End ForAll
End ForAll

GoTo endeZ
errorZ:
Print "Ein Fehler in " & GetThreadInfo(1) & " Zeile:" & Erl & " Code:" & Err & " Text:" &   Error
Resume endez
endeZ:
End Sub

Function getData() As dnArray
On Error GoTo errorz

Dim a1 As new dnArray
Dim a2 As New dnArray
Dim a3 As New dnArray

Call a2.addValue(1)
Call a2.addValue(2)
Call a2.addValue(3)

Call a3.addValue(15)

Call a1.addValue(a2)
Call a1.addValue(a3)

Set getData = a1

GoTo endeZ
errorZ:
Print "Ein Fehler in " & GetThreadInfo(1) & " Zeile:" & Erl & " Code:" & Err & " Text:" &   Error
Resume endez
endeZ:
End Function
--- Ende Code ---

HH:
Guter Tipp! Danke.

Hubert

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln