Überlastung bei zu vielen "Zahl in Zelle ist als Text formatiert"

  • Excel

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Überlastung bei zu vielen "Zahl in Zelle ist als Text formatiert"

    Hallo zusammen,

    ich programmiere in Visual Basic, nicht in VBA und hoffe, das Forum passt trotzdem ;)
    Nun stehe ich vor einem Problem, das ich nach langer Recherche und ausprobieren immer noch nicht lösen kann:
    ich schreibe zunächst (sehr viele) Werte aus .txt Dateien in Object Variablen und verrechne sie miteinander. Dann trage ich sie in eine Excel Tabelle ein.
    Jedoch werden alle als Kommazahl darstellbaren Zahlen als Text eingetragen. Zahlen mit Exponenten werden korrekt als Zahl eingetragen. Mein Code zum Eintragen sieht exemplarisch so aus:

    oBook.Worksheets("Werte Serie").range("A4:A2004").value = Spannung(0)

    Spannung() ist ein Array aus Objekten. Kann ich hier schon erreichen, dass statt dem Text eine Zahl eingetragen wird?
    Um die Zellen umzuwandeln habe ich folgendes versucht:

    'Zellen formatieren
    oBook.Worksheets("Werte Serie").Cells.numberFormat = "General"
    oBook.Worksheets("Werte Serie").Cells.numberFormat = "0,000000E+00"
    For x = 4 To 2000
    For y = 1 To 50
    z = IsNumeric(oBook.Worksheets("Werte Serie").Cells(x, y).value)
    If z = False Then
    If oBook.Worksheets("Werte Serie").Cells(x, y).value <> "" Then
    oBook.Worksheets("Werte Serie").Cells(x, y).value = CDbl(oBook.Worksheets("Werte Serie").Cells(x, y).value)
    End If
    End If
    Next
    Next

    Bei einer einzelnen Zelle klappt es auch, bei 2000x50 dauert das aber viel zu lange (Minuten), und ich muss das mit vielen Excel Dateien machen. Daher meine Frage:
    Gibt es einen eleganteren/resourcenschonenderen Weg die Zahlen als Zahlen einzutragen oder die Zellen umzuwandeln? Ich möchte eigentlich alle Zahlen wissenschaftlich mit 6 Dezimalzeichen darstellen.

    Ich hoffe jemand weiß da Bescheid und ist so freundlich mir zu helfen :)

    Viele Grüße,
    Simon

    simonsns schrieb:

    ich programmiere in Visual Basic, nicht in VBA
    Kannst du das noch präzisieren?
    Hast du ein VB6-Programm, mit dem du Excel-Dateien bearbeitest?
    Oder VB.Net? Oder VBS? Oder doch VBA?

    simonsns schrieb:

    ich schreibe zunächst (sehr viele) Werte aus .txt Dateien in Object Variablen
    Warum in Object und nicht in Double?

    simonsns schrieb:

    Jedoch werden alle als Kommazahl darstellbaren Zahlen als Text eingetragen
    Die Regionaleinstellungen von Excel und deiner Datenquelle sollten zusammenpassen.
    Da wird wohl einer Komma und einer Punkt als Decimalseparator verwenden.
    Und da du Datentyp Object verwendest, weisst du vermutlich nicht mal was genau da drin steht.
    Womit wir wieder bei Punkt 1 wären: Warum nicht Double?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    vielen Dank für dein Antwort!

    petaod schrieb:

    Kannst du das noch präzisieren?
    Hast du ein VB6-Programm, mit dem du Excel-Dateien bearbeitest?
    Oder VB.Net? Oder VBS? Oder doch VBA?


    ich benutze visual basic 10 express und erstelle ein Windows forms Anwendung. Von dort rufe von dort die einzelnen Excel Dateien auf.

    petaod schrieb:

    Die Regionaleinstellungen von Excel und deiner Datenquelle sollten zusammenpassen.
    Da wird wohl einer Komma und einer Punkt als Decimalseparator verwenden.
    Und da du Datentyp Object verwendest, weisst du vermutlich nicht mal was genau da drin steht.
    Womit wir wieder bei Punkt 1 wären: Warum nicht Double?


    In den txt Dateien wird ein Komma als Dezimalzeichen verwendet, in den Excel Dateien auch.

    Ich benutze Objekt Variablen, da ich die .txt Dateien wie Excel Dateien behandle und der Ausgabewert von dem Wert der Zelle (.value) Object ist. (das funktioniert) Ich habe es am Anfang auch mit double versucht, das führte jedoch immer zu Fehlern. Hier ist mal ein Einlesevorgang exemplarisch bei einem Ordner mit txt Dateien aufgezeigt:

    For index As Integer = 1 To txtanzahl

    oBook = oExcel.Workbooks.Open(txtnamen(index - 1))
    oSheet = oBook.Worksheets(1)
    Spannung(index - 1) = oSheet.range("B2", "B2000").value
    Dehnung(index - 1) = oSheet.range("C2", "C2000").value
    oBook.close()
    Next

    txtnamen ist ein Array mit den Adressen der gefundenen txt Dateien. Jedes Objekt von dem Array Spannung () ist ein Array mit 1999 doubles. Wollte es am Anfang wie gesagt auch als 2D double Array machen, jetzt steht aber schon recht viel Code. Deshalb zurück zu meiner Frage:
    gibt es einen einfachen Weg, viele als Text gespeicherte Zahlen in Zahlen umzuwandeln?

    Viele Grüße,
    Simon

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „simonsns“ ()

    Du überlässt bei deiner Methode halt arg viel dem Zufall der Excel-Interpretation.
    Ich hab's immer recht gerne, wenn ich das Datenformat kenne, das ich durch die Gegend schiebe.


    Versuch's mal mit

    VB.NET-Quellcode

    1. oBook.Worksheets("Werte Serie").UsedRange.NumberFormat = "0,000000E+00"
    2. oBook.Worksheets("Werte Serie").UsedRange.Formula = oBook.Worksheets("Werte Serie").UsedRange.Value
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo Petaod,

    danke nochmal für deine Antwort! Ich habe deinen Vorschlag ausprobiert, er funktioniert leider nicht... Ich habe jetzt echt alle Register gezogen und beiße mir an diesem (scheinbar) trivialen Problem echt die Zähne aus.
    Der Grund warum ich Object Variablen benutze ist der, dass ich die txt Dateien wie Excel Dateien behandle, der Rückgabewert der einzelnen Zellen in der Range ist Object.
    Ich habe mal Probeweise die Objektvariablen, die ich mit den txt Dateien befüllt habe in 2D Double Arrays umgewandelt. Anschließend habe ich sie mit 2 for Schleifen in die Excel Dateien eingetragen (also Zelle für Zelle). Das dauert jetzt jedoch ungefähr 20 mal so lange, ist also nicht mehr akzeptabel.

    Hat jemand noch eine Idee, wie das Umwandeln von Strings zu Zahlen in Excel bei vielen Zellen funktionieren kann?

    Viele Grüße,
    Simon Scherer

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „simonsns“ ()

    Hallo zusammen,

    hast du (Petaod) oder jemand anderes eine Idee wie man das Umwandeln viele als String gespeicherter Zahlen in Zahlen programmieren kann? Ich habe mal ein Beispiel eingefügt. So sieht die Excel Datei ungefähr aus:

    dropbox.com/s/9lgayvjodcsn3yt/Beispiel.xlsx?dl=0

    Der Code dazu (der noch nicht klappt...):

    Dim oExcel As Object
    Dim oBook As Object
    Dim oSheet As Object

    oExcel = CreateObject("Excel.Application")
    oBook = oExcel.Workbooks.Open(propfad)
    oBook.Worksheets(1).usedrange.numberFormat = "General"
    oBook.Worksheets(1).usedrange.numberFormat = "0,000000E+00"
    oBook.Worksheets(1).UsedRange.Formula = oBook.Worksheets("Werte Serie").UsedRange.Value

    oBook.Save()
    oBook.close()
    oExcel.Quit()


    Viele Grüße,
    Simon

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „simonsns“ ()

    simonsns schrieb:

    .numberFormat = "0,000000E+00"
    ergibt keinen Sinn. Das wären für die Zahl 123456789 dann ganz komische Zahlenformate wie 0,000,012E+07 (je nach regionalen Settings).
    Wahrscheinlich willst du .NumberFormat = "0.000000E+00". Dann kommt das raus: 1,234568E+08 (auch wieder von den Regionalsettings abhängig)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke für deine Antwort. Hab das nur oben von dir so kopiert. Das kommt aber erst, wenn die Strings als Zahlen in den Zellen stehen...
    Wie ich schon gesagt habe geht es mir primär darum Zahlen, die als String gespeichert sind mit Visual Basic in Zahlen umzuwandeln. Alles andere bekomme ich schon selbst hin. Ich habe wirklich viel recherchiert und nichts dazu gefunden. Vielleicht mache ich auch noch mal ein neues Thema auf. Hier aber noch mal ganz klar meine (einzige) Frage:

    Kennt jemand einen Befehl in Visual Basic, mit dem man viele als String gespeicherte Zahlen in Zahlen umwandeln kann?

    Als Beispiel ist oben die Excel Datei eingefügt.

    Grüße Simon
    Wenn ich dein Problem richtig verstehe, dann hast du eine txt-Datei, lädst die Datein in dein Programm ein, machst du irgendwelche Berechnungen und willst dann anschliessend das Ergebnis in eine Excel-Datei schreiben.

    Fürs erste würde ich an deiner Stelle epplus für das Schreiben ins Excel benutzen und nicht die üblichen Objekte. Das sorgt dann nochmal für Schnelligkeit.

    Dann würde ich die Daten aus der txt-Datei in ein datatable o. list of x einlesen. Beim Deklarieren der Struktur würde ich Wert darauf legen, dass ich für die Zahlwerte den richtigen Datentyp wähle.

    Wenn ich dann mit dem Einlesen und Berechnung fertig bin, dann würde ich die list of x o. die datatable mit Hilfe von epplus in eine Excel-Datei schreiben. Durch den richtig gewählten Datentyp für die Zahlen sollten die Zahlen in der Excel-Datei richtig erscheinen und du bräuchtest keine zus. Formattierung vorzunehmen.

    Wenn du mir die txt-Datei schickst und kurz beschreibst, was mit was berechnet werden muss, mache ich dir das. Ich habe jetzt nichts Besonderes zu tun.

    simonsns schrieb:

    Hab das nur oben von dir so kopiert
    Und ich wiederum hatte das aus deinem ersten Post blind übernommen, weil ich dachte, du hättest dir etwas dabei gedacht ;)

    Wenn du tatsächlich eine Textdatei lädst und du nicht mit epplus arbeiten willst, dann öffne die Datei über Workbooks.OpenText.
    Variiere dabei den Parameter Local.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --