PibeY2k Geschrieben 11. Februar 2003 Geschrieben 11. Februar 2003 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 Zitieren
Klotzkopp Geschrieben 11. Februar 2003 Geschrieben 11. Februar 2003 Alle 15 Parameter von Range::Sort sind optional. Was passiert denn, wenn du überall einen optionalen COleVariant angibst? Zitieren
PibeY2k Geschrieben 11. Februar 2003 Autor Geschrieben 11. Februar 2003 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.... Zitieren
Klotzkopp Geschrieben 11. Februar 2003 Geschrieben 11. Februar 2003 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. Zitieren
PibeY2k Geschrieben 11. Februar 2003 Autor Geschrieben 11. Februar 2003 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 Zitieren
Klotzkopp Geschrieben 11. Februar 2003 Geschrieben 11. Februar 2003 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? Zitieren
PibeY2k Geschrieben 11. Februar 2003 Autor Geschrieben 11. Februar 2003 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); } Zitieren
PibeY2k Geschrieben 12. Februar 2003 Autor Geschrieben 12. Februar 2003 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 Zitieren
Klotzkopp Geschrieben 12. Februar 2003 Geschrieben 12. Februar 2003 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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.