kaiserqq7
Goto Top

C Sharp - xlsRange.sort beim zweitem Aufruf error lierfert

Hallo,

warum taucht einen Fehler beim zweiten Aufruf von folgender Funktion:

        public static void sortByQty()
        {
            Excel.Range rngSort = ws.get_Range("I5", missing);  
            string rngSortVal        = Convert.ToString(rngSort.Value2);
            
            rngSort.Activate();
            rngSort.Cells.Select();

            rngSort.Sort(rngSort.Columns[1, missing],
                         Excel.XlSortOrder.xlDescending,
                         rngSort.Columns[2, missing],
                         missing,
                         Excel.XlSortOrder.xlDescending,
                         missing,
                         Excel.XlSortOrder.xlDescending, 
                         Excel.XlYesNoGuess.xlYes,
                         missing, missing, 
                         Excel.XlSortOrientation.xlSortColumns,
                         Excel.XlSortMethod.xlPinYin, 
                         Excel.XlSortDataOption.xlSortTextAsNumbers,
                         Excel.XlSortDataOption.xlSortTextAsNumbers,
                         Excel.XlSortDataOption.xlSortTextAsNumbers);        
        }


[Edit Biber] Codeformatiert [/Edit]

Content-ID: 172282

Url: https://administrator.de/contentid/172282

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

Biber
Biber 30.08.2011, aktualisiert am 18.10.2012 um 18:48:07 Uhr
Goto Top
Moin KaiserQQ7,

du hast ja nun vor einem Monat hier im selben Bereich eine baugleiche Frage Eine Excel Tabelle sortieren nach Spalte I ab der Zeile 5 absteigend using c sharp gepostet.

Vor einem Monat lautete die Zustandsbeschreibung bzw. das konkrete Problem, an dem wir Helferlein ansetzen könnten
ich habe die folgende Code gefunden aber taucht ein fehler:

Damals hattest du noch in einem Kommentar ergänzt:
Zitat von @KaiserQQ7:
ich mache gerade einen Add-In für Excel und ich brauche diese Funktion innerhalb der Code.

Jetzt hast du einen kompletten Monat an diesem Add-In rumgeschraubt und dieses "SortbyQty()"-Funktiönchen hat nun
  • einen Namen, damit es aufgerufen werden kann
  • Codeformatierung, damit wir es lesen können
  • ein paar just for fun-Variablen, die gesetzt und nie benötigt werden
  • und immer noch denselben Fehler, den wir schon vor 4 Wochen nicht genannt bekamen.

Bitte, damit wir vor den ganzen rasant nahenden Weihnachtseinkäufen fertig werden:

  • Wie zeigt sich oder was ist der Fehler? Hat der einen Fehlercode/Fehlertext?
  • wie/von wo wird die Funktion aufgerufen? Von einem Ribbon-Button? Über Kontext-Menü? Aus der Garage über WLAN?
  • sprechen wir von der gleichen Excel-Version, nämlich Excel 93 für Solaris? Oder benutzt du eine andere Version, wenn ja --> WTAF??

Bitte gib uns wenigstens ene Chance, irgendwelche sinnvollen Antworten zu versuchen.

Grüße
Biber

P.S. Wegen des Meister-Yoda-Titels
C Sharp - xlsRange.sort beim zweitem Aufruf error lierfert
und des wiederholten orientierungslosen Auf-, Ab- oder Wegtauchens dieser angefangenen Sätze
warum taucht einen Fehler beim zweiten Aufruf von folgender Funktion:

Ja, wo tauchen se denn?!?

--> Falls du der deutschen Sprache nicht so geläufig bist oder umgekehrt, kannst du auch gern auf denglisch oder whattheheck fragen.
Meine PraktikantInnen können auch französisch - beschreib also den Fehler in irgendeiner ###-Sprache.
Aber beschreib ihn bitte.
KaiserQQ7
KaiserQQ7 02.09.2011 um 11:23:57 Uhr
Goto Top
Also es geht um die Zutaten einer Produkt, und wie diese Zutaten auf einer Packung stehen sollen, wie foldend:

Zutat_1*, Zutat_2*, Zutat_3* (Prozent %), ....., Zutat_n*.

