myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE7
   » Gadget für Vista
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» dotnetjob.de
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Office-Technologien » Exception bei Aufruf der Range.Autofilter-Methode
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Exception bei Aufruf der Range.Autofilter-Methode

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Lufros Lufros ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.06.2012
Beiträge: 3
Entwicklungsumgebung: Visual Studio 2010 Express


Lufros ist offline

Exception bei Aufruf der Range.Autofilter-Methode

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich habe bereits in der Suchfunktion geschaut und konnte nur alte Themen zu meiner Thematik finden, falls ich jedoch was übersehen haben sollte, wäre es nett, wenn man mir den entsprechenden Link geben könnte.

Zu meinem Problem: Ich möchte in ein Excel-Sheet ein DropDown-Menü einrichten, um die Spalte 3, also C, filtern zu können.

Bei meiner Recherche habe ich leider nicht feststellen können, woher die Methode nun weiß, in welcher Zeile sich der Pfeil, der das DropDown-Menü öffnet, sich befinden soll. Im ersten Argument gibt man ja nur die Spalte an.

C#-Code:
private Excel.Worksheet HinzufuegenDropDown(Excel.Worksheet xlSheet)
{
  Excel.Range ra1 = xlSheet.Cells[4, 3];
  Excel.Range ra2 = xlSheet.Cells[xlSheet.UsedRange.Rows.Count, 3];
  Excel.Range sumrange = xlSheet.get_Range(ra1, ra2);

  sumrange.AutoFilter(3, "10",Excel.XlAutoFilterOperator.xlTop10Items,Type.Missing, true);


  return xlSheet;
   }

Eigentlich habe ich die Methode richtig ausgefüllt, bekomme dennoch eine Exception.

Fehlermeldung:
Es wurde ein Problem festgestellt. Bitte überprüfen Sie die eingegebenen Daten. System.Runtime.InteropServices.COMException (0x800A03EC): Die AutoFilter-Methode des Range-Objektes konnte nicht ausgeführt werden.

bei System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)

bei Microsoft.Office.Interop.Excel.Range.AutoFilter(Object Field, Object Criteria1, XlAutoFilterOperator Operator, Object Criteria2, Object VisibleDropDown)

Der Fehler liegt also bei der AutoFilter-Methode, ich kann den Fehler aber einfach nicht finden.

C#-Code:
sumrange.AutoFilter(3, "10",Excel.XlAutoFilterOperator.xlTop10Items,Type.Missing, true);

Ich hoffe, dass mir jemand bei diesem Problem weiterhelfen kann,

mit freundlichen Grüßen,

Lufros
19.06.2012 14:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Taipi88 Taipi88 ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3220.jpg


Dabei seit: 02.02.2010
Beiträge: 239
Entwicklungsumgebung: VS 2010
Herkunft: Mainz


Taipi88 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

ich kann dir zwar leider den Grund für die Exception nicht sagen,
aber wirf doch einfach mal den Makro-Rekorder an - mach von Hand was du
willst und lass dir vom dadurch generierten VBA zeigen wie's richtig geht.

Lässt sich meist in C# dann sehr einfach nachbauen.

LG
Achim
19.06.2012 19:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Lufros Lufros ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.06.2012
Beiträge: 3
Entwicklungsumgebung: Visual Studio 2010 Express

Themenstarter Thema begonnen von Lufros

Lufros ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

danke für die Antwort Taipi88.
Ich habe den Ratschlag beherzigt und ein Makro aufgenommen:

C#-Code:
Range("F17:F23").Select
    Selection.AutoFilter
    Range("G15").Select
    Selection.AutoFilter Field:=1, Criteria1:="10", Operator:=xlTop10Items

Ich kenn mich mit VBA kaum aus, sehe aber keinen Unterschied zwischen meinem C#-Code und dem auotmatisch generierten?

Mit freundlichen Grüßen,

Lufros
20.06.2012 13:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Taipi88 Taipi88 ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3220.jpg


Dabei seit: 02.02.2010
Beiträge: 239
Entwicklungsumgebung: VS 2010
Herkunft: Mainz


Taipi88 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

ich habe mich heute auch mal ein bisschen blöd probiert, weil ich mich etwas blöd angestellt habe.

