Ich würde gerne eine Zahl diagnostizieren. Die Art und Weise, wie ich das vorhabe, soll folgendermaßen aussehen:
Man nehme eine beliebige Zahl, z.B. 145
Jetzt möchte ich über diese Zahl wissen, wieviele Hunderter, Zehner und Einer darin enthalten sind. Möglicherweise ist es mathematisch falsch, aber als Ergebnis wünsche ich mir:
Die Zahl enthält 1 Hunderter
Die Zahl enthält 4 Zehner
Die Zahl enthält 5 Einer
Kennt jemand eine mathematische Formel, mit der man das berechnen kann? Ich möchte lieber darauf verzichten, die Zahl in einen Text umzuwandeln und dann die einzelnen „Werte“ wieder in eine Zahl zurückzuwandeln.
Formeln mit Excel-Funktionen würden auch weiterhelfen.
Vielen Dank für Eure Hilfe
Option Explicit
Private Sub Command1\_Click()
Dim a As long, i As Integer
Dim e As Integer, l As Integer
a = 145
l = Int(Log(a) / Log(10))
For i = l To 0 Step -1
e = Int(a / 10 ^ i)
List1.AddItem CStr(e) & " X " & CStr(10 ^ i)
a = Int(a Mod 10 ^ i)
Next
End Sub
Vielen Dank.
Habe es ausprobiert und es funktioniert für 145.
Ich habe dann aber aus der 145 'mal 1458 gemacht und dann wird folgendes Ergebnis zurückgegeben:
1 Tausender
5 Hunderter
6 Zehner
8 Einer
Ich habe nach einigem Testen herausgefunden, dass, sobald die Einer größer 5 sind, werden die Zehner um 1 erhöht. Sobald die Zehner größer als 5 sind, werden die Hunderter um 1 erhöht. Scheinbar läuft diese „Kaskade“ so weiter.
Ich werde 'mal schauen, ob ich herausbekomme, woran das wohl liegt.
Mit „Log“ kenne ich mich nicht wirklich gut aus, aber das wird sich sicherlich finden.
was hast Du verändert?
Bei mir läuft der Code immer ohne Probleme
Ob ich für a 145 eingebe oder 123456789 oder auch 987654321, es kommt immer das richtige Ergebnis.
Man nehme eine beliebige Zahl, z.B. 145
Jetzt möchte ich über diese Zahl wissen, wieviele Hunderter,
Zehner und Einer darin enthalten sind. Möglicherweise ist es
mathematisch falsch, aber als Ergebnis wünsche ich mir:
Kennt jemand eine mathematische Formel, mit der man das
berechnen kann? Ich möchte lieber darauf verzichten, die Zahl
in einen Text umzuwandeln und dann die einzelnen „Werte“
wieder in eine Zahl zurückzuwandeln.
warum willst das vermeiden, sags, vielleicht kann man dir dann besser helfen.
Formeln mit Excel-Funktionen würden auch weiterhelfen.
Schau mal hier, bei größeren Zahlen in A1 mußte halt die Formel anpassen, ansonsten ist sie nach untten kopierbar.
Tabellenblatt: C:\Dokumente und Einstellungen\ich2\Eigene Dateien\[ZeichenBilder2.xls]!Tabelle3
│ A │ B │
──┼──────┼─────────────┤
1 │ 2345 │ 2 Tausender │
──┼──────┼─────────────┤
2 │ │ 3 Hundeterr │
──┼──────┼─────────────┤
3 │ │ 4 Zehner │
──┼──────┼─────────────┤
4 │ │ 5 Einer │
──┴──────┴─────────────┘
Benutzte Formeln:
B1: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Tausender"
B2: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Hundeterr"
B3: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Zehner"
B4: =WENN(LÄNGE($A$1)\>4-ZEILE();TEIL($A$1;LÄNGE($A$1)-4+ZEILE();1);0)&" Einer"
A1:B4
haben das Zahlenformat: Standard
Tabellendarstellung erreicht mit dem Code in FAQ:2363
Jetzt möchte ich über diese Zahl wissen, wieviele Hunderter,
Zehner und Einer darin enthalten sind.
kein Problem, das Prinzip ist recht simpel. In der Zahl n sind genau
(n DIV 10000) MOD 10 Stück Zehntausender
und (n DIV 1000) MOD 10 Stück Eintausender
und (n DIV 100) MOD 10 Stück Hunderter
und (n DIV 10) MOD 10 Stück Zehner
und (n DIV 1) MOD 10 Stück Einer
enthalten. DIV = Ganzzahldivision, MOD = Modulo-Operator. Das kann man natürlich auf weniger Stellen verkürzen oder auf mehr ausdehnen. Alle Werte liegen – wegen des „MOD 10“ am Schluss – immer im Bereich 0…9.
das muss unter VBA auf der Userform ganz genau so laufen, wie in VB6 auch.
Nur die Steuerelemente heißen anders, das war’s auch schon. Der Rest ist Mathe pur, das macht VBA genauso wie VB6.
In Deinem Beitrag weiter unten hast Du vermutet, dass ich kein VB habe, aber das stimmt nicht. Ich habe VB5 und VB6 bei mir rumliegen, arbeite nur schon länger nicht mehr damit und bin inzwischen auch schon umgestiegen auf VB.NET; das finde ich besser. Mit VBA habe ich „damals“ vor VB5 angefangen, kenne es also länger und habe damit viel gemacht (oder versucht?)
warum willst das vermeiden, sags, vielleicht kann man dir
dann besser helfen.
OK:
Ich „spiele“ gerade mit einer .NET-Programmierung herum, bei der es um eine 7-Segment-Anzeige geht. Ich habe mir für die Segmente Bilder gemalt (jeweils ein Bild für EIN und ein Bild für AUS), die ich entsprechend des „anliegenden“ Signals anzeige. Ich kann also quasi eine Zahl auf einer LED-Anzeige darstellen (sieht hübsch aus).
Die „anliegenden“ Signale speichere ich in einer „Datenbank“ (genauer gesagt in einer Liste, die aus BitArrays besteht). Das heißt, ich habe zehn „Datensätze“(für die Zahlen 0 bis 9) mit jeweils sieben boolschen Werten (für die Segmente a bis g) und muß per nullbasiertem Index auf die Datensätze zugreifen. Ich denke, Du sagst gerade „Ah Ja“ und weißt, daß die Anzahl der Einer in einer Zahl mir dann als Index für den entsprechenden Datensatz dient.
Um es vorwegzunehmen: Ich möchte auf keinen Fall für jede Zahl ein einzelnes Bild malen, was durchaus unproblematisch wäre; ich möchte versuchen, die Steuerung einer 7-Segment-Anzeige zu verstehen.
Weiterhin möchte ich die ganze Geschichte auch noch in einer Klasse kapseln (deswegen muß die mathematische Formel sowohl für die Einer, als auch für die Tausender oder für die Millioner gelten) und irgendwie ein UserControl daraus basteln (krieg’ ich sowieso nie fertig, aber die Vorstellung ist schön).
So, jetzt guck’ ich mir aber erstmal Deine Formeln an. Vielen Dank dafür.
kein Problem, das Prinzip ist recht simpel. In der Zahl n
sind genau
Simpel ist gut
(n DIV 10000) MOD 10 Stück Zehntausender
und (n DIV 1000) MOD 10 Stück Eintausender
und (n DIV 100) MOD 10 Stück Hunderter
und (n DIV 10) MOD 10 Stück Zehner
und (n DIV 1) MOD 10 Stück Einer
enthalten. DIV = Ganzzahldivision, MOD = Modulo-Operator. Das
kann man natürlich auf weniger Stellen verkürzen oder auf mehr
ausdehnen. Alle Werte liegen – wegen des „MOD 10“ am Schluss –
immer im Bereich 0…9.
Vielen Dank, Martin, dass werd’ ich auch ausprobieren. Könnte man 1 auch darstellen durch 10 hoch irgendwas?
Da weiß ich dann nicht, was das tut, ob das irgendwo
ungefragt rundet.
Mit .NET kenne ich mich gar nicht aus.
Ach so. Naja, ich hatte das Int() ersetzt durch CInt(), weil mir Int als Fehler unterstrichen wurde. CInt() rundet quasi kaufmännisch (wenn man das so sagen kann).
In Deinem Beitrag weiter unten hast Du vermutet, dass ich
kein VB habe, aber das stimmt nicht. Ich habe VB5 und VB6 bei
mir rumliegen, arbeite nur schon länger nicht mehr damit und
bin inzwischen auch schon umgestiegen auf VB.NET; das finde
ich besser. Mit VBA habe ich „damals“ vor VB5 angefangen,
kenne es also länger und habe damit viel gemacht (oder
versucht?)
Hallo Carsten,
dann sage das bitte dazu wenn du anfragst.
Wenn du eine VB.Net Lösung suchst kann ich es mir sparen irgendwelche Excelformeln zu basteln und umgekehrt
Sag doch bei Anfragen so:
ich hab VB5, VB6, Vb.Net, Excel-Vba, suche eine Lösungg für dieses Problem und ich nehm die Lösung die mir am besten passt.
Dann wissen wir Bescheid.
Ach so. Naja, ich hatte das Int() ersetzt durch CInt(), weil
mir Int als Fehler unterstrichen wurde. CInt() rundet quasi
kaufmännisch (wenn man das so sagen kann).
dann lasse ich das Int eben weg. Das geht auch und sollte mit .NET immer noch funktionieren. / bedeutet Division. \ auch aber ohne Nachkommastellen, ohne runden.
Option Explicit
Private Sub Command1\_Click()
Dim a As Long, i As Integer
Dim e As Integer, l As Integer
a = 123456789
l = Log(a) \ Log(10)
For i = l To 0 Step -1
e = a \ 10 ^ i
List1.AddItem CStr(e) & " X " & CStr(10 ^ i)
a = a - e \* 10 ^ i
Next
End Sub
Wenn du eine VB.Net Lösung suchst kann ich es mir sparen
irgendwelche Excelformeln zu basteln und umgekehrt
Irgendwie hast Du schon recht, aber irgendwie auch nicht. Ich suchte nach einer mathematischen Formel. Wenn nun jemand diese Formel kennt, sie aber nur als Excel-Funktion beschreiben kann, dann hilft mir das ja schon weiter und die Umsetzung nach VB oder VB.NET bleibt dann eben mein Problem. Ich weiß aber, daß es für die Mathematik- und Trigonometrie-Funktionen in Excel immer auch eine Entsprechung in VBA gibt und eigentlich heißen die in VB6 auch genauso.
Ich erreiche so doch viel mehr potentielle Helfer.