Veröffentlicht 11. Februar 200322 j Hi zusammen, hab mal wieder son Excelproblem... Ich möchte, dass das mein Programm eine Spalte alphabetisch sprtiert. Ich dneke mal, dass es mit "range.sort" gehen müsste, aber der Funktion müssen 15 Parameter übergeben werden und ich bekomme die nicht zusammen... Hat jemand ne Idee oder muss es doch mit einer anderen Funktion gemacht werden? Danke, PibeY2k
11. Februar 200322 j Alle 15 Parameter von Range::Sort sind optional. Was passiert denn, wenn du überall einen optionalen COleVariant angibst?
11. Februar 200322 j Leider sind sie nicht alle Optional, einige sind auch long. Ich habe im Netz dieses hier gefunden, aber leiger nur mit 12 Parametern.. range_new.Sort(COleVariant("A1"),long("xlAscending"),COleVariant("A1"), COleVariant(long("xlSortValue"),VT_I4),long("xlAscending"),COleVariant("A1"), long("xlAscending"),long("xlNo"),COleVariant(long(1),VT_I4),COleVariant((long)FALSE, VT_BOOL) , long("xlSortRows"),long("xlPinYin")); Wenn ich jetzt noch 3 Parameter, covOptional dranhänge, sagt er mir auch, dass die Sort Methode fehlerhaft ist....
11. Februar 200322 j Originally posted by PibeY2k long("xlAscending")Mal abgesehen davon, dass das so nicht klappen kann, sind alle Parameter im Automatisierungsinterface Variants. Es sollte also mit 15mal covOptional klappen. Die Version mit 12 Parametern ist übrigens die von Excel 2000.
11. Februar 200322 j Originally posted by Klotzkopp Mal abgesehen davon, dass das so nicht klappen kann, sind alle Parameter im Automatisierungsinterface Variants. Es sollte also mit 15mal covOptional klappen. Die Version mit 12 Parametern ist übrigens die von Excel 2000. Oh ja ich erinner mich, dass ist beim öffnen ja genau so, dass für Excel 2000 weniger Parameter benutzt werden. ok, ich habe jetzt 15 mal covOptional hingeschrieben, dann gibt er mir folgenden fehler aus error C2664: 'Sort' : Konvertierung des Parameters 2 von 'class COleVariant' in 'long' nicht moeglich Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden
11. Februar 200322 j Originally posted by PibeY2k error C2664: 'Sort' : Konvertierung des Parameters 2 von 'class COleVariant' in 'long' nicht moeglichEigenartig. Wie hast du das Automatisierungsinterface eingebunden? Importierst du die Typbibliothek oder hast du den Klassenassitenten verwendet? Wenn letzteres, wie sieht die Methodendeklaration von Range::Sort aus?
11. Februar 200322 j Das Automatisierungsinterface habe ich genau nach der Anleitung in der MSDN eingebunden. http://support.microsoft.com/default.aspx?scid=kb;EN-US;178749 in den Klassen ist die Methode so beschrieben. void Range::Sort(const VARIANT& Key1, long Order1, const VARIANT& Key2, const VARIANT& Type, long Order2, const VARIANT& Key3, long Order3, long Header, const VARIANT& OrderCustom, const VARIANT& MatchCase, long Orientation, long SortMethod, const VARIANT& IgnoreControlCharacters, const VARIANT& IgnoreDiacritics, const VARIANT& IgnoreKashida) { static BYTE parms[] = VTS_VARIANT VTS_I4 VTS_VARIANT VTS_VARIANT VTS_I4 VTS_VARIANT VTS_I4 VTS_I4 VTS_VARIANT VTS_VARIANT VTS_I4 VTS_I4 VTS_VARIANT VTS_VARIANT VTS_VARIANT; InvokeHelper(0x370, DISPATCH_METHOD, VT_EMPTY, NULL, parms, &Key1, Order1, &Key2, &Type, Order2, &Key3, Order3, Header, &OrderCustom, &MatchCase, Orientation, SortMethod, &IgnoreControlCharacters, &IgnoreDiacritics, &IgnoreKashida); }
12. Februar 200322 j Ok, ich habe eine Lösung bei CodeGuru gefunden... Er sortiert jetzt 3 Spalten Aufsteigend, ohne Überschrift VARIANT var; LPDISPATCH lpdisp; range = sheet.GetRange(COleVariant("A2"),COleVariant("C10")); //Hier habe ich A2 genommen, damit er die Überschrift nicht mitsortiert range.Select(); lpdisp =sheet.GetRange(COleVariant("A1"),COleVariant("A1")); var.vt = VT_DISPATCH; var.pdispVal = lpdisp; range.Sort(var, //key 1L , //order covOptional, //optional key2 covOptional, // optional type 1L, // order2 covOptional, //key3 1L,// order3 2L , // header COleVariant((long)1), // order custom Normal covFalse, // case insensitive 1L , //orientation 1L, // Sort method covTrue, covTrue, covTrue); ASSERT(lpdisp); range.AttachDispatch(lpdisp); Aber warum bei Order nur 1L bzw 2L steht, habe ich nicht so ganz verstanden.... PibeY2k
12. Februar 200322 j Originally posted by PibeY2k Aber warum bei Order nur 1L bzw 2L steht, habe ich nicht so ganz verstanden....Das kann ich dir erklären. Diese ganzen xl-Dinger (wie xlSortValue, xlAscending, xlNo) sind symbolische Konstanten für Zahlenwerte. Leider kann man die von C++ aus nicht benutzen, sondern man muss die Zahlenwerte selbst kennen. Das L kennzeichnet einfach nur den Datentyp als long.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.