also sternchen und dann komma und dann leerzeichen (und wenn bestimmte Prozent für jede Zutat gibt dann muss wie bei "Zutat_3" danach stehen) und die letzte Zutat muss mit Punkt gefolgt.

und diese Daten sind in einer Excel "Sheet_1" und sieht wie folgend aus:

Version-------Zutaten----------------Prozent
1----------------Zutat_1*----------------30
1----------------Zutat_2*
1----------------Zutat_3*----------------27
1----------------Zutat_1*----------------20
2----------------Zutat_1*----------------30
2----------------Zutat_2*
2----------------Zutat_3*----------------27
3----------------Zutat_1*----------------30
3----------------Zutat_2*
3----------------Zutat_3*----------------27

1. muss diese Tabelle nach Version gefiltert
2. unter Zutaten einer Version kann eine Zutat mehere Mals tauchen (wie bei Version 1, Zutat_1 taucht 2 Mal)
3. wenn eine Zutat einer Version mehere Mals tauchen sollte, muss nur eine Zutat davon beibehalten und ihre Prozent Value besteht aus der Summe aller anderen (die
gleiche Zutat-Name hat und danach von der Tabelle gelöscht werden). Als beispiel: Wähle Version = 1, dann Zutat_1 taucht zwei mal und eine davon wird gelöscht und ihre Prozent Value ist
die Summe 30+27 = 57.

Step 1: Wähle Version = 1 (Spalte Version filtern)

Version -------Zutaten-------------- Prozent
1 ----------------Zutat_1*---------------- 30
1----------------Zutat_2* ----------------
1----------------Zutat_3* ---------------- 27
1----------------Zutat_1*---------------- 20

Step 2: Lösche die wiederholte Zutat, und fass ihre Prozent mit einer gleichnamige Zutat

Version--------Zutaten---------------Prozent
1----------------Zutat_1*---------------- 57
1----------------Zutat_2*----------------
1----------------Zutat_3*---------------- 27

Step 3: Sortiere die ganze Tabelle Nach Prozent absteigend:

Version--------Zutaten----------------Prozent
1----------------Zutat_1*----------------57
1----------------Zutat_3*----------------27
1----------------Zutat_2*----------------


UND Dann das ende Ergibniss muss in "Sheet_3" geschrieben werden und sieht so aus:

Zutat_1* (57 %), Zutat_3* (27 %), Zutat_2*.


Das war die Aufgabestellung bis jetzt.
und dafür habe ich einen Excel Add-Ins mit C Sharp gemacht. Und in der Folgende Code Tritt den Fehler:

Fehler Meldung:
Unable to get the Sort property of the Range class.
Eine COMException-Ausnahme wird ausgelöst, wenn ein nicht erkanntes HRESULT von einem COM-Methodenaufruf zurückgegeben wird.

Code:

        public static Excel.Application app     = Rezepturprogramm.Globals.ThisAddIn.Application;
        public static Excel.Workbook    wb      = app.ActiveWorkbook;
        public static Excel.Worksheet   ws      = wb.ActiveSheet;


        public static void sortByNewQty()
        {

            Excel.Range rngSort = ws.get_Range("I5", missing);  
            string rngSortVal   = Convert.ToString(rngSort.Value2);

            rngSort.Sort(rngSort.Columns[1, missing], Excel.XlSortOrder.xlDescending,
                         rngSort.Columns[2, missing], missing, Excel.XlSortOrder.xlDescending,
                         missing, Excel.XlSortOrder.xlDescending, 
                         Excel.XlYesNoGuess.xlYes, missing, missing, 
                         Excel.XlSortOrientation.xlSortColumns,
                         Excel.XlSortMethod.xlPinYin, 
                         Excel.XlSortDataOption.xlSortNormal,
                         Excel.XlSortDataOption.xlSortNormal,
                         Excel.XlSortDataOption.xlSortNormal);
 
        }
Biber
Biber 02.09.2011 um 13:03:40 Uhr
Goto Top
Moin KaiserQQ7,

danke für die Infos.

