Fangen Sie NullReferenceException explizit in einer Try...Catch....Finally-Anweisung ab.
Eine Try…Catch…Finally-Anweisung kann den Code auf bestimmte Ausnahmetypen prüfen, angefangen von sehr spezifischen bis hin zu sehr allgemeinen Ausnahmen.
Habe ich gemacht für jeden einzelnen Block,
mit deiner Einstellung meckert er zwar immer noch, aber siehe da, jetzt macht er das was er soll,
Der gesamtCode bisher
private void Config()
{
try
{
CheckExcellProcesses();
Microsoft.Office.Interop.Excel.Application excel =
new Microsoft.Office.Interop.Excel.Application();
excel.Visible = false;
// Dateipfad
string currentDir = Environment.CurrentDirectory;
Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Open(currentDir + @"\config.dif");
// Das erste Arbeitsblatt referenzieren
Microsoft.Office.Interop.Excel.Worksheet worksheet =
(Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
try
{
//Daten Spalte A
Excel.Range rangeA;
rangeA = worksheet.get_Range("A1", "A100");
//Abrufen der Daten aus Spalte A
System.Object[,] A;
A = rangeA.get_Value(Missing.Value);
//verkleinere array auf Inhalt.
long iRowsA;
long iColsA;
iRowsA = A.GetUpperBound(0);
iColsA = A.GetUpperBound(1);
//Array in einem String zusammenfassen
String valueStringA;
for (long rowCounter = 1; rowCounter ≤ iRowsA; rowCounter++)
{
for (long colCounter = 1; colCounter ≤ iColsA; colCounter++)
{
valueStringA = String.Join("\n", A[rowCounter, colCounter].ToString());
string[] installsA = new string[] { valueStringA };
comboBoxlm1.Items.AddRange(installsA);
comboBoxhd1.Items.AddRange(installsA);
}
}
}
catch (Exception)
{
}
try
{
//Daten Spalte C
Excel.Range rangeC;
rangeC = worksheet.get_Range("C1", "C100");
//Abrufen der Daten aus Spalte C
System.Object[,] C;
C = rangeC.get_Value(Missing.Value);
//verkleinere array auf Inhalt.
long iRowsC;
long iColsC;
iRowsC = C.GetUpperBound(0);
iColsC = C.GetUpperBound(1);
//Array in einem String zusammenfassen
String valueStringC;
for (long rowCounter = 1; rowCounter ≤ iRowsC; rowCounter++)
{
for (long colCounter = 1; colCounter ≤ iColsC; colCounter++)
{
valueStringC = String.Join("\n", C[rowCounter, colCounter].ToString());
string[] installsC = new string[] { valueStringC };
comboBoxlm2.Items.AddRange(installsC);
comboBoxhd2.Items.AddRange(installsC);
}
}
}
catch (Exception)
{
}
try
{
//Daten Spalte E
Excel.Range rangeE;
rangeE = worksheet.get_Range("E1", "E100");
//Abrufen der Daten aus Spalte F
System.Object[,] E;
E = rangeE.get_Value(Missing.Value);
//verkleinere array auf Inhalt.
long iRowsE;
long iColsE;
iRowsE = E.GetUpperBound(0);
iColsE = E.GetUpperBound(1);
//Array in einem String zusammenfassen
String valueStringE;
for (long rowCounter = 1; rowCounter ≤ iRowsE; rowCounter++)
{
for (long colCounter = 1; colCounter ≤ iColsE; colCounter++)
{
valueStringE = String.Join("\n", E[rowCounter, colCounter].ToString());
string[] installsE = new string[] { valueStringE };
comboBoxlm3.Items.AddRange(installsE);
comboBoxhd3.Items.AddRange(installsE);
}
}
}
catch (Exception)
{
}
// Speichern damit Datei nicht in Excel hängen bleibt
string folderName = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName);
string fileName = Path.Combine(folderName, "config.dif");
if (File.Exists(fileName))
{
File.Delete(fileName);
excel.AlertBeforeOverwriting = false;
excel.DisplayAlerts = false;
workbook.Save();
workbook.Close();
excel.Quit();
}
else
{
workbook.SaveAs(fileName);
workbook.Close();
// Excel beenden
excel.Quit();
}
}
catch (Exception e)
{
//String errorMessage;
//errorMessage = "Fehler: ";
//errorMessage = String.Concat(errorMessage, e.Message + "\n");
//errorMessage = String.Concat(errorMessage, e.TargetSite + "\n");
//errorMessage = String.Concat(errorMessage, e.Source + "\n");
//errorMessage = String.Concat(errorMessage, e.HelpLink + "\n");
//errorMessage = String.Concat(errorMessage, e.InnerException + "\n");
//errorMessage = String.Concat(errorMessage, e.StackTrace + "\n");
//errorMessage = String.Concat(errorMessage, e.TargetSite + "\n");
//errorMessage = String.Concat(errorMessage, e.Data + "\n");
//errorMessage = String.Concat(errorMessage, e.GetBaseException() + "\n");
//System.Windows.MessageBox.Show(errorMessage, "Error");
}
finally
{
KillExcel();
}
}
hi Sebastian, ich bekomme keine Meldung in welcher Zeile das passiert,
kann dir sagen das es in
private void Config()
passiert,
und wenn ich einen Block auskommentiere,
bekomme ich keinen Fehler.
nur wenn ich beide Blöcke stehen lasse.
aber das wird dir auch net sonderlich weiterhelfen,
mit nachfolgendem Code lese ich die Spalte einer Exceldatei aus und lasse die Einträge in eine Combobox eintragen.
Soweit so gut, es funktioniert aber nur mit einer Spalte der Befehl für die Spalte C wird nicht ausgeführt.
Meiner Vermutung nach ligt es an der Mehrfachverwendung des Objektes
System.Object[,] A;
bzw.
System.Object[,] C;
wie kann ich nach Ablauf der ersten Prozedur,
System.Object[,] A;
das Neue Object
System.Object[,] C;
setzen???
Möchte fünf Spalten einlesen und in unterschiedliche ComboBoxen eintragen
//Daten Spalte A
Excel.Range rangeA;
rangeA = worksheet.get_Range("A1", "A100");
//Abrufen der Daten aus Spalte A
System.Object[,] A;
A = rangeA.get_Value(Missing.Value);
//verkleinere array auf Inhalt.
long iRowsA;
long iColsA;
iRowsA = A.GetUpperBound(0);
iColsA = A.GetUpperBound(1);
//Array in einem String zusammenfassen
String valueStringA;
for (long rowCounter = 1; rowCounter ≤ iRowsA; rowCounter++)
{
for (long colCounter = 1; colCounter ≤ iColsA; colCounter++)
{
valueStringA = String.Join("\n", A[rowCounter, colCounter].ToString());
string[] installsA = new string[] { valueStringA };
comboBoxlm1.Items.AddRange(installsA);
comboBoxhd1.Items.AddRange(installsA);
}
}
//Daten Spalte C
Excel.Range rangeC;
rangeC = worksheet.get_Range("C1", "C100");
//Abrufen der Daten aus Spalte C
System.Object[,] C;
C = rangeC.get_Value(Missing.Value);
//verkleinere array auf Inhalt.
long iRowsC;
long iColsC;
iRowsC = C.GetUpperBound(0);
iColsC = C.GetUpperBound(1);
//Array in einem String zusammenfassen
String valueStringC;
for (long rowCounter = 1; rowCounter ≤ iRowsC; rowCounter++)
{
for (long colCounter = 1; colCounter ≤ iColsC; colCounter++)
{
valueStringC = String.Join("\n", C[rowCounter, colCounter].ToString());
string[] installsC = new string[] { valueStringC };
comboBoxlm1.Items.AddRange(installsC);
comboBoxhd1.Items.AddRange(installsC);
}
}
Hoffe das es verständlich ausgedrückt ist :-)
kann jemand helfen?
Hinweis "... jedes einzeln angesprochen tut was es tuen soll, nur zusammen tun`s net..." :-(
Habe ein Programm geschrieben...
Wenn ich es aufrufe
und eine Datei öffnen möchte, dauert es gefühlt sehr lange bis das Fenster erscheint. Indem ich dann die Datei auswählen kann.
Nächstes Problem, öffne ich eine Datei und lese diese ein, dauert es ebenfalls gefühlt zu lange bis die Daten eingelesen sind. Ist Excel im Hintergrund aber aktiv.
geht es seher flott.
Hi Sebastian, kann ja auch keine Fehlermeldung kommen,
habe sie ja kommentiert, ...
Das ist der Grundsource
der Später noch um bis zu tausend Eingaben erweitert wird.
leider immer nur von und nach Textboxen.
trägt die Daten in die Textbox.
Aber nur so lange in der Zelle auch Daten sind, egal ob Text oder Ziffern.
Ist aber eine Zelle leer, bleibt das Programm an dieser hängen und arbeitet nicht weiter, Ohne Fehlermeldung!
Deshalb habe ich versucht eine if Schleife zu setzen.
an dieser scheitere ich gerade.
Zum Dataset, kenn mich damit nicht so aus.. bin schon neuling.
Das Programm erstellt und verwaltet eine bzw. mehrere Exceldatei/en , die Daten werden nach und nach vom User eingegeben wobei nicht jedes Feld Daten erhält.
Deshalb gibt es in Excel ab und an eine "Leerzelle".
Wenn das Programm aber die Datei öffnen und auslesen soll, benötige ich auch die Info das in dieser Zelle nichts eingegeben wurde.
if (worksheet.Cells[1, 2] == "")
{
// egal mach nichts weil Zelle des Tabellenblattes ist leer
}
{
//ist nicht leer? dann Inhalt Convertieren in String nach TextBox.Sowiso
textBox2.Text = worksheet.Cells[1, 2].Value.ToString();
}
Kann jemand helfen? Weil so klappt es nicht.
lg nicknet
Oder gibt es eine Rutine die man anwenden kann, Weil ich ein paar hundert Zellen abfragen muss?