EXCEL Makro. 3 Dezimalstellen bei Kommazahlen, andere ignorieren

Ich habe die Datei nochmal auf- und zugemacht..... es hat funktioniert******!

Tombe... du hast es drauf******!!

Ich Danke dir 1000-fach für Deine tolle unterstützung****** Finde ich super dass sich Leute wie Du anderen zur Verfügung stellen die Hilfe brauchen!

Nochmals vielen Dank..... ich empfehle Dich und diese Seite auf jeden Fall weiter!
 
Freut mich wenn es geklappt hat.

Ansonsten hätte ich dir meine eMail Adresse per PN geschickt, dann hätten wir es so gemacht.
 
Bevor ich das Thema nun schließe ist mir gerade aufgefallen dass es die Werte wunderbar ändert bis eine leere Spalte kommt.

Kannst Du mir bitte noch ganz kurz einen Tipp geben wie ich es schaffe das ganze Sheet abzuändern und nicht nur Spalte B und C (A ist Text)?
Spalte D ist leer und dann kommt wieder E mit Text F & G mit Zahlen, dann wieder leer usw.
Datenbereich insgesamt A1 bis W57 .
 
Dazu musst du die zwei Zeilen in denen die letzte Zeile bzw. die letzte Spalte ermittelt wird so ändern:

Visual Basic:
'letzte Zeile in Spalte A suchen
zeilen% = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
 
'letzte Spalte in Zeile 1 suchen
spalten% = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column

Jetzt ist es egal ob es irgendwo dazwischen leere Zellen gibt.
 
Schönen guten Morgen Tobe,

Vielen Dank für die Antwort, funktioniert mal wieder super!

Folgende Frage ist nun wirklich die letzte mit der ich Dich zu diesem Thema belästige: :)

Gibt es die Möglichkeit das Makro über mehrere Reiter/Register laufen zu lassen damit ich nicht alle 15 Stück anklicken und das Makro ausführen muss?

@Drogist: Danke für Deine PN! Habe drauf genatwortet.

Beste Grüße aus Baden-Württemberg
 
Sorry bin ein bisschen spät dran heute, dafür habe ich eine Lösung für dich.

Neu ist hier nur das die Anzahl der vorhandenen Tabellen ermittelt werden und eine weitere For/Next-Schleife die dann eben nacheinander alle Tabellen durchläuft.

Visual Basic:
Sub zahl_format()
'Bildschirmanzeige ausschalten
Application.ScreenUpdating = False
 
'zuerst die Anzahl der Tabellen ermitteln ** NEUE ZEILE **
tabellen% = ActiveWorkbook.Sheets.Count

'alle Tabellen durchlaufen ** NEUE FOR/NEXT-SCHLEIFE **
For t% = 1 To tabellen%
    ActiveWorkbook.Sheets(t%).Activate
    'letzte Zeile in Spalte A suchen
    zeilen% = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
 
    'letzte Spalte in Zeile 1 suchen
    spalten% = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column

    'alle Spalten durchlaufen
    For s% = 1 To spalten%
 
        'alle Zeilen durchlaufen
        For z% = 1 To zeilen%
        'wenn Komma in der Zelle vorkommt
            If InStr(1, ActiveSheet.Cells(z%, s%), ",") Then
                'Teil links inklusive Komma
                links$ = Left(ActiveSheet.Cells(z%, s%), InStr(1, ActiveSheet.Cells(z%, s%), ","))
                'Teil rechts vom Komma
                rechts$ = Mid(ActiveSheet.Cells(z%, s%), InStr(1, ActiveSheet.Cells(z%, s%), ",") + 1, Len(ActiveSheet.Cells(z%, s%)))
                'Wert formatieren und in Zelle eintragen
                ActiveSheet.Cells(z%, s%) = links$ & rechts$ & String(3 - Len(rechts$), "0")
            End If
        Next z%
 
    Next s%
 
Next t%
'Bildschirmanzeige wieder einschalten
Application.ScreenUpdating = True
End Sub

