Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1808to1812
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

Makroanpassung (signifikante Stellen)

Makroanpassung (signifikante Stellen)
05.02.2021 11:14:47
Anne
Hallo,
ich habe das folgende Makro. Könnte mir jemand sagen, wie und wo es as anpassen muss, dass es auch große Zahlen, wie 3921 auf drei signifikante Stellen rundet, sprich 3921? Oder 3925 auf 3930.
Sub test()
Worksheets("Konzentrationsberechnung").Unprotect Password:="ICP"
Dim Cells As Range
soll = 3 'die soll-Anzahl der signifikanten stellen
anzZeil = Selection.Cells.Count 'Zellenanzahl ermitteln
For Each Cells In Range("H10:I53,K10:L53,N10:O53").SpecialCells(xlCellTypeFormulas,  _
xlNumbers) 'Schleifenstart von zelle 1 bis letzte Zelle
tmp = Cells 'einlesen neuer Zelle
If tmp 1 dann trenne die Zahl bei , und _
sag mir wie lang sie ist
'bei Amerikanischer einstellung muss hier das , duch einen . ersetzt werden
'aus 152,5648 mach er hier 152 = 3 Stellen vor dem ,
End If
If anzNach  ?0.000
End If
Next Cells
Worksheets("Konzentrationsberechnung").Protect Password:="ICP"
End Sub

Vielen Dank
Anne

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Runden(Zahl; -1)
05.02.2021 11:26:16
Fennek
Hallo,
im Arbeitsblatt geht:
A1: 1234
A2; =runden(A1;-2)
Ergbnis: 1200
mfg
AW: Runden(Zahl; -1)
05.02.2021 11:52:46
Anne
Hi,
wie setzte ich das in dem vorliegenden Makro um?
Gruß
Anne
AW: VBA
05.02.2021 12:07:26
Fennek
Der gezeigte Code ist "zu komplex", d.h. es lauert zu lange ihn zu lesen.
Hier die Variante in VBA:

Sub Main
n = 1234
cells(1,1) = application.round(n, -1)
End Sub

