Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

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

Geschrieben
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

Geschrieben
Originally posted by PibeY2k

error C2664: 'Sort' : Konvertierung des Parameters 2 von 'class COleVariant' in 'long' nicht moeglich

Eigenartig. 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?
Geschrieben

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

}

Geschrieben

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

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...