1. Die Top10-Items gibt es nur für Spalten, welche Excel als Zahlen-Spalten erkennt
2. Dein Methodenaufruf der AutoFilter-Methode ist insofern falsch, dass dein sumrange-Objekt nur eine einzige Spalte enthält - du jedoch der AutoFilter-Methode als Field 3 übergibst, was die Spalte innerhalb der Range angibt. (Hier müsste 1 stehen)
3. Ich verwende für optionale Parameter System.Reflection.Missing.Value - allerdings kann ich dir nicht sagen, ob das einen Unterschied macht.

Funktionierender Code auf dieser Basis, sowie eines Worksheets mit 3 Spalten, Spalte C enthält dabei ausschließlich Zahlen:

C#-Code:
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWkb = xlApp.Workbooks.Open("Test2.xlsx");
Excel.Worksheet xlSht = (Excel.Worksheet)xlWkb.Sheets[1];

Excel.Range xlRng1 = (Excel.Range)xlSht.Cells[1, 3];
Excel.Range xlRng2 = (Excel.Range)xlSht.Cells[xlSht.UsedRange.Rows.Count, 3];
Excel.Range xlRng3 = (Excel.Range)xlSht.get_Range(xlRng1, xlRng2);

xlRng3.AutoFilter(1, "10", Excel.XlAutoFilterOperator.xlTop10Items, missing, true);

xlWkb.Save();
xlApp.Quit();

Marshal.ReleaseComObject(xlRng3);
Marshal.ReleaseComObject(xlRng2);
Marshal.ReleaseComObject(xlRng1);
Marshal.ReleaseComObject(xlSht);
Marshal.ReleaseComObject(xlWkb);
Marshal.ReleaseComObject(xlApp);

Als Alternative zu dem Gefummel mit den Range-Objekten:
Bei diesem Aufruf wird ebenso die Spalte C gefiltert ;-)

C#-Code:
xlSht.Cells.AutoFilter(3, "10", Excel.XlAutoFilterOperator.xlTop10Items, missing, true);

LG
Achim
21.06.2012 08:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Lufros Lufros ist männlich
myCSharp.de-Mitglied

Dabei seit: 19.06.2012
Beiträge: 3
Entwicklungsumgebung: Visual Studio 2010 Express

Themenstarter Thema begonnen von Lufros

Lufros ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

vielen vielen Dank Achim. Deine Lösung hat wunderbar funktioniert.
Nur gab es ein kleines Missverständnis, der Autofilter sollte nur über eine Spalte gehen, die "3" hatte ich eingefügt, da ich davon ausgegangen bin, dass sich der Integer auf die gesamte Tabelle bezieht und Spalte C ist ja bekanntlich 3.
Es lag also daran und an dem Operator, hab Field auf 1 gesetzt und den Operator ebenfalls geändert.

zu 3: Man kann nicht verwendete Parameter auch einfach leer lassen und der letzte Parameter "Visible" der AutoFilter-Methode ist schon per Default auf true.

Hier mein Code:

C#-Code:
private static Excel.Worksheet HinzufuegenDropDown(Excel.Worksheet xlSheet)
        {
            try
            {
                Excel.Range ra1 = xlSheet.Cells[3, 3];
                Excel.Range ra2 = xlSheet.Cells[xlSheet.UsedRange.Rows.Count, 3];
                Excel.Range sumrange = xlSheet.get_Range(ra1, ra2);

                sumrange.AutoFilter(1, "10", Excel.XlAutoFilterOperator.xlAnd);
                Marshal.FinalReleaseComObject(ra1);
                Marshal.FinalReleaseComObject(ra2);
                Marshal.FinalReleaseComObject(sumrange);

                  return xlSheet;
            }
// catch block
}

Vielen Dank nochmal,
mit freundlichen Grüßen,

Lufros
21.06.2012 13:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Taipi88 Taipi88 ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-3220.jpg


Dabei seit: 02.02.2010
Beiträge: 239
Entwicklungsumgebung: VS 2010
Herkunft: Mainz


Taipi88 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi,

schön, dass es funktioniert ;-)

Was die optionalen Parameter angeht:
Recht hast du - aber das war nicht immer so, weshalb ich das Type.Missing zumindest erwähnen wollte, da ich nicht weiß, ob es einen Unterschied macht.

Liebe Grüße
Achim
21.06.2012 20:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 11 Monate.
Der letzte Beitrag ist älter als 11 Monate.
Antwort erstellen


© Copyright 2003-2013 myCSharp.de-Team. Alle Rechte vorbehalten. 23.05.2013 23:11