AW: Makroanpassung (signifikante Stellen)
05.02.2021 12:18:30
Daniel
Hi
willst du tatsächlich runden?
das kannst du nicht per Makro machen, weil du hier Formeln bearbeitest.
für echtes Runden müsstest du das in die Formeln einbauen oder das Makro müsste Formeln durch Werte ersetzten.
oder willst du das Zahlenformat jeder Zelle so anpassen, dass immer nur die ersten drei Stellen angezeigt werden und der Rest nicht mehr (NK-Stellen) bzw als 0 (VK-Stellen)
eine Beispieldatei mit deinen Daten, welche die Ausgangslage vor dem Makrostart und dein von Hand erstelltes Wunschergebnis für diese Daten enthält, wäre hilfreich.
btw. ersetze bitte CELLS durch einen anderen Variablennamen.
CELLS ist in vorbelegter VBA-Begriff.
Selbst wenn es funtkioniert, so verwirrt es den VBA-kundigen Leser (also die Personen, die dir helfen sollen), weil sie mit CELLS zunächst einmal nicht deine Variable assoziieren, sondern die eigentliche VBA-Funktion.
Bitte ändern, wenn du möchstest, dass sich andere Menschen deinen Code anschauen.
Gruß Daniel
Anzeige
AW: Ich sehe zwei mögliche Ansätze
06.02.2021 13:06:16
Sulprobil
Siehe anliegende Datei (ohne jede Gewähr, aber ich verwende einen aktuellen Virenscanner) und folgender Code:
Option Explicit
Const CSignifikant As Long = 3
Sub test()
Dim v As Variant
Dim ws As Worksheet
'Formatiere alle Zellen mit Formeln im wissenschaftlichen Format auf CSignifikant signifikante  _
Stellen
Set ws = ThisWorkbook.Worksheets("Konzentrationsberechnung")
ws.Unprotect Password:="ICP"
For Each v In ws.Range("H10:I53,K10:L53,N10:O53").SpecialCells(xlCellTypeFormulas, xlNumbers)
v.NumberFormat = "." & String(CSignifikant, "0") & "E+0"
Next v
ws.Protect Password:="ICP"
End Sub
Sub test2()
Dim v As Variant
Dim ws As Worksheet, wsPrint As Worksheet
'Kopiere Sheet "Konzentrationsberechnung" und überschreibe dann alle Zellen mit Formeln mit  _
konstanten
'Werten die auf CSignifikant signifikante Stellen gerundet sind.
Application.DisplayAlerts = False
On Error Resume Next
ThisWorkbook.Worksheets("Konzentrationsberechnung_Print").Delete
On Error GoTo 0
Application.DisplayAlerts = True
Set ws = ThisWorkbook.Worksheets("Konzentrationsberechnung")
ws.Unprotect Password:="ICP"
ws.Copy After:=ThisWorkbook.Sheets(Sheets.Count)
Set wsPrint = ThisWorkbook.Sheets(Sheets.Count)
For Each v In wsPrint.Range("H10:I53,K10:L53,N10:O53").SpecialCells(xlCellTypeFormulas,  _
xlNumbers)
v.Formula = sbNSig(v.Value, CSignifikant)
v.NumberFormat = "General"
Next v
wsPrint.Name = "Konzentrationsberechnung_Print"
ws.Protect Password:="ICP"
wsPrint.Protect Password:="ICP"
End Sub
Function sbNSig(d As Double, n As Long) As Double
'Returns double with n most significant digits of d.
'09-Nov-2019 by www.sulprobil.com PB V1.00
sbNSig = Format(d, "." & String(n, "0") & "E+0")
End Function
https://www.herber.de/bbs/user/143664.xlsm
Anzeige
AW: Ich sehe zwei mögliche Ansätze
06.02.2021 17:04:08
Anne
Hallo,
ich habe das Marko wie folget angepasst, es wird auch einmal richtig ausgeführt. Beim zweiten Mal erscheint der Fehler '1004' und die folgende Zeile wird markiert:
For Each v In Range("H16:I59,K16:L59,N16:O59").SpecialCells(xlCellTypeFormulas, xlNumbers) 'Schleifenstart von zelle 1 bis letzte Zelle
Gesamtes Makro:
Sub test()
Worksheets("Konzentrationsberechnung").Unprotect Password:="ICP"
Dim v As Range
soll = 3 'die soll-Anzahl der signifikanten stellen
anzZeil = Selection.Cells.Count 'Zellenanzahl ermitteln
For Each v In Range("H16:I59,K16:L59,N16:O59").SpecialCells(xlCellTypeFormulas, xlNumbers) ' _
_
Schleifenstart von zelle 1 bis letzte Zelle
tmp = v 'einlesen neuer Zelle
If tmp 1 dann trenne die Zahl bei , und _
sag mir wie lang sie ist
'bei Amerikanischer einstellung muss hier das , duch einen . ersetzt werden
'aus 152,5648 mach er hier 152 = 3 Stellen vor dem ,
End If
If anzNach  ?0.000
End If
If anzNach > 1000 Then
Else
Const CSignifikant As Long = 3
v.Formula = sbNSig(v.Value, CSignifikant)
End If
Next v
Worksheets("Konzentrationsberechnung").Protect Password:="ICP"
End Sub

Function sbNSig(d As Double, n As Long) As Double
'Returns double with n most significant digits of d.
'09-Nov-2019 by www.sulprobil.com PB V1.00
sbNSig = Format(d, "." & String(n, "0") & "E+0")
End Function
Wo liegt der Fehler, dass das Makro nicht ein weiters Mal durchgeführt wird?
Gruß
Anne
Anzeige
AW: Du brauchst jemanden der programmieren kann
06.02.2021 17:54:56
Sulprobil
Sorry, aber so wird das nichts.
Ist Dir bewusst, dass Du bei größeren Zahlen die Formeln mit Werten überschreibst?
Dass Du die Anzahl beabsichtigter signifikanter Stellen zweimal im Code angibst obwohl eine Konstante am Anfang des Programms richtig wäre?
Du musst Deine Range vollqualifizieren mit einer Worksheetbezeichnung vorweg.
Aber: Du solltest nicht ohne kompetente Hilfe an Deinem Code weiter"murksen". Ich meine dies wirklich nicht böse.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige