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
- 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