Autor Beitrag
ordu52
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 12.07.18 08:27 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 149
Erhaltene Danke: 27

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 149
Erhaltene Danke: 27

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: 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:

ausblenden 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, die ich finde wird über range.Formular gearbeitet, nicht über cell.Formular. Kann es sein das das Cell Objekt hier zickig ist?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 suggeriert das man Excel mit zu vielen Zuweisungen ~überfordern~ kann und man langsamer vorgehen sollte.
ordu52 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 16.07.18 11:20 
Lies mal Interop.Excel localization and Range.Formula vs FormulaLocal ganz durch. Könnte es bei dir auch das Komma sein (anstatt Semikolon)?
ausblenden C#-Quelltext
1:
objCell.Formula = "=IF(F2=0,10,20)";					
ordu52 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 16.07.18 15:46 
Sorry, EXCEL ist nicht so mein Ding, aber vllt. hilft die _Worksheet.Calculate Method?