Übersetzung von Gleitkommazahlen
17.11.2013 12:40:21
Gleitkommazahlen
Ich habe ein Programm, das Daten aus einer csv-Datei ausließt und diese in einem Array speichert.
Die Daten einzelnen Arrayfelder haben Formate wie z.B. "-2.11708671e-011, 1.00000005e-003, 1.00000005e-003, 5.21755600e+000 und 1.19435613e-003"
VBA verwendet für diese Zahlen verschiedene Ausdrücke wie z.B. "-2.11708671e-011(ausgelesenes String) := -2.11708671E-11(VBA), oder 1.00000005e-003 := 0.00100000005"
Wenn ich in anderen Subs mit den Daten rechnen möchte, ergeben sich scheinbar völlig willkürliche Ergebnisse in Bezug auf die Nachkommastellen.
Ich dachte zunächst, das Problem mit einer eindeutigen Definition als Double beherschen zu können, jedoch vergebens. Ich vermute bei rechenoperationen wandelt VBA das string sowieso in ein Double.
Hat jemand eine einfache Lösung? Meine erste Idee war beim einscannen der Daten, die richtige Formatierung via Bedingungen "manuell" einzuführen. Also, eine Bewertung und einteilung der Strings je nach dem Ausdruck nach dem e bei z.B. "-2.11708671e-011".
Jedoch "weiß" VBA genau was ich meine, wenn ich die Werte direkt einer Variablen "a=-2.11708671e-011" zuweise und übersetzt nach Eingabe in "a=-2.11708671E-11". Wieso funktioniert das nicht wenn ich einer Variablen (Dim As Double) einer anderen mit dem String drin zuweise?
Wie kann ich eine Übersetzung "erzwingen"?
Hier mein Code:
Option Explicit
Public Array_SL() As Variant
Public objArr As Variant
Public maxrow As Variant
Sub Import_Streamlines_v2()
Dim arr
Dim objTS As Object
Dim objFS As Object
Dim objFile As Object
Dim Tmp As Variant
Dim Tmp_double As Double
Dim Dat_Ausgabe As Variant
Dim path_data As Variant
Dim path_i As String
Dim path_wb As String
Dim Str_String As String
Dim i, k, l, w As Integer
Dim intFile As Variant
ReDim Array_SL(anzStrlin - 1)
ReDim maxrow(anzStrlin - 1)
Set objArr = CreateObject("Scripting.dictionary")
Set objFS = CreateObject("Scripting.FilesystemObject")
path_wb = ThisWorkbook.Path
path_data = Dir("C:\Users\test*.csv")
'MsgBox path_wb
Do While path_data ""
i = i + 1
k = 1
For i = 1 To anzStrlin
path_i = path_wb & "\test_" & i & ".csv"
' MsgBox path_i
Set objFile = objFS.Getfile(path_i) 'Anpassen
Set objTS = objFile.OpenAsTextStream
Str_String = objTS.readall
arr = Split(Str_String, vbCrLf) 'Nach Datensätzen splitten
ReDim Dat_Ausgabe(UBound(arr), 4)
For l = 5 To UBound(arr)
Tmp = Split(arr(l), ",") 'Datensatz nach Werten splittenn
For w = 0 To UBound(Tmp)
Tmp(w) = Replace(Tmp(w), """", "")
Tmp_double = Tmp(w)
Dat_Ausgabe(l - 5, w) = Tmp_double 'Werte in Dat_Ausgabe
Next w
Next l
'Ausgeben
'In Tabelle
' Sheets("Input_Flutlinien").Cells(3, k).Resize(UBound(Dat_Ausgabe) + 1, UBound( _
Dat_Ausgabe, 2)) = Dat_Ausgabe
'Ausgabe in Dictionary
ReDim Preserve Array_SL(anzStrlin - 1)
ReDim Preserve maxrow(anzStrlin - 1)
maxrow(i - 1) = UBound(Dat_Ausgabe)
Array_SL(i - 1) = Dat_Ausgabe
k = k + 6
Next
path_data = Dir
Loop
End Sub
Ich freue mich um hilfreiche Antworten.VG Kapitän