Excel nur gefüllte Spalten uns Zeilen auslesen

  • Hallo Leute,

    ich bins mal wieder Madcatz ;)

    Ich habe ein Problem.

    Und zwar müsste ich aus Excel Datensätze auslesen, prinzipell weiß ich, wie es funktioniert:

    Code
    $Workbook = _Excel_BookOpen(_Excel_Open(), $Path)
    		$Range = _Excel_RangeRead($Workbook, Default, "A1:B500")
    		_ArrayDisplay($Range)

    Hier wird die Exceltabelle geöffnet und anschließend der Bereich A1:B500 in ein Array geschrieben.

    Allerdings weiß ich in meiner realen Anwendung vor dem Auslesen nicht, wie viele Datensätze pro Spalte enthalten sind.
    Was ich allerdings weiß, ist dass Splate A genauso viele Einträge besitzen wird, wie Spalte B.

    Könnt ihr mir hierbei vielleicht helfen, sodass ich keine leeren Datensätze ausgespuckt bekomme?

    Zur Info SQLite wäre im Notfall eine Option, aber dann hab ich wieder mehr arbeit :D
    Access ist auf gar keinen Fall eine Option, damit hab ich immer nur Probleme in Kombination mit Autoit ;)

    Viele Grüße,
    MadCatz :)

  • Naja. Leg nen Array an, das auf jedenfall groß genug ist. Speicher einfach mit, wie viele Elemente drin sind.
    Dann nen ReDim und fertig :)
    Falls es länger dauern darf, immer wenn das Array voll ist nen ReDim um z.B. +100 und dann weitermachen, am Ende einfach das, was von den 100 nicht gefüllt wurde mit ReDim wieder abtrennen.
    (ReDim sollte sparsam verwendet werden, da es recht Rechenintensiv ist)

  • Hi Kanashius,

    danke für deine schnelle Antwort :)

    Also wenn ich das richtig verstanden habe meinst du, dass ich das Array ca. 1000 Einträge lang machen soll, oder länger und dann die leeren Einträge herausfiltere und dann ein Array ohne leer Einträge erhalte? :)
    Und falls das Array voll ist, mit ReDim neu Diminsioniere?

    Rechenintensiv ist egal, hab dafür mehr als genug Rechenpower bereit stehen ^^

  • Meinst Du:
    Keine leeren Datensätze zwischen existirenden a1 = 10; a2 = ""; a3 = 100


    oder Grundsätzlich leer? Z.B. A1 ... A1000 = ""
    oder leer nach Voll ? also z.B. a1 = 10 ; a2 = 20 a3 = 30; a4....a100 = ""

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Ja dann:
    WIe bereits geschrieben - das ganze in ein richtig großes Array einlasen (wenn du magst 10.000) Danach eine nette Schleife die schön brav abfragt ob der Inhalt des Arrays an der Stelle i <> "" ist wenn ja i merken -> Schleifenende --> Redim mit neuer Array länge I oder i - 1 je nachdem wo der erste Wert steht (o oder 1 sofern o = Array länge. Ich persönlich neige zu array[0] = array länge.)

    Die fiktive Länge des Array spielt bei der Schleife keine Rolle ---> Da ja Abbruch sowie etwas gefunden wird. Solllte das trotzdem zu lange dauern, weil Deine Zeilen anwachsen, müßte man mal an einigen Stellen nachsehen z.B. bei 1000 bei 2000 usw oder Differenz/2 - das reduziert die Schleifendurchgänge. Macht aber nur Sinn wenn der Schleifendurchlauf ein wenig lange dauert.

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • hi,

    ich bin grad zu blöd, ich weiß grad nicht wie die Schleife auszusehen hat -.-

    Kannst du mir viellecht ein Beispiel bereit stellen? :)

    So siehts nämlich bei mir aus, und dann ist alles leer.

    Code
    $Range = _Excel_RangeRead($Workbook, Default, "A1:D1000")
    		_ArrayDisplay($Range)
    		For $i = 0 to Ubound($Range) -1 step 1
    			if $i <> "" then Redim $Range[Ubound($Range-1)]
    		Next
    		_ArrayDisplay($Range)
  • Ganz einfach: Dass nennt sich UsedRange in Excel.
    Wirf mal nen kritischen Blick in das Wiki zu Excel: https://www.autoitscript.com/wiki/Excel_Range

    Als Code ist das aber in Deinem Fall noch einfacher:

    Code
    $aData = _Excel_RangeRead($oWorkbook)

    Denn _Excel_RangeRead liest per Default nur die verwendeten Zellen aus.
    Wobei "verwendet" jene Zellen bezeichnet, die jemals angefasst wurden (also z.B. jetzt wieder leer sind).

  • Wenn dich das so mache, wie du es schreibst, dann spuckt er mir mindestens 999 Zeilen aus, obwohl bisher nur 143 beschrieben wurden.


    So hab ich das ganze am Anfang gemacht und ausprobiert, bevor ich hier gefragt habe, aber das läuft halt nicht, wie es beschrieben wurde ;)


    Falls ich mich irren sollte, kannst du mich gerne korrigieren.

  • Dann verwende - wie im Wiki beschrieben - die letzte belegte Zelle:

    Code
    With $oWorkbook.ActiveSheet
    	$oRangeLast = .UsedRange.SpecialCells($xlCellTypeLastCell)
    	$oRange = .Range(.Cells(1, 1), .Cells($oRangeLast.Row, $oRangeLast.Column))
    EndWith
    $aData = _Excel_RangeRead($Workbook, Default, $oRange)
  • H. water,

    hab dein Bespiel ausprobiert, bekomme leider dennochden Inhalt von Excel, einschließlich der leeren Zeilen ausgegeben.

    Ich hab es nun anders geregelt bekommen :)

    Damit auch ihr und evtl. andere, die ebenfalls vor diesem Problem stehen, wissen wie ich es gelöst habe, hier der Code:

    Code
    $Workbook = _Excel_BookOpen(_Excel_Open(), $Path)
    		$Range = _Excel_RangeRead($Workbook, Default, "A1:D1000")
    		Dim $Range_Data[1][4]
    		For $i = 0 to UBound($Range) -1
    			If StringLen($Range[$i][0])>=2 Then
    				$WriteString = $Range[$i][0] & " | " & $Range[$i][1] & " | " & $Range[$i][2] & " | " & $Range[$i][3]
    				_ArrayAdd($Range_Data,$WriteString)
    			EndIf
    		Next
    		_ArrayDisplay($Range_Data)


    $Range kann hierbei X-Beliebig groß eingestellt werden.


    Ich bedanke mich vielmals bei euch allen, die mir geholfen haben eine Lösung zu finden :)