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

Kleine Mathematik-Nuss

Kleine Mathematik-Nuss
11.12.2020 14:59:12
Max
Hallo
Ich suche nach zwei Formeln oder Funktionen mit der ich eine 4stellige Zahl in eine 3stellige Zahl verschlüsseln und entschlüsseln kann.
Dabei gibt es bei der 4stelligen Zahl enge Grenzen.
Folgender Hintergrund:
Es geht ursprünglich um Großuchstaben-Paare (AA-ZZ)
Die 4stellige Zahl entsteht zur Zeit aus diesen Paaren per Codezahlen der Buchstaben.
Das soll bei der 3stelligen Zahl auch möglich sein.
Beispiele:
Verschlüsseln:
"MU" = Code("M") & Code("U") = 7785
(etwas realistischer):
"MU" = CODE(LINKS("MU";1)) & CODE(RECHTS("MU";1)) = 7785
Entschlüsseln:
7785 = ZEICHEN(77) & ZEICHEN(85) = "MU"
(etwas realistischer):
7785 = ZEICHEN(LINKS(7785;2)) & ZEICHEN(RECHTS(7785;2)) = "MU"
Soweit, so schlecht.
Nun ist es aber unbedingt erforderlich aus der 4stelligen eine 3stellige Zahl zu machen, und da es durch die Begrenzung (A=65/Z=90) nur 676 mögliche Paarungen geben kann, suche ich nach einer Lösung dieses Problems.
Lösungen mit Vorangestellten Nullen (001) bzw. 1 od. 2stellige Zahlen wären kein Problem, wohl aber Minuszahlen.
Zur Erinnerung: Ver- & Entschlüsselung. Vba oder xl-Lösung. Das ist egal. Nur schön kurz sollte es sein.
Kann mir da jemand weiterhelfen?
Grüsse
Max

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Ascii
11.12.2020 15:15:54
Fennek
Hallo,
als ein Vorschlag:
"A" ist Ascii 64 (&H41) und könnte als 0 definiert werden, damit können 2 Großbuchstaben sogar als 1 2-stellige Zahl kodiert werden.
Für 3-stellige Codes geht für "AB": Asc("A") + Asc("B") or 127
mfg
AW: Ascii
11.12.2020 16:18:17
Max
Hallo
Danke für die Antwort.
Ich verstehe sie nur nicht ganz.
1. Zeile: "A" = bei mir 65 & bei 676 möglichen Paarungen erscheint mir eine 2stellige Zahl utopisch.
2. Zeile: Asc("A")+ Asc("B") ist bei mir 131. Dummerweise ergibt es mit "BA" auch 131.
Ich brauch's gleichzeitig auch anders herum: 131 = ?
Upps, oder ich nehme die Oder-Bedingung ernst, dann komme ich auf 255.
Dann das selbe Problem: In beiden Fällen ("AB"/"BA") kommt 255 raus. Woher weiß die 255 welche Kombination gemeint ist?
Grüsse
Max
Anzeige
AW: Kleine Mathematik-Nuss
11.12.2020 16:12:30
onur
A=1 und Z=26
MU=1321 nach der alten Version.
13x26+21=359
359+100=459
+100, damit bei AA z.B. keine 2-stelligen Zahlen kommen.
Rückwärts:
459-100=359
INT(359/26)=13=M
Rest(359/26)=26=U
AW: Kleine Mathematik-Nuss
11.12.2020 16:26:48
onur
HAST DU MEINEN POST NICHT GELESEN?
WIESO OFFEN ?
AW: Doch,doch...super
11.12.2020 17:44:39
Max
Hallo onur
'Tschuldigung, war einkaufen (Klopapier natürlich)
Tja, richtig schön einfach, die 359ste Paarung = "MU".
Leider nicht zu erkennen, wenn man ein Brett vorm Kopf hat. (Ärger!)
Vielen Dank, super gelöst, haargenau das was ich gesucht habe.
Für die Sammler nochmal das Ergebnis:
Function Von4zu3zu4(str$) As Variant 'str = 2 Lettern oder 3 Ziffern
Von4zu3zu4 = 0
Select Case Len(str)
Case 2
Von4zu3zu4 = ((Asc(Left(str, 1)) - 64) * 26) _
+ (Asc(Right(str, 1)) - 64)
Case 3
If Not IsNumeric(str) Then Exit Function
Von4zu3zu4 = Chr(Int((str) / 26) + 64) _
& Chr((str Mod 26) + 64)
End Select
End Function
Grüsse
Max
(PS: Deine letzte 26 = eine 21)
Anzeige
AW: Doch,doch...super
11.12.2020 17:52:20
onur
Du hast die 100 vergessen, dann hast du z.B. bei AA 27 und der Code läuft nicht.
AW: Doch,doch...super
11.12.2020 19:38:29
Max
Hi Onur
Ich dachte mit der zus. Zeile,
>Von4zu3zu4 = Format(Von4zu3zu4, "000") wäre die Sache gegessen, da ich damit auf 3 Stellen komme.
Nachdem sich herausstellte, dass die Funktion Mist liefert, sobald in der Buchstaben-Paarung als zweites ein "Z" steht, habe ich Deine 100 versucht, aber das hat nicht geholfen.
Auch Deine Lösung liefert für z.B. "AZ" die 152, aber für die 152 ein "B@"
Okay, wir denken nochmal drüber nach.
Kann nu' nicht mehr so schwer sein.
Ein Workaround würde helfen, aber man will's ja perfekt haben.
Ich mach' jetzt Feierabend.
Schönen Abend noch
Grüsse
Max
Anzeige
AW: Teste AA, MU, ZZ und rückwärts...
11.12.2020 19:27:41
EtoPHG
Hallo,
Für eine Profi ein hast du das super getestet.
Ich finde onur's Ansatz auch Spitze, aber du solltest dich an seine Angaben halten und zudem muss die Korrekturzahl 65 und nicht 64 sein, also:
Function Von4zu3zu4(str As Variant) As Variant 'str = 2 Lettern oder 3 Ziffern
Von4zu3zu4 = 0
Select Case Len(str)
Case 2
Von4zu3zu4 = ((Asc(Left(str, 1)) - 65) * 26) _
+ (Asc(Right(str, 1)) - 65) + 100
Case 3
If Not IsNumeric(str) Then Exit Function
Von4zu3zu4 = Chr(Int((str - 100) / 26) + 65) _
& Chr(((str - 100) Mod 26) + 65)
End Select
End Function
Gruess Hansueli
Anzeige
AW: An Onur & EtoPHG
11.12.2020 19:52:51
Max
Hallo
Alles Sch..., alles Mist, wenn man nicht besoffen ist.
Ihr habt beide recht, und ich bin übermüdet.
So wird ein Schuh draus:
Function Von4zu3zu4(str$) As Variant
Von4zu3zu4 = 0
Select Case Len(str)
Case 2
Von4zu3zu4 = ((Asc(Left(str, 1)) - 65) * 26) _
+ (Asc(Right(str, 1)) - 65)
Von4zu3zu4 = Von4zu3zu4 + 100
Case 3
If Not IsNumeric(str) Then Exit Function
str = str - 100
Von4zu3zu4 = Chr(Int((str) / 26) + 65) _
& Chr((str Mod 26) + 65)
End Select
Vielen Dank nochmal, hat mir für morgen früh verlorenes Gehirnschmalz erspart.
Grüsse
Max
Anzeige
AW: An Onur & EtoPHG
11.12.2020 20:10:10
onur

Public Function Number2Text(ByVal nr As Integer) As String
If nr > 676 Then
Number2Text = "?"
Exit Function
End If
nr = nr - 100
Number2Text = Chr(Int(nr / 26) + 64) & Chr(nr - Int(nr / 26) * 26 + 64)
End Function
Public Function Text2Number(ByVal txt As String) As Integer
Dim z1, z2
If Len(txt)  2 Then
Text2Number = "?"
Exit Function
End If
z1 = 26 * (Asc(Left(txt, 1)) - 64)
z2 = Asc(Right(txt, 1)) - 64
Text2Number = 100 + z1 + z2
End Function

auch fehlerhaft, teste ab TZ bis ZZ (owT)
11.12.2020 21:34:21
EtoPHG

AW: auch fehlerhaft, teste ab TZ bis ZZ (owT)
11.12.2020 22:02:57
onur
Stimmt, entweder Faktor 27 und 64 abziehen oder Faktor 26 und 65 abziehen - also besser 65 abziehen.
Public Function Number2Text(ByVal nr As Integer) As String
Dim z1, z2
If nr > 676 Then
Number2Text = "?"
Exit Function
End If
nr = nr - 100
z1 = Int(nr / 26) + 65
z2 = nr - Int(nr / 26) * 26 + 65
Number2Text = Chr(Int(nr / 26) + 65) & Chr(nr - Int(nr / 26) * 26 + 65)
End Function
Public Function Text2Number(ByVal txt As String) As Integer
Dim z1, z2
If Len(txt)  2 Then
Text2Number = "?"
Exit Function
End If
z1 = 26 * (Asc(Left(txt, 1)) - 65)
z2 = Asc(Right(txt, 1)) - 65
Text2Number = 100 + z1 + z2
End Function

