Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VBA Script für signifikante Stellen

447 views
Skip to first unread message

Thomas Bahls

unread,
Apr 11, 2008, 7:07:25 AM4/11/08
to
Hallo,

ich habe gerade ein sehr spezielles Problem und bin mir gar nicht ganz
sicher, ob ich hier in der richtigen NG bin.


Ich möchte in einer Excel Tabelle (Excel 2003) in einem markierten Bereich
die "signifikanten Stellen" auf 3 anpassen per Script.


Also zb:
33322 hat 0 sig. Stellen und bleibt
3.22 hat 3 sig Stellen und bleibt
0.0022332 hat 5 sig. Stellen und wird gekürzt auf 3 sig Stellen zu 0.00223
2.322323 hat 7 sig. Stellen und wird gekürzt auf 2.32 Stellen
2.3 hat 2 sig Stellen und muss im Format aus zwei Nachkommastellen
erweitert werden, so dass 3 sig. Stellen erhalten werden
usw.

Ich habe hier genau das Problem gefunden, nur dass hier jemand statt auf 3
sig. Stellen 4 sig Stellen haben will....
http://www.office-loesung.de/ftopic100435_0_0_asc.php

Das Script hier sieht so aus:

-----------------------------------
Sub Beschneiden()

Dim i As Integer
Dim sngWert As Single
Dim lngLR As Long

lngLR = IIf(IsEmpty(Cells(Rows.Count, 1)), Cells(Rows.Count,
1).End(xlUp).Row, Rows.Count)

For i = 1 To lngLR

sngWert = Cells(i, 1).Value

Select Case sngWert

Case Is > 1000
Cells(i, 2).Value = Int(Cells(i, 1).Value)

Case Is < 1
Cells(i, 2).Value = Cells(i, 1).Value

Case Is < 1000
Cells(i, 2).Value = Left(Cells(i, 1), 5)

End Select

Next i

End Sub
-------------------------------------


Ich habe leider keine Ahnung von VBA. Das Script funktioniert in meiner
Tabelle so leider nicht. Es scheint nur in Spalte A zu funktionieren. Kann
mir jemand sagen, wie ich das Script anpassen muss, damit es einen
ausgewählten Bereich bearbeitet und wie ich es von 4 auf 3 sig. Stellen
anpassen muss? (letzteres ist wohl das geringere Problem)

Das wäre wirklich super


Vielen Dank schonmal

Gruß Thomas


stefan onken

unread,
Apr 11, 2008, 7:58:33 AM4/11/08
to
hallo Thomas,
teste mal dies (es wird nur die Darstellung der Zahl in der Tabelle
angepasst, der Wert selber nicht verändert. Ich nehme an, dass das so
sein soll?)
im VBA-Editor (Alt+F11) auf Einfügen/Modul
in das große Codefenster diesen Code kopieren

Sub DreiZählendeStellen()
With Selection
For i = 1 To .Cells.Count
sngWert = .Cells(i).Value
Select Case sngWert
Case Is >= 100
.Cells(i).NumberFormat = "0"
Case Is >= 10
.Cells(i).NumberFormat = "0.0"
Case Is >= 1
.Cells(i).NumberFormat = "0.00"
Case Is >= 0.1
.Cells(i).NumberFormat = "0.000"
Case Is >= 0.01
.Cells(i).NumberFormat = "0.0000"
End Select
Next i
End With
End Sub


ggfls noch erweitern für >=0.001 oder welche rausnehmen (>=1, wenn
Zahlen zwischen 1 und 10 sowieso immer 3 zählende Stellen haben).
Editor beenden. Markiere in der Tabelle den betreffenden Bereich und
gehe dann auf Extras/Makro/Makros. Da findest du den Eintrag
DreiZählendeStellen. Es ist aber möglich, das Makro zB über einen
button oder einen Tastatur-shortcut zu starten.


Gruß
stefan

