Autor Thema: Array von Arrays zurück geben  (Gelesen 3529 mal)

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
Array von Arrays zurück geben
« am: 20.02.17 - 14:20:19 »
Hallo zusammen,

mit der folgenden Funktion lese ich Daten aus einer Excel-Tabelle aus und speichere die Daten in einem Array von Arrays:

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
		'Print "currentRow = " & currentRow & ", cancelColumnNumber = " & m_cancelColumnNumber
		cellValue = xlSheet.cells( currentRow, m_cancelColumnNumber ).value
		Do While cellValue <> ""
			Print "lese Daten, Zeile " & currentRow 
			ReDim Preserve resultArray( rowArrayIndex )
			
			Dim columnValuesArray() As string
			'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
			resultArray( rowArrayIndex) = columnValuesArray
			rowArrayIndex = rowArrayIndex + 1
			currentRow = currentRow + 1
			cellValue = xlSheet.cells( currentRow, m_cancelColumnNumber ).value
		Loop
		
		For i = 0 To UBound( resultArray )
			Print i & " = " & Join( resultArray(i), "~" )
		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


Das läuft alles wie gewünscht. Die Daten werden eingelesen und in der Testschleife auch ausgegeben. Allerdings wirft die Zeile
Code
 getData = resultArray 
eine Type missmatch Fehler.

Hat jemand eine Idee, woran das liegen könnte?

Gruß
Hubert

Offline Hatschi

  • Junior Mitglied
  • **
  • Beiträge: 96
Re: Array von Arrays zurück geben
« Antwort #1 am: 20.02.17 - 14:44:46 »
Hallo Hubert,

probier mal

Dim resultArray() As Variant

ohne die Klammern, also

Dim resultArray As Variant.

Bernd

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
Re: Array von Arrays zurück geben
« Antwort #2 am: 20.02.17 - 14:58:29 »
Hallo Bernd,

dann kracht es bei

Code
ReDim Preserve resultArray( rowArrayIndex )

Hab's auch schon mit ein List-Variablen versuch, also

Code
Dim resultList list As Variant

und

Code
resultList( CStr(rowArrayIndex) ) = columnValuesArray

Das bringt dann aber auch den Type missmatch bei der Zuweisung de Rückgabewertes:

Code
getDataAsList = resultList

Hubert



Offline Hatschi

  • Junior Mitglied
  • **
  • Beiträge: 96
Re: Array von Arrays zurück geben
« Antwort #3 am: 20.02.17 - 15:06:08 »
Hm und wenn du noch eine Hilfsvariable einlegst?

Code
Dim Hilfe as variant
und zum Ende statt
Code
getData = resultArray

Code
hilfe = resultArray
getData = hilfe

Offline ghostmw

  • Aktives Mitglied
  • ***
  • Beiträge: 201
  • Geschlecht: Männlich
    • BELOS - Raum+Ressourcenmanagement unter Lotus Notes
Re: Array von Arrays zurück geben
« Antwort #4 am: 20.02.17 - 15:22:48 »
Hi,

ich denke die Lösung, die dir zuerst genannt wurde, ist gut und nur die halbe "Miete".

Du musst natürlich an der Stelle vor dem Redim preserve erstmal ein Array haben, also eine Abfrage reinmachen.

Code
if not isarray ( Variable ) then redim Variable( count ) else redim PRESERVE variable ( count )

Gruß
Marco

« Letzte Änderung: 20.02.17 - 15:24:22 von ghostmw »
Grüße
Marco Weller
Lotus Domino / Lotus Notes seit 1996 (ab 4.5x)

Offline ascabg

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.697
  • Geschlecht: Männlich
Re: Array von Arrays zurück geben
« Antwort #5 am: 20.02.17 - 15:30:17 »
Hallo,

@ghostmw,
Den Array hat er doch zu diesem Zeitpunkt schon.
Code
Dim resultArray() As Variant
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

Offline ghostmw

  • Aktives Mitglied
  • ***
  • Beiträge: 201
  • Geschlecht: Männlich
    • BELOS - Raum+Ressourcenmanagement unter Lotus Notes
Re: Array von Arrays zurück geben
« Antwort #6 am: 20.02.17 - 15:34:32 »
... nicht ganz, die erste Antwort bezog sich auf

dim result as Variant (also ohne die Klammern)
Grüße
Marco Weller
Lotus Domino / Lotus Notes seit 1996 (ab 4.5x)

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
Re: Array von Arrays zurück geben
« Antwort #7 am: 20.02.17 - 15:44:49 »
Der Weg über eine Hilfsvariable und auch

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

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

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

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

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

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

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Array von Arrays zurück geben
« Antwort #8 am: 20.02.17 - 20:26:04 »
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
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline HH

  • Senior Mitglied
  • ****
  • Beiträge: 339
  • Geschlecht: Männlich
Re: Array von Arrays zurück geben
« Antwort #9 am: 21.02.17 - 09:42:06 »
Guter Tipp! Danke.

Hubert

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz