Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 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

Anzeige

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.

Anzeige
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 …

Anzeige
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
;
Anzeige
Anzeige

Infobox / Tutorial

Beträge runden mit VBA in Excel


Schritt-für-Schritt-Anleitung

Um Beträge in Excel mit VBA zu runden, kannst du die folgenden Schritte befolgen:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Klicke im Menü auf Einfügen und dann auf Modul.

  3. Kopiere den folgenden VBA-Code in das Modul:

    Sub KommaWeg()
       ' Entfernt alle Nachkommastellen
       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
  4. Führe das Makro aus: Du kannst es über das Menü Ausführen oder durch eine Schaltfläche in deinem Arbeitsblatt auslösen.

  5. Überprüfe deine Daten: Alle Nachkommastellen sollten nun entfernt sein.


Häufige Fehler und Lösungen

  • Fehler: Das Makro läuft nicht oder hat keinen Effekt.

    • Lösung: Stelle sicher, dass das Makro im richtigen Modul eingefügt wurde und dass du es korrekt ausführst.
  • Fehler: Excel bleibt hängen oder das Makro braucht zu lange.

    • Lösung: Wenn du den Code in Worksheet_Change einfügst, stelle sicher, dass du Application.EnableEvents = False verwendest, um eine rekursive Ausführung zu verhindern.

Alternative Methoden

Neben VBA gibt es auch alternative Methoden, um Zahlen in Excel zu runden:

  1. Verwende die Excel-Funktion RUNDEN:

    =RUNDEN(A1; 0)

    Dies rundet den Wert in Zelle A1 auf die nächste ganze Zahl.

  2. Funktion RUNDEN.AUF oder RUNDEN.UNTEN:

    Diese Funktionen können ebenfalls verwendet werden, um auf eine bestimmte Anzahl von Dezimalstellen zu runden.


Praktische Beispiele

  1. Runden auf ganze Zahl:

    Debug.Print WorksheetFunction.Round(i, 0) ' Rundet 0,5 hoch oder 0.49 runter
  2. Runden auf zwei Nachkommastellen:

    r.Value = WorksheetFunction.Round(r.Value, 2)
  3. DIN 1333 Runden:

    Um nach DIN 1333 zu runden, kannst du eine benutzerdefinierte Funktion erstellen, um die Werte entsprechend zu runden.


Tipps für Profis

  • Verwende Application.EnableEvents = False am Anfang deines Codes, um ungewollte Wiederholungen zu vermeiden.
  • Experimentiere mit der Round- und RoundDown-Funktion in VBA, um unterschiedliche Rundungseffekte zu erzielen.
  • Denke daran, dass die Verwendung von WorksheetFunction.Round und VBA.Round unterschiedliche Rundungsverfahren anwendet (symmetrisches vs. asymmetrisches Runden).

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Round und RoundDown? Round rundet auf die nächste ganze Zahl, während RoundDown einfach die Nachkommastellen abschneidet.

2. Kann ich VBA verwenden, um auf eine bestimmte Anzahl von Dezimalstellen zu runden? Ja, du kannst die Funktion Round mit dem gewünschten Dezimalstellenwert verwenden, z.B. Round(x, 2) für zwei Dezimalstellen.

3. Wie kann ich die Rundung auf negative Zahlen anwenden? Die gleichen VBA-Funktionen funktionieren auch für negative Zahlen, wobei das Rundungsverhalten je nach Funktion variieren kann.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige