Seite 1 von 1
Re: eine 9-stellige Seriennummer generieren...
Verfasst: Sa, 23.01.2016 09:37
von Stephan
würde ich per Makro machen:
Code: Alles auswählen
Sub Seriennummer()
Do
tmp = nummer_erzeugen
i = 1
Do
If ThisComponent.Sheets(0).getCellByPosition(0, i).String = "" Then
Exit Do
End If
i = i + 1
Loop
letzte = i - 1
doppel = 0
For i = 1 to letzte
If ThisComponent.Sheets(0).getCellByPosition(0, i).String = tmp Then
doppel = 1
Exit For
End If
Next i
Loop While doppel = 1
ThisComponent.Sheets(0).getCellByPosition(0, letzte+1).String = tmp
InputBox("Die aktuell ermittelte Seriennummer ist:", "Seriennummer", tmp)
End Sub
Function nummer_erzeugen()
ne = ""
For i = 0 To 8
var = Int((36 * Rnd)+1)
Select Case var
Case 1 To 10
erg = var - 1
Case 11 To 36
erg = CHR(var + 54)
Case Else
Msgbox "Fehler"
End Select
ne = ne & erg
Next i
nummer_erzeugen = ne
End Function
Gruß
Stephan
Re: eine 9-stellige Seriennummer generieren...
Verfasst: Sa, 23.01.2016 14:22
von Karolus
Hallo
Na gut...
pastbin
Code: Alles auswählen
from string import ascii_uppercase as abc, digits
from random import choice
POOL = abc + digits
def id9():
return ''.join(choice(POOL) for _ in range(9))
def main(*_):
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.Sheets.Tabelle1
colum_a = sheet.Columns.A
cursor = sheet.createCursorByRange(colum_a)
cursor.gotoEndOfUsedArea(1)
used_ids = cursor.DataArray
pool = abc + digits
id_num = id9()
while (id_num,) in used_ids:
id_num = id9()
colum_a.getCellByPosition(0,len(used_ids)).setString(id_num)
Karolus
Re: eine 9-stellige Seriennummer generieren...
Verfasst: Sa, 23.01.2016 19:23
von IRATA
Da bedanke ich mich schon mal ganz brav bei euch Beiden.
Werde es morgen, wenn ich dazu komme, mal versuchen irgendwie zu testen...
Rückmeldung folgt dann umgehend
Ein schönes Restwochenende noch
Re: eine 9-stellige Seriennummer generieren...
Verfasst: So, 24.01.2016 07:48
von paljass
Hi,
Gibt es eine elegante Möglichkeit, jeden Teil dieser 9-stellige Seriennummer in je eine Zellen zu legen?
]als Matrixformel mit Strg-Umschalt-Enter abschließen.
Gruß
paljass
Re: eine 9-stellige Seriennummer generieren...
Verfasst: So, 24.01.2016 10:56
von Stephan
Allerdings sind die Seriennummern sehr Buchstabenlastig, was aber wohl daraus resultiert, daß es 26 Buchstaben, aber nur 10 Ziffern gibt
naja, man kann doch trotzdem das Verhältnis von Buchstaben zu Zahlen beliebig einstellen. Die folgende Änderung sollte ein Verhältnis von 50:50 (Zahlen:Buchstaben) erzeugen:
Code: Alles auswählen
Function nummer_erzeugen()
ne = ""
For i = 0 To 8
x1 = Rnd
If x1 <= 0.5 Then
'Zahl
var = Int(10 * Rnd)
erg = var
Else
'Buchstabe
var = Int((26 * Rnd)+1)
erg = CHR(var + 64)
End if
ne = ne & erg
nummer_erzeugen = ne
Next i
End Function
(d.h. natürlich nicht das nur Kombinationen von jeweils 4:5 (Buchstaben:Zahl) bzw. 5:4 (Buchstaben:Zahl) vorkommen, sondern nur das bei z.B. 100 Seriennummern im Mittel insgesamt 450 Zahlen und 450 Buchstaben enthalten sein sollten)
Gibt es eine elegante Möglichkeit, jeden Teil dieser 9-stellige Seriennummer in je eine Zellen zu legen?
Hat paljass schon beantwortet, hier eine Variante des Makros als Alternativlösung:
Wie bekomme ich für eine zusätzliche Berechnung den Zahlenwert eines jeden Buchstaben (A=1, B=2 usw.) in eine Zelle?
Wenn A in A1 steht, dann mit:
=CODE(A1)-64
Gruß
Stephan
Re: eine 9-stellige Seriennummer generieren...
Verfasst: So, 24.01.2016 11:26
von Karolus
Hallo
Zum Verhältniss Buchstaben:Zahlen
Code: Alles auswählen
POOL = abc + digits # ergibt 26:10
POOL = abc + digits*2 # ergibt 26:20
Gibt es eine elegante Möglichkeit, jeden Teil dieser 9-stellige Seriennummer in je eine Zellen zu legen?
Für 2- und 3-stellige fand ich etwas, aber der Rest...
Dann wäre da noch eine "Kleinigkeit...
Wie bekomme ich für eine zusätzliche Berechnung den Zahlenwert eines jeden Buchstaben (A=1, B=2 usw.) in eine Zelle?
Spätestens hier stellt sich die Frage nach dem
eigentlichen Zweck des Manövers??
Re: eine 9-stellige Seriennummer generieren...
Verfasst: So, 24.01.2016 15:22
von IRATA
Hallo
Erst einmal ein großes Dankeschön für die Hilfe.
Es klappt nun ganz gut, obwohl mir ein paar Dinge schleierhaft sind und Einiges wiederum konnte ich sogar nachvollziehen und anpassen.
Warum auch immer funktionierte das Einfügen in meine Tabelle nicht, dann aktivierte es z.B. vom Generieren-Knopf bloß die Grafik zum Ändern oder Verschieben.
Das Problem löste ich, indem ich meine Tabellenblätter einfach in die neue einfügte. Da fiel mir ein gravierender Unterschied zu dem "gehaßten" MS-Produkt auf. Keine Verknüpfungen waren mehr vorhanden, aber das war schnell korrigiert...
Die Sache mit den Buchstaben in Zahlen funktioniert soweit, allerdings weiß ich ja zuvor nicht, an welcher Stelle ein Buchstabe sein wird. Nun sind ja die Zahlen Minuswerte und die Buchstaben korrekte positive Zahlenwerte.
Minuswerte könnte ich zwar ausblenden, aber geschickter wäre es, wenn an Stelle der Minuswerte einfach die vorherige positive Zahl dort erscheinen würde und nur die Buchstaben entsprechend umgerechnet wären.
Da hab ich wohl gerade etwas gefunden... - =WENN(P2<0;B2)+WENN(P2>0;P2)+WENN(P2=0;P2) P2, Q2, R2 usw. wären die Zellen, in denen evtl. der Wert für den Buchstaben steht, oder eben der Ursprungswert übernommen wird.
Mit =RECHTS(P5;1) ziehe ich dann in den jeweiligen Zellen den Einerwert raus.
Nun zu der Frage, wozu das Ganze. Es geht um Seriennummern und die zu jedem Block gewollte Kontrollzahl, so ähnlich wie es bei Ausweisen der Fall ist. Dazu benötige ich für die anschließende Multiplikation eben diese einstelligen Zahlen je Zelle, wobei bei Buchstaben dann immer der "Einer" verwendet wird. X wäre als Zahlenwert die 24, wovon dann die 4 als Faktor für die folgende Multiplikation genutzt wird... Es ergeben sich also 9 Multiplikationen, deren Ergebnis dann zur Berechnung der Kontrollzahl genutzt wird...
Wäre es sehr aufwendig, diesen "Knopf" Seriennummer generieren in ein anderes Tabellenblatt zu verlagern?
Ich bin so schon nicht die Leuchte, was Tabellenkalkulation angeht, aber Makros und Scripte sind für mich ganz weit weg...
Einen schönen Sonntag noch
Re: eine 9-stellige Seriennummer generieren...
Verfasst: So, 24.01.2016 15:27
von IRATA
Hallo
Etwas anderes kurioses ist mir gerade aufgefallen, wofür ich keine Erklärung finde...
Aus welchem Grund auch immer, wird manchmal die "0" als Wert angezeigt und manchmal nicht. Das ändert zwar am Ergebnis nichts, ist aber recht verwirrend. Noch dazu, wenn ich mir die Formatierung der Zellen ansehe und keinen Unterschied finden kann...
Ich schiebe das mal auf Windows...
MfG
Re: eine 9-stellige Seriennummer generieren...
Verfasst: So, 24.01.2016 20:08
von IRATA
Hallo noch mal
Eine Frage hätte ich noch bezüglich der generierten Seriennummer und der Aufteilung in die 9 Einzelfelder...
So wie es jetzt ist, funktioniert alles tadellos, aber das Speichern der aufgeteilten Seriennummer wäre nicht notwendig und ist für die weitere Nutzung eher hinderlich...
Schöner wäre es, wenn wie bisher in der ersten Spalte die Seriennummern stehen bleiben und die in 9 Einzelzellen aufgeteilte Nummer immer die gleichen Zellen nutzt.
Ich hab da etwas versucht, was sicher mit einer sauberen Lösung NICHTS zu tun hat, funktioniert aber bis auf einen kleinen, einmaligen Fehler.
Diese Original-Zeilen:
With ThisComponent.Sheets(3)
For i = 1 To 9
.getCellByPosition(i, letzte+1).String = tmp(i-1)
Next i
.getCellByPosition(0, letzte+1).String = tmp2 (i-1)
End With
habe ich noch einmal in dieser Form angehangen:
With ThisComponent.Sheets(4)
For i= 1 To 9
.getCellByPosition(i, letzte=0).String = tmp(i-1)
Next i
.getCellByPosition(0, letzte+1).String = tmp2
End With
und nun wird auf einem Tabellenblatt weiter, noch einmal eine Liste mit den Seriennummern in der ersten Spalte angelegt, aber die gerade generierte Seriennummer wird nur in der ersten Zeile ab Spalte 2 in je eine Zelle aufgeteilt und dann bei der nächsten generierten SN überschrieben.
Der einmalige Fehler ist reproduzierbar und kommt immer dann, wenn ich die erste SN generiere.
Da ich im Vorfeld schon 2 per Hand vergeben hatte, ist dieser Fehler zu vernachlässigen...
Warum das aber nun so funktioniert, hab ich keine Ahnung, außer daß die Zahl in Klammern hinter Sheets das entsprechende Tabellenblatt meint.
Nun bliebe nur noch den "Neue Seriennummer-Knopf" an einen mir genehmeren Ort zu kopieren, ohne daß es die Funktion beeinträchtigt.
Ich versuche mich da etwas einzulesen und so Manches zu verstehen, aber viel kommt noch nicht dabei heraus...
MfG
Re: eine 9-stellige Seriennummer generieren...
Verfasst: Mo, 25.01.2016 09:28
von Stephan
Schöner wäre es, wenn wie bisher in der ersten Spalte die Seriennummern stehen bleiben und die in 9 Einzelzellen aufgeteilte Nummer immer die gleichen Zellen nutzt.
Dann ändere das im Makro nach Beliebeniundem Du fixe Werte für die Zelladressen einsetzt, z.B.:
Code: Alles auswählen
With ThisComponent.Sheets(0)
For i = 1 To 9
.getCellByPosition(i+1, 0).String = tmp(i-1)
Next i
.getCellByPosition(0, letzte+1).String = tmp2
End With
damit stehen die Einzelteile immer in C1 bis K1 und werdfen bei jeder neuen Zahlenermittlung überschrieben.
und nun wird auf einem Tabellenblatt weiter, noch einmal eine Liste mit den Seriennummern in der ersten Spalte angelegt, aber die gerade generierte Seriennummer wird nur in der ersten Zeile ab Spalte 2 in je eine Zelle aufgeteilt und dann bei der nächsten generierten SN überschrieben.
Der einmalige Fehler ist reproduzierbar und kommt immer dann, wenn ich die erste SN generiere.
Wenn ich raten müsste dann doch wohl wegen:
denn dass Dortige "letzte=0" ist ein Wahrheitsvergleich und wird immer zu 0 wenn "letzte" ungleich 0 ist und zu 1 wenn "letzte" gleich 0 ist.
Nun bliebe nur noch den "Neue Seriennummer-Knopf" an einen mir genehmeren Ort zu kopieren, ohne daß es die Funktion beeinträchtigt.
-mit Ansicht-Symbolleisten-Formularsteuerelemente die entsprechende Symbolleiste anzeigen
-dort auf das Icon für den Entwurfsmodus klicken (Dreieck plus Bleistift)
-die Schaltfläche markieren und ausschneiden
-an anderer Stelle wieder einfügen
-Entwurfmodus in Symbolleiste Abschalten
-Symbolleiste über Ansicht-Symbolleisten-Formularsteuerelemente abschalten (NICHT über das x der Leiste, das funktiniert nur bis zu nächsten Start, ist ein gewolltes Feature)
Gruß
Stephan
Re: eine 9-stellige Seriennummer generieren...
Verfasst: Mo, 25.01.2016 11:54
von IRATA
Hallo und ein riesiges Dankeschön an ALLE Helfer
Es ist jetzt perfekt, so wie ich es mir vorgestellt hatte.
Warum nach der Änderung plötzlich von C1 bis K1 die einzelnen Ziffern der Seriennummer eingetragen werden, erschließt sich mir immernoch nicht, aber egal, es funktioniert.
Sollte Jemand den Drang verspüren, meine Unwissenheit zu beenden, wäre ich da nicht abgeneigt, im Gegenteil, man wird ja nicht dümmer dadurch.
MfG
Re: eine 9-stellige Seriennummer generieren...
Verfasst: Mo, 25.01.2016 12:38
von Stephan
Warum nach der Änderung plötzlich von C1 bis K1 die einzelnen Ziffern der Seriennummer eingetragen werden, erschließt sich mir immernoch nicht, aber egal, es funktioniert.
mein Gott ... die Adressierung einer Zelle per Positionsangabe erfolgt per Angabe von Spalte und Zeile, also:
.getCellByPosition(<Spalte>, <Zeile>)
und wenn ich darim die Zeile konstant lasse:
.getCellByPosition(<Spalte>, 0)
schreibe ich in eine unveränderliche Zeile.
Wenn ich hingegen die Zeile variiere, z.B.:
.getCellByPosition(<Spalte>, letzte+1)
natürlich in unterschiedliche Zeilen.
Gleiches gilt für Spalten, ist hier aber nicht relevant, weil diese zwar von 2 bis 10 (1 bis 9 plus jeweils 1) variiert werden, das aber in beiden Fällen gleich variiert werden:
For i = 1 To 9
.getCellByPosition(i+1, letzte+1). ...
Next i
For i = 1 To 9
.getCellByPosition(i+1, 0). ...
Next i
Gruß
Stephan
Re: eine 9-stellige Seriennummer generieren...
Verfasst: Mo, 25.01.2016 15:58
von IRATA
Hallo
Der Anfang mit Zeile und Spalte ist sogar mir nun verständlich, wobei ich noch nicht erkennen kann, woher die Definition C1 - K1 kommt.
Schon klar, daß er immer in Zeile 1 überschreibt, aber wenn er in A1, A2 usw. die Seriennummern schreibet, woher die Info, Spalte B leer zu lassen?
Von 1 - 9 sind 10 Zellen, also eine für die Seriennummer, die generiert wurde, welche Zeile für Zeile eingetragen werden und die 9 Einzelzellen, welche von jeder neuen Seriennummer überschrieben werden. Da aber B1 nicht genutzt wird, wären es doch 11 Zellen...?
Wie gesagt, ich bin mit der Funktion mehr als zufrieden, aber der Punkt bleibt mir auch nach Deiner Erklärung unverständlich.
Ich gehe mal davon aus, daß man da ähnlich Excel eine Fehlerprüfung beim erstellen hat, damit keine ungültigen Werte und Funktionen gemischt werden können, oder merkt man den Fehler erst beim ersten Start?
MfG
Re: eine 9-stellige Seriennummer generieren...
Verfasst: Di, 26.01.2016 09:21
von Stephan
Ich kann hier keinen Programmiergrundkurs geben und es ist natürlich schwer bestimmte Allgemeindinge der Programmierung (z.B. Schleifen) zu benutzen ohne sie zu verstehen, aber in Kürze:
Der Anfang mit Zeile und Spalte ist sogar mir nun verständlich, wobei ich noch nicht erkennen kann, woher die Definition C1 - K1 kommt.
aus dem INhalt des Codes kommt das, denn das hier:
ist/tut nichts Anderes als diese (relativ vielen) Zeilen tun würden:
Code: Alles auswählen
.getCellByPosition(2, 0). ...
.getCellByPosition(3, 0). ...
.getCellByPosition(4, 0). ...
.getCellByPosition(5, 0). ...
.getCellByPosition(6, 0). ...
.getCellByPosition(7, 0). ...
.getCellByPosition(8, 0). ...
.getCellByPosition(9, 0). ...
.getCellByPosition(10, 0). ...
wobei .getCellByPosition(2, 0). ... C1 entspricht und .getCellByPosition(10, 0). ... K1, denn z.B. A1 entspricht 0,0, B1 1,0 und A2 0,1
aber wenn er in A1, A2 usw. die Seriennummern schreibet, woher die Info, Spalte B leer zu lassen?
also an der Stelle denke doch einmal nach, wenn Du in der Kneipe ein Bier bestellst weiß der Kellner ja auch das Du nicht zusätzlich einen Kaffee willst, weil man i.A. ja nur sagt was man will und nicht zusätzlich sagt was man nicht will und eine Angabe wie:
entspricht immer nur einer bestimmten Zelle (0 und letzte+1 sind zum Zeitpunkt wo diese Zeile abgearbeitet wird KONKRETE Werte) in ausschliesslich Spalte A (weil weil die Spaltenkoordinate hier fest mit 0 angegeben ist)
Ich gehe mal davon aus, daß man da ähnlich Excel eine Fehlerprüfung beim erstellen hat, damit keine ungültigen Werte und Funktionen gemischt werden können, oder merkt man den Fehler erst beim ersten Start?
StarBasic ist nach üblicher Betrachtung eine interpretierte Programmiersprache:
https://de.wikipedia.org/wiki/Interpreter
und keine compillerte Sprache:
https://de.wikipedia.org/wiki/Compiler
so wie VBA auch.
Fehler in StarBasic werden aber normalerweise nicht vor dem Ablauf des Programmes angezeigt, wie das bei VBA in den meisten Fällen üblich ist, das ist aber weniger eine FRage der jeweiligen Programmiersprache sondern der Entwicklungsumgebung, der IDE, des 'FEnsters' wo man den Code eintippt.
(Bitte das "normalerweise" beachten, denn man kann ein Makro auch vorab (testweise) Übersetzen ohne es direkt laufen zu lassen, nur darum dürfte es hier bei Deiner Frage nicht gegangen sein.)
Gruß
Stephan