Excel-Tabelle sortieren mit COMatePLUS

Anfängerfragen zum Programmieren mit PureBasic.
pfnuesu
Beiträge: 8
Registriert: 01.05.2022 16:10

Excel-Tabelle sortieren mit COMatePLUS

Beitrag von pfnuesu »

Hallo Zusammen

Beim Umstieg von Powerbasic auf PureBasic bin ich daran, einige Projekte zu migrieren.
Mehrheitlich komme ich klar, auch dank des deutschen und englischen Forums (sorry les français).

Beim Ansteuern von Excel bin ich nun aber auf ein Hindernis gestossen, wo ich auf Eure Hilfe hoffe:
Sortieren einer Tabelle. Wie ich's versuche, komme ich nicht über "One or more arguments are invalid. Possibly a numerical overflow or too many nested objects, -if so, try splitting your method call into two or more subcalls." hinweg.

Hier ein Übungscode

Code: Alles auswählen

EnableExplicit

IncludePath "..\..\..\Plugins\COMatePLUS\"
XIncludeFile "COMatePLUS.pbi"

Define.COMateObject ExcelObject, WorkBook, WS1, vV
Define.i i

Declare.s rndString(upper.i)


ExcelObject = COMate_CreateObject("Excel.Application")

If ExcelObject
  If ExcelObject\SetProperty("Visible = #False") = #S_OK
    ExcelObject\SetProperty("Application\ScreenUpdating = #False")
    
    WorkBook = ExcelObject\GetObjectProperty("Workbooks\Add")
    
    If WorkBook
      WS1 = WorkBook\GetObjectProperty("ActiveSheet")
      
      ;Zeilen befüllen 
      For i = 1 To 133
        WS1\SetProperty("Range('A" + i + "')\Value = 'Zeile: " + i + "'")  
        WS1\SetProperty("Range('B" + i + "')\Value = '" + i + "'")  
        WS1\SetProperty("Range('C" + i + "')\Value = '" + rndString(5) + "'")  
        WS1\SetProperty("Range('D" + i + "')\Value = '" + rndString(7) + "'")  
      Next i
      
      ;Titelzeilen
      WS1\Invoke("Rows('1:1')\Insert")
      WS1\SetProperty("Rows('1:1')\Font\Bold = #True")
      WS1\SetProperty("Range('A1')\Value = 'ZeileTxt'")
      WS1\SetProperty("Range('B1')\Value = 'ZeileNum'")
      WS1\SetProperty("Range('C1')\Value = 'Text5'")
      WS1\SetProperty("Range('D1')\Value = 'Text7'")
      
      ;Zeilenzahl ermitteln und ausgeben
      Define.l AllRows = WS1\GetIntegerProperty("Rows\Count") 
      Define.l zz = WS1\GetIntegerProperty("Cells(" + AllRows + ",1)\End(-4162)\Row")  ;;-4162 = xlUp
      WS1\SetProperty("Range('f1') = 'Zeilenzahl: " + zz + "'") 
      
      
      ;Sortieren 
      vV = WS1\GetObjectProperty("Range('A1')")
      Debug "Range: " + COMate_GetLastErrorDescription() 
      
      WS1\Invoke("range('A1')\sort " + Str(vV))
      Debug "Sortieren: " + COMate_GetLastErrorDescription() + " | " + Hex(COMate_GetLastErrorCode())
      
    EndIf
    
  EndIf
  ;Aufräumen
  WS1\Release()
  WorkBook\Release()
  ExcelObject\SetProperty("Application\ScreenUpdating = #True")
  ExcelObject\SetProperty("Visible = #True")
  ExcelObject\Release()
Else
  MessageRequester("Upsi!", "Fehler bei Zugriff auf Excel via COMate")
EndIf

Procedure.s rndString(upper.i)
  Define.i i
  Define.s Result
  
  For i = 1 To upper
    Result + Chr(Random('Z','A'))
  Next i
 
ProcedureReturn Result
  
EndProcedure
In VBA würde ich mittels einer der folgenden Zeilen sortieren; die Umsetzung nach COMate (1.2) bereitet mir aber Kopfschmerzen.
  • Range("a1").Sort Range("b2"), 2 ;2 = xlDescending ODER
  • Range("a1").Sort Range("b2"), 1, , , , , , 1 ;(1 = xlAscending | 1 = xlYes =>Titelzeile vorhanden) ODER
  • x = Range("a1").Sort(Range("b2"), 1, , , , , , 1)

Zur Variante, die in obigem Code noch enthalten ist, habe ich über die letzten Tage unzählige weitere versucht, darunter auch folgende.:
  • ;vV\Invoke("Sort(Range('b2'),2)")
  • ;WS1\Invoke(Str(vV) + "\Sort Range('b2')")
  • ;WS1\Invoke(Str(vV) + "\Sort(Range('b2'))")
  • ;WS1\Invoke("Range('A1')\Sort Range('b2'), 2")
  • ;WS1\Invoke("Range('A1')\Sort Range('b2'), 2, , , , , , 1")
  • ;vV\Invoke("\Sort Range('b2'), 2,#opt,#opt ,#opt ,#opt ,#opt, 1")
  • ;i = vV\Invoke("\Sort(Range('b2'), 2,#opt,#opt ,#opt ,#opt ,#opt, 1)")

Kann mir jemand einen Schubs in die richtige Richtung geben?

Schon mal vielen Dank.

Gruss aus Bern,
Pfnuesu