Anzeige
AW: auch fehlerhaft, teste ab TZ bis ZZ (owT)
11.12.2020 22:05:37
onur
Da war noch Testmüll drin.
Public Function Number2Text(ByVal nr As Integer) As String
Dim z1, z2
If nr > 676 Then
Number2Text = "?"
Exit Function
End If
nr = nr - 100
Number2Text = Chr(Int(nr / 26) + 65) & Chr(nr - Int(nr / 26) * 26 + 65)
End Function

Public Function Text2Number(ByVal txt As String) As Integer
Dim z1, z2
If Len(txt)  2 Then
Text2Number = "?"
Exit Function
End If
z1 = 26 * (Asc(Left(txt, 1)) - 65)
z2 = Asc(Right(txt, 1)) - 65
Text2Number = 100 + z1 + z2
End Function

Alles gut
13.12.2020 17:58:39
Max
Hallo
Bin wieder da.
Hmm - wohl doch noch ein bisschen in's Glas geschaut?
Die erste Version war doch völlig in Ordnung und läuft rund.
Habe gestern unter anderem mit der Funktion an die 100.000 Datensätze gerettet.
Es gab keine Beanstandungen.
(siehe Datei)
Function Von4zu3zu4(str$) As Variant
Von4zu3zu4 = 0
Select Case Len(str)
Case 2
Von4zu3zu4 = ((Asc(Left(str, 1)) - 65) * 26) _
+ (Asc(Right(str, 1)) - 65)
Von4zu3zu4 = Von4zu3zu4 + 100
Case 3
If Not IsNumeric(str) Then Exit Function
str = str - 100
Von4zu3zu4 = Chr(Int((str) / 26) + 65) _
& Chr((str Mod 26) + 65)
End Select
End Function
https://www.herber.de/bbs/user/142291.xls
Grüsse und fröhlichen Lockdown
Max
Anzeige
Gerne geschehen !
13.12.2020 18:04:17
onur
AW: VBA (wie Onur
11.12.2020 17:45:03
Fennek
Hallo,
im zweiten Anlauf:

' in Spalte A stehen 2 Groß-Buchstaben, z.B. AB, MN, ZY, ZZ
Sub T_1()
Dim WSF As WorksheetFunction: Set WSF = Application.WorksheetFunction
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
iBin1 = Format(WSF.Dec2Bin(Asc(Left(Cells(i, 1), 1)) - 65), "00000")
iBin2 = Format(WSF.Dec2Bin(Asc(Right(Cells(i, 1), 1)) - 65), "00000")
i2Bin = iBin1 & iBin2
zz = 0
For b = 9 To 0 Step -1
zz = zz + Mid(i2Bin, 10 - b, 1) * (2 ^ b)
Next b
Cells(i, 2) = zz
z1 = zz Mod 32
z2 = Int(zz / 32)
Cells(i, 3) = Chr(z2 + 65) & Chr(z1 + 65)
Next i
End Sub

Anzeige
AW: Auch schön
11.12.2020 18:51:19
Max
Hallo Fennek
Dec2Bin habe ich nicht sofort greifbar,ist aber berühmt genug, dass ich sie wiederfinde.
Wird dann gleich getestet.
Dein 2. Anlauf hat mich daran erinnert, dass in meiner Function die Zeile fehlt:
(vor Case 3) Von4zu3zu4 = Format(Von4zu3zu4, "000")
Vielen Dank für Dein Interesse und Deine Lösung!
Grüsse
Max

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige