Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1320to1324
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

Beträge runden - VBA

Beträge runden - VBA
11.07.2013 14:10:22
Uwe
Hallo,
ich habe eine umfangreiche Liste mit vielen Zahlen. Die Zahlen werden ohne Kommastellen angezeigt, obgleich Nachkommastellen existieren.
Ich möchte nun sämtliche Zahlen ohne Nachkommastellen. Gibt es einen VBA-Befehl, der aus sämtlichen Zahlen mit Nachkommastellen Zahlen ohne Nachkommastellen macht?
LG
Uwe

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Beträge runden - VBA
11.07.2013 14:14:15
Klaus

Sub test()
Dim i As Double
i = 3.1415
Debug.Print VBA.Round(i, 0)                   'rundet 0,5 hoch oder 0.49 runter
Debug.Print WorksheetFunction.RoundDown(i, 0) 'schneidet Komma ab
End Sub

Grüße,
Klaus M.vdT.

AW: Beträge runden - VBA
11.07.2013 14:24:53
Uwe
Hallo Klaus,
aus welchem Grund auch immer, funktioniert es bei mir noch nicht.
Ich habe dein VBA-Befehl in ein "Modul" eingefügt und mit einer Schaltfläche auf der zu formatierenden Seite verknüpft. Es passiert aber nichts. Muss ich noch etwas anderes Berücksichtigen?
Gibt es auch eine Möglichkeit, dass man den Befehl direkt ins Tabellenblatt einpflegt, so dass der Befehl, sobald man in eine Zelle klickt bzw. das Tabellenblatt wechselt, ausgeführt wird?
LG
Uwe

Anzeige
AW: Beträge runden - VBA
11.07.2013 14:31:24
Klaus
Hallo Uwe,
mein Script schreibt die Zahl "3" zweimal ins Direktfenster. Ich dachte, du willst nur wissen wie man rundet. Wenn du alle Kommas aus dem aktiven Blatt per Button entfernen willst, dann etwa so:
Sub KommaWeg()
'entfernt alle Nachkommastellen
'ignoriert Zellen mit Formel, mit Text und leere Zellen
Dim r As Range
For Each r In ActiveSheet.UsedRange
If Not r.HasFormula And Not r.Value = "" And IsNumeric(r.Value) Then
r.Value = WorksheetFunction.RoundDown(r.Value, 0)
End If
Next r
End Sub
Grüße,
Klaus M.vdT.

AW: Beträge runden - VBA
11.07.2013 14:50:42
Uwe
Hallo Klaus,
vielen Dank. Über die Schaltfläche funktioniert es. Vielen Dank hierzu.
Ich habe versucht den Befehl direkt als Code in das Tabellenblatt einzufügen. Er braucht entweder unendlich lange (ich habe den Befehl vorzeitig abgebrochen) oder es funktioniert nicht. Beim Abbruch bleibt der Code bei "end if" stehen. Weißt du zufälliger Weise hierzu auch einen Rat?

private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
For Each r In ActiveSheet.UsedRange
If Not r.HasFormula And Not r.Value = "" And IsNumeric(r.Value) Then
r.Value = WorksheetFunction.RoundDown(r.Value, 0)
End If
Next r
End Sub

LG Uwe

Anzeige
AW: Beträge runden - VBA
11.07.2013 15:12:06
Klaus
Hallo Uwe,
ich habe den Code in einer Tabelle mit 10x10 Einträgen getestet (ein paar Kommazahlen, ein paar Formeln, ein paar Texte). Da lief der innerhalb einer tausendstel Sekunde oder so durch.
Wenn du den Code ins Worksheet_Change setzt (da gehört er NICHT hin!) passiert folgendes:
Der Code läuft, bis er die erste Zahl findet. Er ändert diese.
-Worksheet Change zieht den Code erneut an
--Der Code läuft, bis er die erste (jetzt: zweite) Zahl findet. Er ändert diese.
--Worksheet Change zieht den Code erneut an
--- Der Code läuft, bis [...] und so weiter.
Der Code läuft also X-mal alle Zellen durch. X ist die Anzahl der Zahlen insgesamt...
Was du machen KÖNNTEST, aber davon rate ich ab:
schreibe an den Anfang des Codes application.Enableevents = false und an den Ende des Codes application.Enableevents = True.
Damit verhinderst du, dass der Code sich selber immer wieder aufruft.
Besser:
überlege dir, bei welchem Event du den Code WIRKLICH auslösen musst. Bei JEDEM Worksheet_Change ALLE Zellen durchzugehen ist sicherlich nicht notwendig! Alternative: Lass den COde EINMAL laufen, und dann schreibe dir ein Worksheet-Change, dass jeweils die veränderten ZEllen anfasst und nicht ALLE. Das könnte dann so aussehen:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
Application.EnableEvents = False
For Each r In Target 'falls mehr als eine Zelle gleichzeitig selektiert ist
r.Value = WorksheetFunction.RoundDown(r.Value, 0)
Next r
Application.EnableEvents = True
End Sub
Grüße,
Klaus M.vdT.

Anzeige
AW: Beträge runden - VBA
11.07.2013 15:24:56
Uwe
Hallo Klaus,
vielen Dank für deine Tipps.
Ich werde es mit dem urspr. VBA durchführen.
LG
Uwe

Danke für die Rückmeldung! owT.
11.07.2013 15:37:51
Klaus
.

Man, welch' Diskussion, ...
11.07.2013 16:11:34
Luc:-?
…Leute…! ;-)
Hatte ich nicht neulich erst darauf hingewiesen, dass die vbFkt Round nicht mit WorksheetFunction.Round gleichgesetzt wdn kann?! Ich hatte das vor Jahren auch mal getan, worauf man mir mitteilte, dass ich auf diesen Umstand hinweisen müsste. Die vbFkt rundet symmetrisch (wiss-techn/„Banker's Rounding“), die xlFkt asymmetrisch (kaufmännisch)*. Das ist bei der x ten Kommastelle sicher kein Problem, aber hier wird auf ganze Zahlen gerundet! Da kann aus glatten 2,5 schon mal 2 statt 3 wdn. Außerdem (nur der Vollständigkeit halber, weil das hier ja nicht benötigt wird) akzeptiert die vbFkt keine Werte <0 im 2.Argument.
Nebenbei, was ist mit Ergebnissen von Fmln? Glaube, die hast du ausgeschlossen, Klaus.
Je nachdem, was bezweckt wird und wie die Datenstruktur ist, kann es zwar sinnvoll sein, FmlErgebnisse zu runden, aber sicher eher nicht die Ausgangswerte (zumindest auf ganze Zahlen; idR unabhängig davon, ob es sich um Primär- oder Berechnungsdaten handelt)! Die permanente Rundung von Ergebnisdaten sollte auch nur dem Zweck dienen, allen Nachnutzern die gleiche Ausgangsbasis für weitergehende Berechnungen zu bieten, um Ergebnisabweichungen möglichst zu verhindern. Dabei kann die Genauigkeit einer berechneten Zahl nur einer Dezimalstelle weniger als sie die gerundete Zahl aus der Gesamtheit der einbezogenen Daten mit den wenigsten Dezimalstellen hat entsprechen.
Ergo sollte man sich idR auf die Rundung der Berechnungsergebnisse beschränken und da kann man das gleich in der Fml tun. Enthalten die Primärdaten aber unnötig viele Dezimalstellen (zB bei Messergebnissen), kann man das so machen wie hier vorgeschlagen. Dadurch wdn allerdings die Originaldaten überschrieben! Vor Jahren hatte ich deshalb eine Subroutine geschrieben, die die Originaldaten in eine Rundungsformel einbettet. Das könnte dann bei Bedarf auch eine symmetrische Rundung sein, denn dafür habe ich eine UDF, die sich sogar im Archiv befinden dürfte (RoundA, A wie alternativ!). Auf diese Weise gehen die Originale nicht verloren (damals waren meteorologische Messdaten der Anlass) und können bei Bedarf wiederhergestellt wdn.
* Dazu steht (viell endlich auch stand?) leider 'ne Menge Unsinn auf der sonst verdienstvollen Site von Luthardt-Chemie!
Gruß Luc :-?

Anzeige
Nachtrag: Deshalb heißt eine alternativ ...
11.07.2013 17:08:42
Luc:-?
…verwendbare xlEinstellung ja auch Genauigkeit wie angezeigt, nur sollte man vor ihrer Wahl ebenfalls das oben Angeführte berücksichtigen!
Luc :-?
Besser informiert mit …

2.Nachtrag, falls jemand auf die Site von ...
13.07.2013 01:34:45
...
…Dr Luthardt (Luthardt/Chemie&IT) stößt.
Dr Luthardt hat den Fehler begangen, die von ihm verlinkte Seite der MS-Knowledge-Base zu den Rundungsverfahren in MS-Produkten wie ein Dolmetscher, nicht wie ein dt Mathematiker übersetzt zu haben. Die von MS gebrauchten Begriffe stimmen nicht mit den im dt Sprachgebrauch üblichen überein!
So entspricht das arithmetic rounding dem dt Kaufmännischen bzw asymmetrischen Runden, das per DIN 1333 genau geregelt ist: <…5 wird ab-, ≥…5 wird aufgerundet. Die MS-Unterscheidung zwischen symmetric und asymmetric arithmetic rounding, die sich nur auf die unterschiedl Art, negative Zahlen zu runden, bezieht, ist hierbei gegenstandslos, da die DIN vorschreibt, negative Zahlen nach ihrem Absolutwert zu runden. Demzufolge ist das ein weiterer Punkt, der bei Verwendung von MS-Rundungsfktt beachtet wdn muss, denn dem entspräche das Runden weg von 0 oder asymmetric arithmetic rounding.
Das, was MS unter Banker's rounding (auch round to even) versteht, heißt bei uns mathematisches (auch wiss-techn) oder symmetrisches Runden (vgl den entsprd Artikel im dt Wikipedia).
Außerdem gibt's noch weitere Rundungsverfahren, die auch auf der MS-Site nebst Bspp für UDFs, mit denen diese per xl- bzw vbFktt umgesetzt wdn können, angeführt wdn.
Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige