Guten Morgen zusammen,
ich habe eine Frage bezüglich Windows-Forms-Anwendungen in Verbindung mit MS Excel in C#.
Ich lese mit C# eine vorhandene Excel Datei aus und möchte nach einer Abfrage in die Excel Tabelle Werte reinschreiben.
Das Reinschreiben von Werten in Zellen funktioniert schon, wenn ich den Spaltenname manuell eingebe zum Beispiel (i, 5). I ist dann der Wert der in der Schleife immer hochgezählt wird.
Meine Frage wäre, ob und wie es möglich ist, dass ich in C# den Index der letztem befüllten Spalte auslesen kann, damit ich automatisiert die Werte in die letzte Spalte +1 eintragen kann.
Vielen Dank im Voraus
Hallo,
du kannst ja einfach beim beschreiben der Tabelle die letzte beschriebene Zelle in einer Variable speichern. (Wenn das nicht das ist, was du meinst, dann wäre ein Stück Code nicht schlecht.)
Gruß Thomas
Hallo Thomas,
vielen Dank für die schnelle Antwort.
Ich glaube, ich habe eine Information vergessen.
Die Tabelle ist beim Öffnen bereits befüllt.
zum Beispiel ist bis Spalte E mit Inhalt befüllt.
Ich möchte jetzt erreichen, dass ich den Index der Spalte E (in diesem Fall auslese) und + 1 mache, damit ich den Index für die Spalte F habe.
Mit welcher Technologie greifst du denn auf Excel zu (OLE, Office COM Interop, ...)?
Daher paßt dieser Beitrag wohl eher ins Unterforum "Datentechnologien" oder "Office-Technologien".
Probiere mal, ob dir eine der Lösungen unter Programmatically getting the last filled excel row using C# hilft?
Hallo vielen Dank für die hilfreichen Antworten.
Das Problem konnte ich lösen. Das Ergebnis poste ich anschließend noch rein.
Allerdings hätte ich noch eine Frage bzw. ein Problem.
Ich habe folgende Schleife.
while (objCell.Value != null)
{
if (objCellIf.Value != null)
{
objCellIf = objWorksheet.Cells[i, 10];
objCellIf.Formula = "=A" + i;
}
else
{
objCellIf = objWorksheet.Cells[i, 10];
objCellIf.Formula = "=RUNDEN(A" + i + "+(A" + i + "*B" + i + "/100);2)";
}
i++;
objCell = objWorksheet.Cells[i, 1];
objCellIf = objWorksheet.Cells[i, 6];
}
Diese Schleife überprüft, ob der Zellwert ungleich null ist, wenn ja geht er in die If-Bedingung. Die If-Bedingung überprüft ob die nächste Zelle leer ist, wenn ja führt er ein Statement aus, wenn nicht dann führt er ein anderen Statement aus.
Jetzt ist allerdings mein Problem, dass er irgendwie die else Bedingung nicht ausführt, bzw. das Programm bricht mit der FM System.Runtime.InteropServices.COMException: "Ausnahme von HRESULT: 0x800A03EC" ab.
Kann mir jemand helfen?
Was sagt der Debugger? Was sagen die Ergebnisse bei der Google Suche nach der FehlerID?
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
Wozu überhaupt die Schleife?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo vielen Dank für die Antwort.
also ich habe in der folgenden Zeile ein Problem
objCellIf.Formula = "'=RUNDEN(A" + i + "+(A" + i + "*B" + i + "/100);2)";
Wenn ich " '= mache, bekomme ich keine Fehleremeldung, aber Excel rechnet es mir nicht automatisch aus. Erst wenn ich das einfach Anführungszeichen manuell lösche, wird es berechnet.
In der oberen Zeile
objCellIf.Formula = "=E" + i;
funktioniert es allerdings ohne Probleme. Da habe ich auch den einfach Anführungszeichen nach dem doppelten Anführungszeichen drinn.
In der Zelle steht dann auch '=E5, aber es wird automatisch berechnet.
Hi Ordu52,
ich sehe keinen Zusammenhang zu deinem Problem im ersten Post und zu dem Code bzw. der Fehlermeldung aus deinem letzten Post. Woher kommt denn das einfache Anführungszeichen? Was willst du damit bewirken? In welchem Fall gibt es den o.g. Fehler? Es gibt doch genügend Beispiele im Netz, wie man mit Excel-Interop arbeitet, hast du dir mal ein paar Beispiele angeschaut?
Weeks of programming can save you hours of planning
// ---------- 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;
Excel.Range objCellIf;
// ---------- Letzte befüllte Spalte ermitteln ----------
int intLetzteSpalte = objWorksheet.UsedRange.Cells.Columns.Count;
intLetzteSpalte++;
// ---------- strFormel - Wert in Zellen schreiben ----------
int i = 2;
objWorksheet.Cells[1, intLetzteSpalte] = "ns1:Bruttobetrag";
objCell = objWorksheet.Cells[i, 1];
objCellIf = objWorksheet.Cells[i, 6];
while (objCell.Value != null)
{
if (objCellIf.Value != null)
{
objCellIf = objWorksheet.Cells[i, intLetzteSpalte];
objCellIf.Formula = "=A" + i;
}
else
{
objCellIf = objWorksheet.Cells[i, intLetzteSpalte];
objCellIf.Formula = "'=RUNDEN(A" + i + "+(A" + i + "*B" + i + "/100);2)";
}
i++;
objCell = objWorksheet.Cells[i, 1];
objCellIf = objWorksheet.Cells[i, 6];
}
// ---------- Excel-Arbeitsmappe speichern & schließen
objExcel.DisplayAlerts = false;
objWorkbook.SaveAs("Pfad", CreateBackup: false);
objExcel.DisplayAlerts = true;
objWorkbook.Close();
objExcel.Quit();
MessageBox.Show("Vorgang erfolgreich durchgeführt.");
Hallo das ist mein kompletter Code.
Also ich habe zwei Spalten.
Erste Spalte A: Betrag
Zweite Spalte B: MwSt.
Die While Schleife geht die Spalte B durch und schaut, ob in der Zelle ein Wert ist, wenn nicht, dann schreibt er in die neue Spalte zum Beispiel D nur den Betrag.
Falls ein Wert steht, rechnet er die Mwst. auf den Betrag drauf und rundet auf zwei Nachkommastellen und dann schreibt er den Wert in Spalte D rein.
Ich hoffe, ich konnte mich diesmal ausdrücken und konnte mein Problem schildern.
Wie gesagt, ich habe nur ein Problem mit der Zeile, wo ich die Formel übergebe.