Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1192to1196
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

durch .Value = .Value geht Genauigkeit verloren

durch .Value = .Value geht Genauigkeit verloren
Peter
Liebes Forum
mit dieser With Anweisung trage ich im Range rngESH eine Formel ein, die eine 21-stellige Zahl ergibt.
Weshalb bewirkt .Value = .Value, dass die Zahlen der letzten 6 Stellen in Nullen umgewandelt werden resp. wie kann ich die Formeln durch Werte ersetzen, ohne dass ich die exakte Zahl verliere?
Danke für eine Antwort und Gruss, Peter
With rngESH
.NumberFormat = "0"
.Formula = "=1&iAK_Nummer&TEXT(BuDatum,""JJJJMMTT"")&RIGHT(""0""&iTagesnummer,2)&RIGHT(""0000""&ROW(),4)"
.Calculate
.Value = .Value
End With
Rechengenauigkeit : 15 Stellen !
04.01.2011 14:30:09
NoNet
Hallo Peter,
das liegt daran, dass Excel (bekanntermassen !) nur eine Rechengenauigkeit von 15 Stellen hat !
Ergo werden bei 21 Dezimalstellen die letzten 6 Stellen "abgeschnitten" (bzw. gekürzt).
Versuche es alternativ mal mit .Value=.Text - vielleicht klappt die Anzeige (als Text) dann wunschgemäß !?!?
Gruß, NoNet
AW: Rechengenauigkeit : 15 Stellen !
04.01.2011 14:46:35
Peter
Hallo NoNet
Danke für die Antwort.
Mit .Value =.Text hat es nicht geklappt. Ich habe mir wie folgt beholfen:
...
.Copy
.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
...
Gruss, Peter
Anzeige
AW: Rechengenauigkeit : 15 Stellen !
04.01.2011 20:18:20
Daniel
Hi
um sicher zu gehen, daß dein Text auch ein Text bleibt und nicht in eine Zahl umgewandelt wird (Zahlen werden in Excel immer nur mit 15 Stellen genauigkeit gerechnet) solltest du den Text als solchen Kennzeichnen.
das macht man durch das voranstellen des Hochkommas '
With rngESH
.NumberFormat = "0"
.Formula = "=""'""&1&iAK_Nummer&TEXT(BuDatum,""JJJJMMTT"")&RIGHT(""0""& _
iTagesnummer,2)&RIGHT(""0000""&ROW(),4)"
.Calculate
.Value = .Value
End With

Gruß, Daniel
AW: Rechengenauigkeit : 15 Stellen !
05.01.2011 08:47:46
Peter
Hallo Daniel
Hab' den Beitrag erst jetzt gesehen. Das ist die beste Version, um zum Ziel zu kommen. Vielen Dank!
Gruss, Peter
Anzeige
Alternative ohne Formel und Value
05.01.2011 09:33:27
Erich
Hi zusammen,
mein Vorschlag: Auf Formula und Value verzichten, VBA rechnen lassen,
die Zellen mit "@" formatieren:

