Domino 9 und frühere Versionen > ND9: Entwicklung
Array von Arrays zurück geben
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