Als ch deinen Eroffnungspost überflogen hatte (und deine jetzt genauere Fehlerbeschreibung noch nicht kannte) hatte ich drei vage Verdachtsmomente.

  • es könnte sein, dass die (wo auch immer) gesetzte Variable "ws" auf das falsche Worksheet zeigt [ich jedenfalls hätte das Ziel-workSheet lieber immer explizit als "Ein-WorkSheet-namens-Babe" oder ähnlich in der sortbyNewQty() ermittelt
  • oder aber die Range-Angabe ist zum Sortieren ungeeignet, weil sie sich nur auf eine Zelle bezieht (das "I5" ist doch sicher nur die zelle I5 und kein named range). Eine Zelle nach zwei Spalten sortieren könnte Excel verweigern, dachte ich mir.
  • oder aber, die dritte Vermutung, die überflüssige Zeile "String mgSortval=ConvertToString(mgSort.Value2)" geht in den Dutt, weil in Value2 im zweiten Durchgang ein double Wert steht und du damit natürlich die Convert.ToString() in die Knie zwingst.

Könntest du bitte mal die Zeile "String mgSortval=ConvertToString(...." auskommentieren, um einen der drei Fälle auzuschliessen?

Zusatzfragen
  • der Fehler tritt immer erst beim 2ten Aufruf auf?
  • die Variable "Ws" wird ein einziges Mal global gesetzt? Oder wird die mehrfach auf jeweils ActiveSheet() umgebogen?

Grüße
Biber

[Edit] Sorry, die 3 Global/public-Zeilen oberhalb der Function waren noch da, als ich meine Fragen geschrieben habe.[/Edit]
KaiserQQ7
KaiserQQ7 02.09.2011 um 13:27:39 Uhr
Goto Top
Hallo Biber,

ich habe auch so probiert statt ws:

static Excel.Worksheet sheet_1 = (Excel.Worksheet)wb.Worksheets["sheet_1"];

hat aber trotzdem nicht geklappt.

der Fehler tritt immer erst beim 2ten Aufruf auf?
JA, beim ersten Mal ist alles super nur wenn ich den "button" nochmal anklicke dann kommt diesen Fehler.

die Variable "Ws" wird ein einziges Mal global gesetzt? Oder wird die mehrfach auf jeweils ActiveWorkSheet() umgebogen?

das sieht wie folgt aus(Global):

public static Excel.Application app = Rezepturprogramm.Globals.ThisAddIn.Application;
public static Excel.Workbook wb = app.ActiveWorkbook;
public static Excel.Worksheet ws = wb.ActiveSheet;

und weil ich nur 3 Sheets habe, habe ich die folgende Zeilen auch hinzugeschrieben:

static Excel.Worksheet sheet_1 = (Excel.Worksheet)wb.Worksheets["sheet_1"];
static Excel.Worksheet sheet_2 = (Excel.Worksheet)wb.Worksheets["sheet_2"];
static Excel.Worksheet sheet_3 = (Excel.Worksheet)wb.Worksheets["sheet_3"];

damit ich die aktive sheet wechseln kann. Als bsp.:

ws = sheet_1;
// hier wird sheet_1 als aktive sheet sein oder ?!

Und noch eine Sache, wegen mein Add-Ins, wenn ich den Workbook schließe, und neue öffne, dann funktioniert die funktionen nicht mehr. ich muss erst mal das ganze Excel Programm schließen und dann neustarten damit das gut funktioniert. Ich habe das Gefühl, es liegt daran dass den Range nicht wieder freigegeben wird oder nicht übergeschrieben wird.


VG
Kaiser
Biber
Biber 02.09.2011 um 13:52:28 Uhr
Goto Top
Moin KaiserQQ7,

ich bin da ja auch nur interessierter Laie, aber nach meinem Gefühl sind da ein paar zuviel variablen "static".

Wenn ich Excel wäre (was die Götter verhüten mögen), dann würde ich die Variable "ws" genau auf das Workbook setzen, was beim allerersten AddIn-start zufällig das "app.ActiveWorkbook" ist.
Das mag ja gewährleistet sein, dass dieses auch immer das "richtige" ist. Ich würde es dennoch mit Namen ansprechen ( app.WorkBook["Babe] oder ähnlich.

Und kannst du nochmal das Verhalten prüfen, wenn explizit am Ende der SortbyQty() das Range-Object destroyed wird (rngSort = Nothing) ?

Vielleicht ist da ja die ins Nirvana zeigende Referenz.

Grüße
Biber