Es grüßt ebenfalls aus BaWü

Thomas
 
Vielen Dank schonmal, Thomas.

Leider kommt eine Fehlermeldung, mit dem Verweis auf:

ActiveSheet.Cells(Z%, s%) = Links$ & rechts$ & String(3 - Len(rechts$), "0")

"Laufzeitfehler '5': Ungültiger Prozeduraufruf oder ungültiges Argument"

Kann es sein dass es wegen dem ersten Tabellenblatt ist? Da hab ich insgesamt 81 Seiten mit Diagrammen, Tabellen und Bildern (Daten kommen aus dem zweiten Tabellenblatt 'Übersicht'. Die Daten für die Übersicht (Tabellenblatt 2) werden aus den weiteren 15 Länder-Tabellenblättern gezogen, die wiederrum aus SiteCatalyst kommen. :)

Im Grund genommen könnten die ersten beiden Tabellenblätter ignoriert werden.

Schöne Grüße
Daniel
 
Der Fehler wird wohl immer dann ausgelöst wenn eine Zahl mehr als 3 Stellen nach dem Komma hat, was ja eigentlich nicht sein dürfte.

Für diesen Fall (oder wenn sonst ein Fehler auftritt) habe ich den Code nochmals geändert. Tritt ein Fehler auf, wird am Ende eine Meldung angezeigt und der Name der Tabelle sowie die Zeile und die Spalte ausgegeben.

Die Schleife ist jetzt auch gleich so geändert das erst in Tabelle 3 begonnen wird.

Visual Basic:
Sub zahl_format()
Dim blatt()
Max% = 0
fehler% = 0

On Error GoTo format_fehler
'Bildschirmanzeige ausschalten
Application.ScreenUpdating = False
 
'zuerst die Anzahl der Tabellen ermitteln ** NEUE ZEILE **
tabellen% = ActiveWorkbook.Sheets.Count
 
'alle Tabellen durchlaufen ** NEUE FOR/NEXT-SCHLEIFE **
For t% = 3 To tabellen%
    ActiveWorkbook.Sheets(t%).Activate
    'letzte Zeile in Spalte A suchen
    zeilen% = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
 
    'letzte Spalte in Zeile 1 suchen
    spalten% = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
 
    'alle Spalten durchlaufen
    For s% = 1 To spalten%
 
        'alle Zeilen durchlaufen
        For z% = 1 To zeilen%
        'wenn Komma in der Zelle vorkommt
            If InStr(1, ActiveSheet.Cells(z%, s%), ",") Then
                'Teil links inklusive Komma
                links$ = Left(ActiveSheet.Cells(z%, s%), InStr(1, ActiveSheet.Cells(z%, s%), ","))
                'Teil rechts vom Komma
                rechts$ = Mid(ActiveSheet.Cells(z%, s%), InStr(1, ActiveSheet.Cells(z%, s%), ",") + 1, Len(ActiveSheet.Cells(z%, s%)))
                'Wert formatieren und in Zelle eintragen
                ActiveSheet.Cells(z%, s%) = links$ & rechts$ & String(3 - Len(rechts$), "0")
            End If
        Next z%
 
    Next s%
 
Next t%
'Bildschirmanzeige wieder einschalten
Application.ScreenUpdating = True

If fehler% > 0 Then
    fehlertext$ = "Es traten insgesamt " & fehler% & " Fehler auf." & Chr$(13) & Chr$(13)
    For a% = 0 To UBound(blatt)
        fehlertext$ = fehlertext$ & blatt(a%) & Chr$(13)
    Next a%
    MsgBox fehlertext$
End If

Exit Sub
format_fehler:
fehler% = fehler% + 1
ReDim Preserve blatt(Max%)
blatt(Max%) = ActiveSheet.Name & " (Zeile " & z% & " - Spalte " & s% & ")"
Max% = Max% + 1
Resume Next
End Sub
 
Zurück