On 11 Apr., 13:07, "Thomas Bahls" <flow...@gmx.de> wrote:
> Hallo,
>
> ich habe gerade ein sehr spezielles Problem und bin mir gar nicht ganz
> sicher, ob ich hier in der richtigen NG bin.
>
> Ich möchte in einer Excel Tabelle (Excel 2003)  in einem markierten Bereich
> die "signifikanten Stellen" auf 3 anpassen per Script.
>
> Also zb:
> 33322 hat 0 sig. Stellen und bleibt
> 3.22  hat 3 sig Stellen und bleibt
> 0.0022332 hat 5 sig. Stellen und wird gekürzt auf 3 sig Stellen zu 0.00223
> 2.322323 hat 7 sig. Stellen und wird gekürzt auf 2.32 Stellen
> 2.3  hat 2 sig Stellen und muss im Format aus zwei Nachkommastellen
> erweitert werden, so dass 3 sig. Stellen erhalten werden
> usw.
>
> Ich habe hier genau das Problem gefunden, nur dass hier jemand statt auf 3

> sig. Stellen 4 sig Stellen haben will....http://www.office-loesung.de/ftopic100435_0_0_asc.php

Christoph Sternberg

unread,
Apr 11, 2008, 8:08:40 AM4/11/08
to

Thomas Bahls meinte:

>Ich möchte in einer Excel Tabelle (Excel 2003) in einem markierten Bereich
>die "signifikanten Stellen" auf 3 anpassen per Script.

Da mich das jetzt interessierte und ich mir nicht vorstellen konnte, daß
man dafür VBA braucht, habe ich auch mal geforscht, dabei das gefunden:

http://www.excelformeln.de/formeln.html?welcher=179

und das draus gemacht (Zahl in A1, Anzahl sign. Stellen in B1):

=WENN(A1<10^B1;KÜRZEN(A1;B1-1-GANZZAHL(LOG(ABS(A1))));KÜRZEN(A1;0))

Christoph Sternberg */\
--
E-Mail an Adresse im FROM wird ungelesen gelöscht

Robert Gelbmann

unread,
Apr 11, 2008, 8:14:25 AM4/11/08
to
Hallo Thomas!

---"Thomas Bahls" <flo...@gmx.de> schrieb ...


> ich habe gerade ein sehr spezielles Problem und bin mir gar nicht
> ganz sicher, ob ich hier in der richtigen NG bin.
>
> Ich möchte in einer Excel Tabelle (Excel 2003) in einem markierten
> Bereich die "signifikanten Stellen" auf 3 anpassen per Script.
>
> Also zb:
> 33322 hat 0 sig. Stellen und bleibt
> 3.22 hat 3 sig Stellen und bleibt
> 0.0022332 hat 5 sig. Stellen und wird gekürzt auf 3 sig Stellen zu
> 0.00223
> 2.322323 hat 7 sig. Stellen und wird gekürzt auf 2.32 Stellen
> 2.3 hat 2 sig Stellen und muss im Format aus zwei Nachkommastellen
> erweitert werden, so dass 3 sig. Stellen erhalten werden
> usw.

Habe in Anlehnung an
http://www.excelformeln.de/formeln.html?welcher=179 (von Klaus
Kühnlein)
folgende VBA-Adaption erarbeitet, die dein durchaus sehr "spezielles"
Problem abdecken sollte.

Ablauf:
(1) Sorge dafür, dass in der Spalte rechts neben den zu bearbeitenden
Zellen Platz für die Ergebnisse ist!
(2) Markiere die zu bearbeitenden Zellen!
(3) Makro aufrufen (Extras / Makro / Makros)

Danach stehen die gewünschten Ergebnisse mit dem jeweils angepassten
Zahlenformat rechts neben der Markierung.


'---snip---
Sub AufAnzSigStellen_Anpassen()
Dim rng As Range
Dim intAnzNachStellen As Integer

Const intAnzSigStellen = 3

