1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. leertaste

Beiträge von leertaste

  • Excel - Sortierreihenfolge benutzerdefiniert

    • leertaste
    • 4. Oktober 2016 um 09:42

    Hi,

    danke, dass war der super Tipp.
    Es funktioniert jetzt wie es soll.
    Zuerst Spalte A und dann Spalte B nach Liste. Cool!

    Und die benuterdefinierte Liste darf kein Array sein.
    Weiter ist dies auch nicht notwendig:
    $oExcel.AddCustomList($aSortArray)

    Das funktionierende Script:


    AutoIt
    Local $a[][] = [['Name', 'ID'], ['Anton', 'AB'], ['Anton', 'A'], ['Berta', 'AA'], _
    ['Anton','B'], ['Anton', 'C'], ['Anton', 'AC'], _
    ['Berta', 'AB'], ['Berta', 'A'], ['Anton', 'AY'], ['Berta', 'B'], ['Berta', 'C'], ['Berta', 'AC']]
    
    
    Local $oAppl = _Excel_Open(Default, Default, Default, Default, True)
    Local $sWorkbook = "C:\Temp\Excel_Sort_by_CustomOrder.xlsx"
    Local $oWorkbook = _Excel_BookNew($oAppl, 1)
    _Excel_RangeWrite($oWorkbook, Default, $a, "A1")
    Local $SortOrder1
    Local $SortOrder2 = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ"
    
    
    $iHeader = $xlYes
    $bMatchcase = False
    $iOrientation = $xlSortColumns
    $iOrder1 = $xlAscending
    $iOrder2 = $xlAscending
    $vWorksheet = $oWorkbook.ActiveSheet
    $vRange = $vWorksheet.Usedrange
    $vKey1 = $vWorksheet.Range("A:A")
    $vKey2 = $vWorksheet.Range("B:B")
    $DataOption1 = 0 ;xlSortNormal = 0 oder xlSortTextAsNumbers = 1
    $DataOption2 = 0 ;xlSortNormal = 0 oder xlSortTextAsNumbers = 1
    $vWorksheet.Sort.SortFields.Clear
    $vWorksheet.Sort.SortFields.Add($vKey1, $xlSortOnValues, $iOrder1, $SortOrder1, $DataOption1)
    $vWorksheet.Sort.SortFields.Add($vKey2, $xlSortOnValues, $iOrder2, $SortOrder2, $DataOption2)
    $vWorksheet.Sort.SetRange($vRange)
    $vWorksheet.Sort.Header = $iHeader
    $vWorksheet.Sort.MatchCase = $bMatchcase
    $vWorksheet.Sort.Orientation = $iOrientation
    $vWorksheet.Sort.Apply
    
    
    _Excel_BookSaveAs($oWorkbook, $sWorkbook, Default, True)
    _Excel_Close($oAppl)
    
    
    MsgBox(0, "", "Richtig sortiert?")
    Alles anzeigen

    :thumbup:

  • Excel - Sortierreihenfolge benutzerdefiniert

    • leertaste
    • 3. Oktober 2016 um 19:13

    So, COM Error Handler eingebaut.

    Bei $vWorksheet.Sort.CustomOrder = $SortNum + 1 bekomme ich die Meldung "unbekannter Name".
    Es muß auch OrderCustom heißen anstatt CustomOrder. Aber trotzdem kommt die Meldung "unbekannter Name".

    Weiter kommt die Meldung auch hier.
    $vWorksheet.Sort.DataOption = 0

    Aber wo mein Fehler liegt weiß ich trozdem nicht.

    Vielen Dank für eure Hilfe.

  • Excel - Sortierreihenfolge benutzerdefiniert

    • leertaste
    • 3. Oktober 2016 um 15:12

    Wie kann man dann die benutzerdefinierte Reihenfolge angeben?
    $xlAscending oder $xlDescending sortiert nicht wie gewünscht.
    Deshalb auch die vorgegebene Sortierreihenfolge.

  • Excel - Sortierreihenfolge benutzerdefiniert

    • leertaste
    • 3. Oktober 2016 um 11:03

    Meinst du so?

    AutoIt
    Global $SortOrder[] = ["A","B","C","AA","AB","AC"]
    _Excel_RangeSort($oWorkbook, Default, "A:B", "A:A", $xlAscending, $xlSortNormal, $xlYes, False, $xlSortColumns, "B:B", $SortOrder)

    Lasse ich Key2 weg wird nach Spalte A richtig sortiert. Nehme ich Key2 mit Spalte B und Order2 = default hinzu passt es auch noch.
    Übergebe ich aber für die Order2 das Array wird sowohl Spalte A und Spalte B ohne klarer Reihenfolge sortiert.
    In Excel wird aber unter Sortieren/Benutzerdefiniert Sortieren.../Reihenfolge/Benutzerdefinierte Liste das Array richtig angezeigt.

    Was mache ich falsch?

    Danke.

  • Excel - Sortierreihenfolge benutzerdefiniert

    • leertaste
    • 2. Oktober 2016 um 20:32

    Danke, aber trotzdem mache ich was falsch.
    Die vorgegebene Sortierung wird nicht angewendet.

    Eigentlich ist mein Ziel zuerst nach Spalte A und dann nach Spalte B zu sortieren.
    Da aber die Sortierreihenfolge das größere Problem ist habe ich erst mich daran versucht.
    Klappt aber nicht....

    Das Ergebnis sollte so aussehen.

    Name ID
    Anton A
    Anton B
    Anton C
    Anton AA
    Anton AB
    Anton AC
    Berta A
    Berta B
    Berta C
    Berta AA
    Berta AB
    Berta AC

    Danke

    AutoIt
    #include <excel.au3>
    Local $a[13][2] = [['Name', 'ID'], ['Anton', 'AB'], ['Anton', 'A'], ['Berta', 'AA'], _
    ['Anton','B'], ['Anton', 'C'], ['Anton', 'AC'], _
    ['Berta', 'AB'], ['Berta', 'A'], ['Anton', 'AA'], ['Berta', 'B'], ['Berta', 'C'], ['Berta', 'AC']]
    Local $oAppl = _Excel_Open(Default, Default, Default, Default, True)
    Local $sWorkbook = "C:\Temp\Excel_Sort_by_List.xlsx"
    Local $oWorkbook = _Excel_BookNew($oAppl, 1)
    _Excel_RangeWrite($oWorkbook, Default, $a, "A1")
    Global $SortOrder[] = ["A","B","C","AA","AB","AC"]
    $oAppl.AddCustomList($SortOrder)
    $SortNum = $oAppl.CustomListCount
    $iHeader = $xlYes
    $bMatchcase = False
    $iOrientation = $xlSortColumns
    $iOrder1 = $xlAscending
    $vWorksheet = $oWorkbook.ActiveSheet
    $vRange = $vWorksheet.Usedrange
    $vKey1 = $vWorksheet.Range("B2")
    $vWorksheet.Sort.SortFields.Clear
    $vWorksheet.Sort.SortFields.Add($vKey1, $xlSortOnValues, $iOrder1)
    $vWorksheet.Sort.SetRange($vRange)
    $vWorksheet.Sort.Header = $iHeader
    $vWorksheet.Sort.MatchCase = $bMatchcase
    $vWorksheet.Sort.Orientation = $iOrientation
    $vWorksheet.Sort.CustomOrder = $SortNum + 1
    $vWorksheet.Sort.DataOption = 0 ;xlSortNormal = 0 oder xlSortTextAsNumbers = 1
    $vWorksheet.Sort.Apply
    _Excel_BookSaveAs($oWorkbook, $sWorkbook, Default, True)
    _Excel_Close($oAppl)
    MsgBox(0, "", "Richtig sortiert?")
    Alles anzeigen
  • Excel - Sortierreihenfolge benutzerdefiniert

    • leertaste
    • 2. Oktober 2016 um 19:24

    Hallo zusammen,

    ich wollte heute die benutzerdefinierte Sortierreihenfolge von Excel in Autoit umsetzen.
    Leider ohne Erfolg.

    Daran scheitere ich schon.
    Application.AddCustomList ListArray:=Array("A","B","C","AA","AB","AC")

    Wie ist dies in AutoIt umzusetzen?
    $oAppl.AddCustomList......


    Vielen Dank.


    Schöne Grüße

    leertaste

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 24. Februar 2016 um 22:03

    Nochmal getestet....

    AutoIt3_63 / 6500000 Zeilen / Excel 2007 / anstatt 8 Gb RAM mit 32 Gb RAM getestet - geht auch nicht....

    Bei Gelegenheit werden ich mal mit Excel 2010 64bit testen.
    Ich vermute es liegt an einem Limit in Excel.

    Das ist der Flaschenhals $vRange.Value = $vValue

    Datenmenge knapp 800000 Zeilen und 20 Spalten ist für Excel eigentlich kein Problem.

    Hab gerade festgestellt, dass die Excel UDF von dir ist - tolle Arbeit - Danke.

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 24. Februar 2016 um 18:13

    So hab neue Infos.

    Hab mal mit ArrayExtract schrittweise das Array vergrößert und versucht die Grenze zu finden.

    mit AutoIt3 gehen 400000 Zeilen, bei 500000 Zeilen "Out of memory"
    mit AutoIt3_64 gehen 625000 Zeilen, bei 650000 Zeilen wird ohne irgendeiner Meldung nur die leere Exceldatei angelegt und das Script läuft problemlos weiter

    Komisch.....

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 23. Februar 2016 um 22:01

    Nein, die leeren Zeilen sind bunt verteilt über das ganze Array.

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 22. Februar 2016 um 23:31

    UBound($aTmp, 1) = 777399
    UBound($aTmp, 2) = 21


    Dann gute Nacht!

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 22. Februar 2016 um 23:20

    Läuft .....

    Oh, es sind "nur" 777000 Zeilen. Nein, ein ReDim mach ich nicht.
    Das Array wird zuerst bearbeitet und dadurch werden ca. 250000 Zeilen kpl. geleert.

    Ein ReDim wollte ich mir sparen, denn die TXT mit 777000 Zeilen kann ich ja in Excel öffnen.

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 22. Februar 2016 um 23:05

    Zu Beginn sind sogar mehr als 800000 Zeilen.
    Es funktioniert alles bestens bis zum Schluß sobald ich dann das ganze in Excel haben möchte.

    Sonderzeichen... man findet so gut wie alles Zeichen.

    Wie schaut es aus mit <> oder [] ?

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 22. Februar 2016 um 23:01

    Antwort ist da.

    IsArray($aTmp) = 1
    UBound($aTmp, 0) = 2

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 22. Februar 2016 um 22:48

    Ok, Script läuft jetzt ...... dauert ein wenig....

    Wie findet man denn raus welcher Wert geschrieben werden soll, wenn der Fehler auftritt?

    Kann es sein, dass irgendwelche Sonderzeichen ein Problem machen?

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 22. Februar 2016 um 22:37

    Mach ich, aber $aTmp ist definitiv ein Array, da ich als Workaround _FileWriteFromArray nutze und das funktioniert.

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 22. Februar 2016 um 21:49

    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aTmp, "A1", True, True)

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 22. Februar 2016 um 21:29

    Was genau aus der Befehlszeile soll ich posten?

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 22. Februar 2016 um 21:06

    @extended = 2147024882

    Wie kann man jetzt rausfinden was das bedeutet?

    Edit:
    Es handelt sich anscheined um "Out of Memory".

    Ich habe Win7 64bit mit 8Gb.
    Entweder die 8Gb reichen nicht aus oder aber ich muss Excel 2007 64bit benutzen.

    Wird das Array als txt ausgeben und händisch in Excel mit Daten/Aus Text kann die TXT problemlos eingelesen werden.

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 22. Februar 2016 um 20:47

    @error = 4

    Ich füg mal @extended hinzu.

    Edit:
    Bin aber erst bei ca. 11.550.000, wenn ich richtig gerechnet habe.

  • _Excel_RangeWrite - Größe von 2D Array begrenzt

    • leertaste
    • 22. Februar 2016 um 19:58

    Hallo Zusammen,

    hab schon länger nichts mehr in AutoIt gemacht, aber nun ist es mal wieder so weit. Das ist schön! :)

    Nach dem Update auf die aktuelle Version habe ich bemerkt, dass die Excel UDF kpl. neu ist.

    Nun meine Frage:

    Gibt es eine Größenbeschränkung eines 2D Arrays das mit Excel_RangeWrite in eine Exceltabelle geschrieben werden kann?

    Das Array hat 550000 Zeilen und 21 Spalten gefüllt mit max. 30 Zeichen pro Zelle.
    Manchmal sind auch ganze Zeilen leer.

    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aTmp, "A1", True, True)

    Egal, ob $bForceFunc = False oder False und es macht auch keinen Unterschied, ob als X86 oder X64 ausgeführt.
    Ich erhalte immer nur eine leere Exceldatei.

    Was mache ich falsch?

    Danke.

    Viele Grüße
    leertaste

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™