Import vom englischen Zahlenformat

Hallo !
Der Import von Zahlen lässt sich mit (Copy&)Paste gut bewerkstelligen, auch ist beim Textimport das Gebietschema auswählbar. Ich kopiere oft Daten aus englischsprachigen Webseiten und nutze dafür das Gebietsschema “Englisch (Großbritannien oder USA)”. Leider gibt es da bei einem Zahlentyp ein Problem:
14,082.21 wird 14082,21 korrekt!
1,429.03 wird 1429,03 korrekt!
104,768 wird 104768 korrekt!
8,110 wird 8110 korrekt!
aber:
22,9 bleibt 22,9.
5,7305 bleibt 5,7305
Und das ist falsch - eigentlich sollte es ja 22900 werden (also das Tausendfache). Wenn also die Anzahl der Nachkommastellen <> 3 ist erfolgt keine Umwandlung. Wie bekomme ich das hin, daß ich nicht die ganze Tabelle abfahren muss um alle diese nicht umgewandelten Zahlen manuell zu ändern (etwa durch Multiplikation mit 1000).
Die interne Funktion ZAHLWERT (=ZAHLWERT(J5;.;,)) (in Excel gibt es ja seit 2013 die Funktion ZAHLENWERT) bringt hier auch nur einen Fehler (508). Es kann meiner Meinung nach nur mit einem Makro zu realisieren sein, das etwa so arbeitet:

  1. wenn Zahl nur 1 Komma enthält und <1000 dann mit 1000 multiplizieren
  2. ansonsten (also >1000)
  3. das Komma löschen und Punkt in Komma umwandeln
    Ich bin in Base ziemlich unbedarft und danke für jede Hilfe.
    Freundliche Grüße
    Micha:

Das scheint mir auch nur logisch. Das Komma ist zwar im englischsprachigen Raum der Tausendertrenner, aber dann gehören auch die Hunderter, Zehner und Einer dazu und nach den Einern dann der Dezimaltrenner. Wenn Du jetzt mit bereits eingelesenen Zahlen und einem Makro anfängst dann läufst Du doch Gefahr, dass die korrekt eingelesenen Werte munter mit angepasst werden.
Wenn ich das mit einer csv-Datei mache, dann werden die fehlerhaften Importe allerdings als Text eingelesen (beginnend mit einem ', also z.B. '22,9).
Zur Funktion “Zahlwert”: =ZAHLWERT(A4;".";",") liest aus der Zelle A4 den Wert aus und macht dazu einen Zahlwert. Ignoriert aber, dass da schlicht Stellen fehlen oder zu viel sind.
Ich habe einmal ein bisschen probiert. Kenne mich mit Calc-Makros sonst nicht so gut aus:

SUB ZahlenFormatE
	DIM arValue()
	oDoc = thisComponent
	oSheet = oDoc.Sheets(0)
	FOR i = 1 TO 10
		oCell = oSheet.getCellByPosition(0,i)
		doValue = oCell.getValue()
 		IF oCell.getType() = 2 THEN
 			stValue = oCell.getString() & "0000"
 			arValue() = Split(stValue,",")
 			stValue = arValue(0) & "," & Left(arValue(1),3) & "." & Right(arValue(1), Len(arValue(1))-3)
 			doValue = Val(stValue)
 		END IF
 		oCellTarget = oSheet.getCellByPosition(1,i)
 		oCellTarget.SetValue(doValue)
 	NEXT i
END SUB

Für Arrays muss zum Anfang eine Variable deklariert werden.
Stehen in den Zellen A2 bis A11 irgendwelche Zahlen oder Texte mit einem Komma, dann schreibt das Makro die dazu passenden Werte in die Zellen B2 bis B11. Um das ganze laufen zu lassen schreibe ich hinter die Texte einfach genügend Nullen, so dass ein Dezimaltrenner immer dabei ist.
Vermutlich wird das irgendwo auch Fehler produzieren - spätestens bei Zahlen im Millionenbereich. Da musst Du dann über die Größe des Arrays weiter kommen, so dass nur das letzte Element des Arrays aufgeteilt und mit einem Dezimalpunkt versehen wird.

Danke ersteinmal für Deine Mühe. Es scheint nicht wie gewünscht zu laufen. Werde es ersteinmal ein bisschen testen, melde mich morgen wieder. Danke und Gute Nacht!

Hallo Robert,
ja das Makro funzt, solange die “abgekürzten Zahlen” als Text erkannt werden. Habe auf

FOR i = 0 to 10

umgestellt, da sonst der erste Wert nicht berücksichtigt wird.

Man könnte ja das Makro ja so abwandeln, das nur die markierten Werte (Spalte) gewandelt werden, also kein for i= 0 To … Oder aber das Programm findet de letzte Zelle und arbeitet for i=0 to LastUsedCell.
Man muss höllisch aufpassen, wenn schon werte in Spalte B stehen, wäre es nicht besser, die gewandelten Werte gleich innerhalb der Spalte A zu ersetzen (also

oCellTarget = oSheet.getCellByPosition(0,i) ’ Spalte 1

Das sind nur einige Vorschläge, wie man das Ganze etwas sicherer machen KÖNNTE. Danke trotzdem für Deine Mühe.

Versuch mal schlicht:

=WENN(ISTTEXT(A1);TEXT(A1;"0,0000000")*1000;A1)

ab B1 nach unten kopieren

Hallo karolus, Danke - das funzt prima mit dem Herunterkopieren und dem Umwandeln vom Text ins Zahlenformat. Aber wie kann ich mir so eine Formel merken. Kann man die irgendwie in ein Makro einbauen, so daß man diese abspeichern und immer weider aufrufen kann ?

Schreib die Formel auf ne gelbe Haftnotiz und klebe sie unter die Tastatur gleich neben den Zettel mit dem Passwort :wink:

Wo gibt es denn die gelben Haftnotizen, ich habe nur “PostIt” :smiley:

Hab ich vergessen ⇒ ( ! das nächste mal aufschreiben !) ⇒ kleb

hm,
ich hab so gelöst:

sub Formeleinfuegen
rem *Einfügen einer Formel an der gewünschten Stelle*
rem *Sollte immer in der ersten Zeile plaziert werden*
dim document as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame ' aktives Blatt
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "StringName"
args1(0).Value = "=WENN(ISTTEXT(A1);TEXT(A1;""0,0000000"")*1000;A1)"
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args1())
end sub

Jetzt muss ich nur noch meine Symbolleiste Makros anpassen…

oha … Kanonen auf Spatzen … wenn es denn sein MUSS?!

sub Formeleinfuegen
   with ThisComponent.CurrentSelection
      .Formula = "=IF(ISTEXT(A1);TEXT(A1;""0,0000000"")*1000;A1)"
   end with
end sub


Ja, das ist wirklich die sauberste Lösung und ich danke zum Absch(l)uss.
Micha