Sub test4()
Dim iAK_Nummer As Long, BuDatum As Date, iTagesnummer As Long
BuDatum = Date:   iAK_Nummer = 4711:   iTagesnummer = 2
Dim strT(1 To 27) As String, lngZ As Long
For lngZ = 1 To 27
strT(lngZ) = "1" & iAK_Nummer & Format(BuDatum, "YYYYMMDD") _
& Format(iTagesnummer, "00") & Format(lngZ, "0000")
Next lngZ
With Sheets("ABC").Range("D1:D27")
.NumberFormat = "@"
.Value = Application.Transpose(strT)
End With
End Sub
'.NumberFormat = "0" ' kann man getrost weglassen - es ist unnütz und wirklungslos.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Alternative ohne Formel und Value
05.01.2011 09:39:21
Peter
Hallo Erich
Danke für den Vorschlag.
Jetzt ist es allerdings so, dass in Wirklichkeit nicht 27 Zeilen abzufüllen sind, sondern gelegentlich Hunderte. Da nehme ich an, dass ich mit der aktuellen Lösung doch einen deutlichen Geschwindigkeitsvorteil habe.
Der Hinweis zu .NumberFormat = "0" ist natürlich richtig.
Freundlicher Gruss, Peter
Geschwindigkeitsvorteil? Ja, aber ...
05.01.2011 11:16:30
Erich
Hi Peter,
da ich das mit dem Geschwindigkeitsvorteil nicht geglaubt habe, half nur ein Test.
Es zeigte sich, dass man mit Formula/Value doppelt so viel Zeit braucht wie mit dem VBA-Array.
Hier die Testmappe: https://www.herber.de/bbs/user/72921.xls
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
korrigierte Mappe
05.01.2011 11:23:14
Erich
Hi Peter,
in Test4 war ncoh was faul - deshalb noch mal neu: https://www.herber.de/bbs/user/72922.xls
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: korrigierte Mappe
05.01.2011 11:51:06
Peter
Hallo Erich
Habe das Privileg, jetzt auf den Skis zu stehen (resp im Moment im Restaurant zu sitzen). Werde mir dein Test mit Interesse anschauen!
Gruß, Peter
AW: korrigierte Mappe
05.01.2011 22:52:38
Peter
Hallo Erich
Du hast den Beweis erbracht - vielen Dank, das ist sehr interessant.
Jetzt gibt es allerdings noch eine "Sachverhaltserweiterung". Ich habe bemerkt, dass ich nicht die Einträge nicht in jede einzelne Zelle der entsprechenden Spalte sondern jeweils in die erste Zeile jeder 3er Gruppe eintragen muss. Das heisst bei 27 anstelle in jede Zelle nur in die 1., 4., 7., 10., 13., 16., 19., 22. und 25. Zeile.
In der Formel kann ich das umsetzen, in dem ich den Rest der Division Zeile()/3 berechne. Ergibt dies 1, wird die Formel eingetragen, ergibt es 0 oder 2 wird die Formel nicht eingetragen.
Die Laufnummer muss auch fortlaufend sein und mit Formel habe ich sie wie folgt ermittelt:
(Zeile()+2/3) ergibt in Zeile 1: (1+2)/3 = 1, in Zeile 4 (wo der nächste Eintrag steht): (4+2)/3 = 2. Kann ich das auch in ein Array schreiben?
Wenn die Frage zuweit geht, können wir's auch bleiben lassen. Doch ich finde das technisch hoch interessant.
Ich habe noch eine andere Frage zum Formeleintrag: Dort übergebe ich einen String mittels TEXT(BuDatum,""JJJJMMTT"") - Wenn ich es richtig sehe, funktioniert das nur in der deutschen Sprache. Könnte das Textformat auch in einer Weise übergeben werden, dass dies sprach-unabhängig ist?
Vielen Dank für deine sehr geschätzten Antworten!
Gruss, Peter
'Code für den Formeleintrag:
.Formula = "=IF(MOD(ROW(),3)=1,""'""&1&iAK_Nummer&TEXT(BuDatum,""JJJJMMTT"")&RIGHT(""0""& iTagesnummer,2)&RIGHT(""0000""&(ROW()+2)/3,4),"""")"
'entspricht Formel (deutsch):
=WENN(REST(ZEILE();3)=1;"'"&1&iAK_Nummer&TEXT(BuDatum;"JJJJMMTT")&RECHTS("0"& iTagesnummer;2) &RECHTS("0000"&(ZEILE()+2)/3;4);"")
Anzeige
alle 3 Zeilen und international
06.01.2011 10:05:54
Erich
Hi Peter,
es gibt vermutlich Möglichkeiten, das Datumsformat international festzulegen,
damit kenne ich mich aber nicht aus. Kannst ja mal nach Format international googeln.
Aber Du kannst das hier auch leicht umgehen, in dem du Jahr, Monat und Tag einzeln ausgibst:
.Formula = "=""'""&1&iAK_Nummer&TEXT(YEAR(BuDatum),""0000"")" & _
"&TEXT(MONTH(BuDatum),""00"")&TEXT(DAY(BuDatum),""00"")" & _
"&RIGHT(""0""&iTagesnummer,2)&RIGHT(""0000""&ROW(),4)"
Einfacher ist das beim Array in VBA:

Sub test5()
Dim strTbeg As String, strT(1 To 9999) As String, lngZ As Long
Dim rngESH As Range
Set rngESH = Sheets("ABC").Range("E1:E9999")
strTbeg = "1" & [iAK_Nummer] & Format([BuDatum], "YYYYMMDD") & _
Format([iTagesnummer], "00")
For lngZ = 1 To UBound(strT) Step 3
strT(lngZ) = strTbeg & Format((lngZ + 2) / 3, "0000")
Next lngZ
With rngESH
.NumberFormat = "@"
.Value = Application.Transpose(strT)
End With
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: alle 3 Zeilen und international
06.01.2011 15:03:11
Peter
Hallo Erich
Das ist genial! Vielen Dank.
Gruss, Peter

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige