Zahlen aus vb.net in Excel schreiben (Problem mit Dezimaltrennzeichen)

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von PeterPan0815.

    Zahlen aus vb.net in Excel schreiben (Problem mit Dezimaltrennzeichen)

    Hallo,

    ich habe ein Problem, wenn ich aus einem vb.net Programm heraus Werte in ein Excelsheet eintragen will.
    Im Prinzip funktioniert alles wie gewollt, ich lege ein Excelblatt an und will darin eine Protokolldatei ausgeben.
    Reine Texte sind kein Problem, diese werden mit xlsBlatt.Cells(Row, Col) = TextString an die gewünschte Position geschrieben und dann formatiert (Dim xlsBlatt As iExcel.Worksheet)

    Bei Zahlen geht jetzt aber das Elend los.
    Wenn ich zB. folgendes mache:

    VB.NET-Quellcode

    1. ZahlDouble=3375
    2. xlsBlatt.Cells(Row, Col) = (ZahlDouble/1000).ToString

    Dann erscheint in der Excelzelle 3.375, was 3375 entspricht
    Mache ich das Ganze zB mit:

    VB.NET-Quellcode

    1. ZahlDouble=450
    2. xlsBlatt.Cells(Row, Col) = (ZahlDouble/1000).ToString

    Dann erscheint wie erwartet in der Zelle 0,45. Ich habe noch mehr Beispiele, je nachdem wie viele Stellen mit Zahlen vor bzw. nach dem Komma vorhanden sind, ist das Ergebnis in Excel OK, oder auch nicht
    Ich vermute es liegt daran, das vb.net mit dem amerikanischen Punkt als Dezimaltrennzeichen arbeitet und Excel je nach Zahl dieses uminterpretiert, daher habe ich auch schon damit rumexperimentiert:

    VB.NET-Quellcode

    1. ZahlDouble=3375
    2. xlsBlatt.Cells(Row, Col) = (ZahlDouble/1000).ToString(CultureInfo.CreateSpecificCulture("de-DE"))

    führt aber zum gleichen (falschen) Ergebnis.

    Hat irgendjemand eine Idee was ich machen muß um die Zahlen (egal! welche) richtig nach Excel rüberzubekommen???
    Zur Not würde ich auch die Zellen mit Zahlen als Text formatieren, aber auch das funktioniert irgendwie nicht

    VB.NET-Quellcode

    1. xlsBlatt.Range(xlsBlatt.Cells(Row, Col), xlsBlatt.Cells(Row, Col)).NumberFormat = "@"


    Danke im Voraus
    Sascha
    Teste mal, was Excel haben will:

    VB.NET-Quellcode

    1. xlsBlatt.Cells(Row, Col) = "1.23"
    2. xlsBlatt.Cells(Row, Col + 1) = "1,23"
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Excel will auf jeden Fall "3,375", wenn ich das als Text schreibe, dann gehts auch

    VB.NET-Quellcode

    1. xlsBlatt.Cells(Row, Col) = "3,375"

    Mache ich aber folgendes daraus:

    VB.NET-Quellcode

    1. ZahlDouble=3375
    2. TextString=CStr(ZahlDouble/1000)
    3. xlsBlatt.Cells(Row, Col) = TextString

    Vor der Übergabe an Excel steht in TextString auch "3,375" mit einem Komma, wenn ich TextString zB in einer Textbox ausgebe steht da auch ein Komma, wenn ich den String an Excel schicke schreibt er einen Punkt. ?(

    Irgendwie passiert es aber anscheinend nicht immer.
    Ich habe mehrere Arbeitsblätter, die von der gleichen Subroutine angelegt werden (nur Anlegen und Namen vergeben, keine Formatierungen), auf dem einen Blatt schicke ich das wie oben beschrieben raus und dann steht da 3.375, auf dem anderen steht 3,375
    Wenn ich die Zellen vor dem Eintragen der Werte als Text formatiere, dann frisst Ecxel das Komma:

    VB.NET-Quellcode

    1. Zahl = 3375
    2. Text = CStr(Zahl / 1000)
    3. Call outToExcel_TextFormatted(1, 1, "3,375", -1, False)
    4. Call outToExcel_TextFormatted(2, 1, Text, -1, False)
    5. Call outToExcel_TextFormatted(3, 1, (Zahl / 1000).ToString, -1, False)
    6. xlsBlatt.Range(xlsBlatt.Cells(1, 2), xlsBlatt.Cells(3, 2)).NumberFormat = "@"
    7. Call outToExcel_TextFormatted(1, 2, "3,375", -1, False)
    8. Call outToExcel_TextFormatted(2, 2, Text, -1, False)
    9. Call outToExcel_TextFormatted(3, 2, (Zahl / 1000).ToString, -1, False)

    outToExcel ist eine eigene Routine, wichtig ist der dritte Parameter, dieser wird mit xlsBlatt.Cells(Row, Col) = Text ausgegeben
    Ergebnis bei diesen Aufrufen:
    In der ersten Spalte steht in Excel dreimal 3.375 (die ersten drei Aufrufe), in der zweiten Spalte steht dreimal 3,375.
    Ergo: Als Text gehts, aber wenn die Zellenals "Standard" formatiert sind dann formatiert Excel die Zahl um, selbst den ersten Aufruf wenn es 3,375 übergeben bekommt macht es daraus 3.375

    Es scheint daran zu liegen, das der Wert zusammen mit der Regionaleinstellung Punkt oder Komma als Dezimaltrennzeichen übergeben werden muß. Wie schon geschrieben habe ich es mit ".ToString(CultureInfo.CreateSpecificCulture("de-DE")" versucht,
    aber das geht auch nicht
    Im Moment experimentiere ich mit folgendem rum:

    VB.NET-Quellcode

    1. Dim nfi As NumberFormatInfo = New CultureInfo("de-DE", True).NumberFormat
    2. nfi.NumberDecimalSeparator = ","
    3. nfi.NumberDecimalDigits = 4
    4. Zahl = 3375
    5. Call outToExcel_TextFormatted(1, 4, (Zahl / 1000).ToString("G", nfi), -1, False)

    Ist aber auch noch nicht zielführend

    PeterPan0815 schrieb:

    Wenn ich die Zellen vor dem Eintragen der Werte als Text formatiere, dann frisst Excel das Komma:
    Aha.
    Was sagt das Programm zur direkten Übergabe einer Zahl (in Excel bitte als Zahl formatieren) :?:

    VB.NET-Quellcode

    1. xlsBlatt.Cells(Row, Col) = 1.23
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    RodFromGermany hatte den entscheidenden Tip. :D

    Wenn ich einen Variable als Double an Excel übergebe, dann nimmt Excel auch das richtige Dezimalzeichen, wenn ich es in einem String übergebe (selbst wenn in dem String ein Komma steht), dann formatiert Excel um.

    Ich habe es jetzt so gelöst, das ich meiner Funktion zwei Parameter optional übergebe, einen Text und eine Zahl, wenn ein Text kommt, dann gibt sie den String an Excel, wenn eine Zahl kommt dann eben die Double Variable.

    Laut vb-Hilfe sollte es eigentlich mit CultureInfo und NumberDecimalSeparator, sowie NumberDecimalDigits funktionieren, aber ich bin nur bis dahin gekommen, das die Zahl mit richtigem Dezimaltrennzeichen in Excel steht und 2 Nachkommastellen hat, es ließ sich nicht dazu zu bewegen 3 oder mehr Stellen zu zeigen, dann war immer direkt wieder der Punkt da. (Seltsam, aber was solls)