|
|
Autor
 |
|
Lufros
myCSharp.de-Mitglied
Dabei seit: 19.06.2012
Beiträge: 3
Entwicklungsumgebung: Visual Studio 2010 Express
|
|
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
myCSharp.de-Mitglied
Dabei seit: 02.02.2010
Beiträge: 239
Entwicklungsumgebung: VS 2010 Herkunft: Mainz
|
|
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
myCSharp.de-Mitglied
Dabei seit: 19.06.2012
Beiträge: 3
Entwicklungsumgebung: Visual Studio 2010 Express
Themenstarter
|
|
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
myCSharp.de-Mitglied
Dabei seit: 02.02.2010
Beiträge: 239
Entwicklungsumgebung: VS 2010 Herkunft: Mainz
|
|
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
myCSharp.de-Mitglied
Dabei seit: 19.06.2012
Beiträge: 3
Entwicklungsumgebung: Visual Studio 2010 Express
Themenstarter
|
|
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;
}
}
|
Vielen Dank nochmal,
mit freundlichen Grüßen,
Lufros
|
|
21.06.2012 13:50
|
E-Mail |
Beiträge des Benutzers |
zu Buddylist hinzufügen
|
|
Taipi88
myCSharp.de-Mitglied
Dabei seit: 02.02.2010
Beiträge: 239
Entwicklungsumgebung: VS 2010 Herkunft: Mainz
|
|
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
|
|
|