For Each rng In Selection.Cells
If IsNumeric(rng.Value) Then 'Texte werden nicht behandelt
If rng.Value <> 0 Then ' 0 wird nicht behandelt
intAnzNachStellen = intAnzSigStellen -
Int(Log(Abs(rng.Value)) / Log(10)) - 1
Select Case intAnzNachStellen
Case Is <= 0
rng.Offset(0, 1).Value =
Application.WorksheetFunction.Round(rng.Value, 0)
rng.Offset(0, 1).NumberFormat = "#,##0"
Case Else
rng.Offset(0, 1).Value =
Application.WorksheetFunction.Round(rng.Value, intAnzNachStellen)
rng.Offset(0, 1).NumberFormat = "#,##0." &
String(intAnzNachStellen, "0")
End Select
End If
End If
Next
End Sub
'---snip---


--
In der Hoffnung geholfen zu haben, verbleibe ich mit einem leisen


Servus aus Wien,
-Robert Gelbmann-
---
I solemnly swear that I'm up to no good.

Thomas Bahls

unread,
Apr 11, 2008, 9:02:03 AM4/11/08
to
> und das draus gemacht (Zahl in A1, Anzahl sign. Stellen in B1):
>
> =WENN(A1<10^B1;KÜRZEN(A1;B1-1-GANZZAHL(LOG(ABS(A1))));KÜRZEN(A1;0))


Hey, das sieht ja schon gar nicht so schlecht aus..... funzt aber noch nicht
so ganz....

Diese Werte stehen in A1-A11:
0.170
1.804
1.584
135.689
26.167
733.297
938.162
0.338
0.839
1.508
5.062


Dieser in B1-B11 (also immer die "3"):
3


In C1-C11 werden die folgenden Werte ausgegeben:

0.17 eine sig.Stelle zu wenig
1.8 eine sig.Stelle zu wenig
1.58 richtig
135 richtig
26.1 richtig
733 richtig
938 richtig
0.338 richtig
0.839 richtig
1.5 eine sig. stelle zu wenig
5.06 richtig

Sieht also so aus, als wenn er eine sig Stelle zu wenig angibt, wenn diese
Stelle 0 ist......
Vielleicht muss ich die Zelle dafür ja aber auch anders "benutzerdefiniert"
formatieren (?), wenn ja wie?


Danke aber erstmal. Gruß Thomas


Thomas Bahls

unread,
Apr 11, 2008, 9:13:24 AM4/11/08
to
:-)


Also ich werd das nun noch weiter testen, aber bisher sieht es so als, als
wäre das ein Treffer ins Schwarze!

Vielen Dank!


Gruß Thomas


Christoph Sternberg

unread,
Apr 11, 2008, 9:22:44 AM4/11/08
to

Thomas Bahls meinte:

>0.17 eine sig.Stelle zu wenig
>1.8 eine sig.Stelle zu wenig

>1.5 eine sig. stelle zu wenig

Ich bin kein Mathematiker, aber ist diese 0 ganz hinten hinterm Komma
wirklich signifikant?? Das geht bei Excel freilich nur über's
Zellenformat.

Thomas Bahls

unread,
Apr 11, 2008, 9:49:32 AM4/11/08
to

"Christoph Sternberg" <cster...@nurfuerspam.de> schrieb im Newsbeitrag
news:eQWJfc9m...@TK2MSFTNGP04.phx.gbl...

>
> Thomas Bahls meinte:
>
>>0.17 eine sig.Stelle zu wenig
>>1.8 eine sig.Stelle zu wenig
>>1.5 eine sig. stelle zu wenig
>
> Ich bin kein Mathematiker, aber ist diese 0 ganz hinten hinterm Komma
> wirklich signifikant?? Das geht bei Excel freilich nur über's
> Zellenformat.


Es sollen ja eben drei sig Stellen angegeben werden. So sind es bei diesen
Beispielen nur noch 2 sig. Stellen. Im Grunde hab ich ja nun auch dank des
VBA-Scripts von Stefan O. mein Ziel erreicht. Naja wenn das mit einer Formel
zu erreichen ist, ohne die Zellformatierung stets aufs neue zu verändern
(bzw. nur einmal) dann wäre das natürlich noch besser....
Bin aber im Grunde schon glücklich, bzw. mein Cheffe ;-)


Gruß Thomas


Thomas Bahls

unread,
Apr 11, 2008, 12:03:13 PM4/11/08
to
> Ablauf:
> (1) Sorge dafür, dass in der Spalte rechts neben den zu bearbeitenden
> Zellen Platz für die Ergebnisse ist!
> (2) Markiere die zu bearbeitenden Zellen!
> (3) Makro aufrufen (Extras / Makro / Makros)
>
> Danach stehen die gewünschten Ergebnisse mit dem jeweils angepassten
> Zahlenformat rechts neben der Markierung.
>
>
>....Code.....


Hi,

das scheint auch zu gehen, allerdings fand ich die Lösung von stefan etwas
schöner, da man hier keine neue Spalte schaffen musste.

Trotzdem ganz vielen dank.....

Ich frag mich grad, wo und wie man wohl zumindest die basics in
VBS-Programmierung am besten lernt. Will da kein Star werden, aber momentan
hab ich das Gefühl, ich könnte sowas immer öfter bei so kleinen Problemchen
gebrauchen. Muss man da wohl sehr viel Zeit für Opfern? Ich guck heut Abend
mal, obs nicht vielleicht ein paar online-Kurse gibt, um vielleicht
wenigstens ein paar Basics zu lernen.....


So jetzt ist hier aber erstmal feierabend.


gruß Thomas


Robert Gelbmann

unread,
Apr 11, 2008, 7:15:12 PM4/11/08
to
Hallo Thomas!

---"Thomas Bahls" <flo...@gmx.de> schrieb ...

> [...]


> das scheint auch zu gehen, allerdings fand ich die Lösung von
> stefan etwas schöner, da man hier keine neue Spalte schaffen
> musste.

Wenn du gleich die Daten überschreiben möchtest, bedarf es nur einer
kleinen Korrektur:

'---snip---
Sub AufAnzSigStellen_Anpassen()
Dim rng As Range
Dim intAnzNachStellen As Integer

Const intAnzSigStellen = 3

For Each rng In Selection.Cells
If IsNumeric(rng.Value) Then 'Texte werden nicht behandelt
If rng.Value <> 0 Then ' 0 wird nicht behandelt
intAnzNachStellen = intAnzSigStellen -
Int(Log(Abs(rng.Value)) / Log(10)) - 1
Select Case intAnzNachStellen
Case Is <= 0

rng.Value =
Application.WorksheetFunction.Round(rng.Value, 0)
rng.NumberFormat = "#,##0"
Case Else
rng.Value =
Application.WorksheetFunction.Round(rng.Value, intAnzNachStellen)
rng.NumberFormat = "#,##0." &


String(intAnzNachStellen, "0")
End Select
End If
End If
Next
End Sub
'---snip---

> Trotzdem ganz vielen dank.....

Gerne doch!


> Ich frag mich grad, wo und wie man wohl zumindest die basics in
> VBS-Programmierung am besten lernt. Will da kein Star werden, aber
> momentan hab ich das Gefühl, ich könnte sowas immer öfter bei so
> kleinen Problemchen gebrauchen. Muss man da wohl sehr viel Zeit
> für Opfern? Ich guck heut Abend mal, obs nicht vielleicht ein paar
> online-Kurse gibt, um vielleicht wenigstens ein paar Basics zu
> lernen.....

VBA ist nunmal eine Programmier*sprache* und die lernt man nicht in
ein paar Stunden.
Du hast in Excel den Vorteil, dass man Vieles aufzeichnen kann,
womit viele Vokabeln schon mal beigelegt werden.

Trotzdem (ohne dich entmutigen zu wollen):
Zum Verständnis für Schleifen, If-Anweisungen, Select Case,
Variablen usw. - ganz ohne vorherige Programmiererfahrung - wird es
schon etwas länger dauern ...

0 new messages