Entwickler-Ecke

WinForms - C# - Formel in Zelle schreiben


ordu52 - Do 12.07.18 08:27
Titel: C# - Formel in Zelle schreiben

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
            // ---------- Excel-Arbeitsmappe öffnen ----------
            Excel.Application objExcel = new Excel.Application();
            objExcel.Visible = true;
            Excel.Workbook objWorkbook = objExcel.Workbooks.Open(Pfad);
            Excel.Worksheet objWorksheet = objWorkbook.Worksheets["Tabelle1"];
            Excel.Range objCell;

            // ---------- Letzte Spalte mit Inhalt ermitteln ----------
            int intLetzteSpalte = objWorksheet.UsedRange.Cells.Columns.Count;
            intLetzteSpalte++;

            // ---------- Berechnung - Werte in Zellen schreiben ----------
            int i = 2;
            objWorksheet.Cells[1, intLetzteSpalte] = "Betrag";
            objCell = objWorksheet.Cells[i, 1];
            while (objCell.Value != null)
            {
                objCell = objWorksheet.Cells[i, intLetzteSpalte];
                [b][color=red]objCell.Formula = "=WENN(F2=0;10;20)";[/color][/b]
                i++;
                objCell = objWorksheet.Cells[i, 1];
            }

            // ---------- Excel-Arbeitsmappe speichern & schließen ----------
            objExcel.DisplayAlerts = false;
            objWorkbook.SaveAs("Pfad", CreateBackup: false);
            objExcel.DisplayAlerts = true;
            objWorkbook.Close();
            objExcel.Quit();
            MessageBox.Show("Vorgang wurde erfolgreich durchgeführt.");


Hallo zusammen,

ich habe wieder mal eine Frage, wo ich leider nicht weiterkomme und auch dazu nichts im Netz gefunden habe. Ich programmiere gerade ein Programm, welches eine bereits vorhandene Excel-Arbeitsmappe öffnet und danach Formel in die Zellen schreibt.

Leider bekomme ich immer folgende Fehlermeldung, wenn ich die Zeile objCell.Formula = "=WENN(F2=0;10;20)" schreibe:
Zitat:
FM: System.Runtime.InteropServices.COMException: "Ausnahme von HRESULT: 0x800A03EC"

Wenn ich aber das "=WENN..." ersetze durch "Test" funktioniert das Programm und läuft erfolgreich durch.

Kann mir bitte vielleicht jemand helfen?

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt
Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Quote-Tags hinzugefügt


doublecross - Do 12.07.18 09:36

Hallo,

ich muss gestehen, ich habe so etwas nie gemacht und deshalb rate ich auch nur ins Blaue. Aber eine Egenschaft die ich bei Tabellenkalkulationen schon immer gruselig fand, ist das Funktionen übersetzt werden. Also dass die Funktion "WENN" und nicht "IF" heißt. Ich kann mir aber vorstellen, dass dise Übersetzung nicht greift, wenn du dass ganze per Schnittstelle bedienst, denn woher soll dein Programm wissen, dass es immer mit einem deutschen, französischen oder was weiß ich etwas Excel redet.

Daher würde ich drauf Tippen, dass du die Excel Funktion international, sprich englisch benennen musst. Als ersten Versuch würde ich also das "WENN" durch "IF" ersetzen und gucken was passiert.


ordu52 - Do 12.07.18 10:28

Hallo doublecross,

vielen Dank für deine Antwort. Allerdings hatte ich das bereits ausprobiert. Leider ohne Erfolg.

- Wenn ich objCell.Formula = "=IF(F2=19;10;20)"; schreibe, kommt eine FM (oben).

- Wenn ich objCell.FormulaLocal = "=IF(F2=19;10;20)"; schreibe, läuft das Programm erfolgreich durch, aber dann wird die While-Schleife nicht betrachtet und es werden alle Zellen in der Spalte mit der Formel befüllt.

- Wemn ich objCell.Formula = "Test"; schreibe, funktioniert das Programm ohne Probleme und auch die While-Schleife wird beachtet.



Ich denke auch, dass irgendetwas an der Formel nicht stimmt.


doublecross - Do 12.07.18 12:50

Ok, noch eine wilde Idee: Du weißt das ganze ja auf "Formular" zu, es sollte also klar sein, dass es sich um eine Formel handelt. Muss der String dann noch mit einem = beginnen?

Edit:

Was mit noch auffällt, auch wenn es wahrscheinlich nciht zu dem Problem führt: In deiner Schleife:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
            while (objCell.Value != null)
            {
                objCell = objWorksheet.Cells[i, intLetzteSpalte];
                objCell.Formula = "=WENN(F2=0;10;20)";
                i++;
                objCell = objWorksheet.Cells[i, 1];
            }


weißt in der ersten und der letzten Zeile einen Wert auf objCell zu. Das scheint mir wenig effektiv, da der Wert den du in der letzten Zeile zuweist, im nächsten durchlauf wieder überschrieben wird.

Edit2: In allen Beispielen [https://www.add-in-express.com/creating-addins-blog/2013/10/15/excel-cell-values-formulas-formatting-csharp/#Setting_Excel_cell], die ich finde wird über range.Formular gearbeitet, nicht über cell.Formular. Kann es sein das das Cell Objekt hier zickig ist?


Ralf Jansen - Do 12.07.18 15:53

Knallt es beim ersten setzen der Formel oder (da du das ja in einer Schleife machst) bei einer späteren Zuwiesung?
Das Netz [https://stackoverflow.com/questions/20422387/adding-formula-to-cell-exception-from-hresult-0x800a03ec] suggeriert das man Excel mit zu vielen Zuweisungen ~überfordern~ kann und man langsamer vorgehen sollte.


ordu52 - Mo 16.07.18 10:37

Hallo Ralf,

vielen Dank für deine Antwort.
Das Programm bricht sofort beimn ersten Mal zusammen.

Hast du vielleicht eine Idee?


Th69 - Mo 16.07.18 11:20

Lies mal Interop.Excel localization and Range.Formula vs FormulaLocal [https://stackoverflow.com/questions/32749946/interop-excel-localization-and-range-formula-vs-formulalocal] ganz durch. Könnte es bei dir auch das Komma sein (anstatt Semikolon)?

C#-Quelltext
1:
objCell.Formula = "=IF(F2=0,10,20)";                    


ordu52 - Mo 16.07.18 15:02

Hallo Th69 super vielen Dank, das hat funktioniert. :)

Allerdings habe ich nur noch ein kleines Problem.

Aktuell sieht die Formel so aus und wenn ich Sie ausführe steht das richtige in den Zellen der Spalte.

C#-Quelltext
1:
objCellXLSX.Formula = "=WENN(F" + i + "<0,E" + i + ",E" + i + "+(E" + i + "*F" + i + "/100))";                    

Mein Problem ist nur, dass wenn das Programm durch ist und ich Excel öffne. Steht in den Zellen der geschriebenen Spalte #Name?.

Erst wenn ich manuell in die Zelle klicke und auf Enter drücke, werden die berechneten Werte angezeigt in der Spalte.

Kannst du mir hierbei vielleicht helfen?

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Mo 16.07.18 15:46

Sorry, EXCEL ist nicht so mein Ding, aber vllt. hilft die _Worksheet.Calculate Method [https://docs.microsoft.com/en-US/dotnet/api/microsoft.office.interop.excel._worksheet.calculate?redirectedfrom=MSDN&view=excel-pia#Microsoft_Office_Interop_Excel__Worksheet_Calculate]?