800 Aufrufe
Gefragt in Tabellenkalkulation von
Guten Tag,

ich benötige ihre Hilfe bei der Erstellung einer drei stelligen Abfolge aus Zahlen und Buchstaben (ohne Null)

AB3, 1UZ oder zum Beispiel G4E

Keine der Abfolgen soll doppelt vorkommen und die Abfolgen sollen sich nachträglich nicht verändern lassen.

Geplant ist damit ein Formular auszudrucken und deshalb muss ersichtlich sein welche Nummern im Umlauf sind. Es würde reichen wenn man ein Tabellenblatt mit zum Beispiel 100 dieser Abfolgen ausgibt und danach 100 weiter erstellt wenn man diese benötigt.

Alternativ könnte ich mir auch vorstellen das man zum Beispiel 20 Abfolgen erstellt diese dann selbstständig in das Formular (auch Excel) einträgt und jeder Ausdruck eine andere Abfolge bekommt. Ob das Oberhaupt möglich ist weiß ich nicht.

Ich habe bereits mit Index und Zufallszahl sowie Zeichen(Zufallsbereich) experimentiert jedoch werden die bereits erstellten Abfolgen permanent geändert was nicht sein darf.

Ich bedanke mich recht herzlich.
fat61

18 Antworten

0 Punkte
Beantwortet von
Hallo,

der erste Fehler lag an mir ich habe das falsche Tabellenblatt eingetragen.

Kann man die Druckeinstellungen auch mittels VBA kontrollieren so wie einseitg oder 2 seitig bzw das Papiermagazin?

Ebenfalls ist mir aufgefallen das wenn ich zuerst 3 Formulare ausdrucke und ich dann 10 weitere am gleichen Tag drucken möchte das er dann 7 ergänz also auf die Anzahl der ausdrucke aufrundet und nicht addiert.

Ich habe das Office 365 packet.
0 Punkte
Beantwortet von

Hallo fat61

Ja, du kannst den Printout-Befehl um zusätzliche Parameter ergänzen. Wie diese konkret aussehen hängt von deinem Drucker ab. Am besten du Druckst ein beliebiges Blatt mit deinen Wunscheinstellungen und nimmst das Ganze mit dem Makrorekorder auf. Dann kannst du die entstandenen Parameter hinter dem Printout-Befehl kopieren. Ein anderes Druckerfach zu wählen ist mit dem Standardbefehl aber nicht möglich. Schau dir dazu mal diesen Tipp an. Das wäre auch eine Möglichkeit.

Problem 2 kann ich leider nicht nachvollziehen. Bei mir werden erst 3, dann 10 Codes am gleichen Tag generiert. So wie gewünscht. Dafür sorgt die Schleife For z=1 to Anzahl. Wenn du also 10 eingibst werden auch 10 gedruckt. Es sei denn du hast bereits 40.000 Codes hinter dir. Dann kann es sein, dass der Timeout dich vorzeitig aus der Schleife schmeißt, weil in 30 sek. kein gültiger Code gefunden werden konnte. Diesen kannst du auch erhöhen. Aber ich vermute, so viele Formulare druckst du nicht, oder?

Gruß Mr. K.

0 Punkte
Beantwortet von
Hallo xlKing ich habe probiert die Druckereinstellungen mittels Makrorecorder aufzuzeichnen das hat leider nicht geklappt. Irgendwie kann der Rekorder nicht auf die Einstellungen vom Drucker zugreifen.
0 Punkte
Beantwortet von

Hallo fat61

das habe ich befürchtet. Da bleibt dir nur der Tipp aus meiner vorherigen Antwort. Sprich: Du generierst einen neuen Drucker und setzt darin die gewünschten Eigenschaften als Standard. Dann sprichst du diesen Drucker im Makroparameter an. Das geht! Was du genau machen musst um für denselben Drucker einen zweiten Druckerbutton für die gewünschten Einstellungen zu generieren, weiß ich auch nicht. Ich habe leider keinen Drucker, um das testen zu können. Am besten stellst du dazu hier im Forum eine neue Frage. Dann kann dir einer der Experten hier weiterhelfen.

Gruß Mr. K.

0 Punkte
Beantwortet von
Bearbeitet

Ebenfalls ist mir aufgefallen das wenn ich zuerst 3 Formulare ausdrucke und ich dann 10 weitere am gleichen Tag drucken möchte das er dann 7 ergänz also auf die Anzahl der ausdrucke aufrundet und nicht addiert.

So ich habe das heute nochmal geprüft und habe gesehen das er jetzt addiert also passt das.

Leider kann ich den Netzwerkdrucker kein zweites mal hinzufügen somit fällt leider die Idee mit den Druckern ins Wasser.  Aber das macht nichts.

Ich habe jetzt eine Msgbox eingefügt mit der Warunung "Sind die Druckereinstellungen geändert?" Ich werde jetzt probieren hier eine Box zu erstellen mit mehreren Buttons zum Auswählen wie Ja und Nein (bei nein soll Abgebrochen werden und bei Ja soll die Auswahl zwischen ForumlarDeu und ForumlarEng kommen)

Ich probiere das mal graphisch aufzuzeigen:

1. Druckereinstellunge geändert?

|

nein -> Abbruch

ja -> 2. ForumlarDeu oder FormularEng

|

Wieviele Formulare sollen erstellt werden?

[Feld für die Anzahl]

|

-> Anzahl an den ausgewählten Formularen wird automatisch gedruckt und die Datei gespeichert.

Ich würde mich freuen wenn einer von euch das auch umsetzten könnte da ich sehr viel hier mitnehme. Dank euch!

Sub Testfeld()

Dim Max As Long, Spalte As Long, z As Long, Start As Single, p As Byte
Dim code As String, zchn As String, anzahl As Long
Dim Codepos As Range, Codesheet As Worksheet, c As Range

Randomize Timer
Max = 42875

Eingabewert = MsgBox("Druckereinstellung geändert?", vbYesNo)

If Eingabewert = vbNo Then

End If

Exit Sub

ElseIf Eingabewert = vbYes Then

Sheets("FormularDeu").Select

Set Codepos = Sheets("FormularDeu").Range("B3") 'wo im Formular soll der Code stehen?
Set Codesheet = Sheets("Codes") 'wie heißt das Blatt, wo alle bereits
                                       'verwendeten Codes aufgelistet sind?
Do 'Abfrage nach Anzahl
anzahl = Val(InputBox("Wie viele Formulare wollen Sie heute drucken?"))
Loop Until CLng(anzahl) >= 0

'Spalte ermitteln
Set c = Codesheet.Cells.Find(Date)
If c Is Nothing Then
  Spalte = Codesheet.Cells(1, Columns.Count).End(xlToLeft).Offset(0, 1).Column
  Codesheet.Cells(1, Spalte) = Date
Else
  Spalte = c.Column

End If
End Sub

0 Punkte
Beantwortet von

Mittlerweile habe ich mich dazu entschlossen das ich zwei verschiedene Schaltflächen erstelle eine für ForumlarDEU und eine für FormularENG.

Im Anschluss nach dem drucken soll die Excel-Datei automatisch gespeichert werden damit es keine Probleme mit den Codes gibt. (ich hoffe dieser Befehl ist richtig "ActiveWorkbook.Save")

Sub yesnno1()

Dim Max As Long, Spalte As Long, z As Long, Start As Single, p As Byte
Dim code As String, zchn As String, anzahl As Long
Dim Codepos As Range, Codesheet As Worksheet, c As Range

Randomize Timer
Max = 42875

If MsgBox("Druckeinstellungen geändert?", vbYesNo) = vbYes Then

Sheets("FormularDEU").Select

Set Codepos = Sheets("FormularDEU").Range("B3") 'wo im Formular soll der Code stehen?
Set Codesheet = Sheets("Codes") 'wie heißt das Blatt, wo alle bereits
                                       'verwendeten Codes aufgelistet sind?
Do 'Abfrage nach Anzahl
anzahl = Val(InputBox("Wie viele Formulare wollen Sie heute drucken?"))
Loop Until CLng(anzahl) >= 0

'Spalte ermitteln
Set c = Codesheet.Cells.Find(Date)
If c Is Nothing Then
  Spalte = Codesheet.Cells(1, Columns.Count).End(xlToLeft).Offset(0, 1).Column
  Codesheet.Cells(1, Spalte) = Date
Else
  Spalte = c.Column
End If

Else

MsgBox "Druckereigenschaften einstellen auf: " & vbNewLine & "" & vbNewLine & "MyTab - Druckart -> 1-seitig" & vbNewLine & "Basis - Papiermagazin -> Stapelblattanlage" & vbNewLine & "" & vbNewLine & "Richtiges Papier einlegen!"


End If

For z = 1 To anzahl
  If Application.CountA(Codesheet.UsedRange) = Max Then Exit For
  Start = Timer
  Do
    If Timer > Start + 30 Then Exit Sub 'Timeout wenn nach 30 Sek. noch
                                        'kein unbenutzter Code gefunden wurde
    code = "" 'Code erzeugen
    For p = 1 To 3
      Do
        zchn = Int(Rnd * 42) + 49
      Loop Until Chr(zchn) Like "[A-Z]" Or Chr(zchn) Like "[1-9]"
      code = code & Chr(zchn)
    Next p
  Loop Until Codesheet.UsedRange.Find(code) Is Nothing 'Dubletten haben keine Chance
 
  With Codesheet.Cells(Rows.Count, Spalte).End(xlUp).Offset(1, 0)
   .NumberFormat = "@"
   .Value = code
  End With
  Codepos.Value = code
  ' Sheets("FormularDEU").PrintOut 'hab ich als Kommentar markiert weil sich die Druckereinstellungen nicht umstellen lassen
Next z

'MsgBox "Speichern nicht vergessen!"

ActiveWorkbook.Save 'wird automatisch gespeichert nach dem Drucken

End Sub

Kann mir bitte jemand sagen wo ich in dem Makro diesen Teil einfügen muss 

Sub FarbeRot()
'
' FarbeRot Makro
'

'
    With Selection.Font
        .Color = -16776961
        .TintAndShade = 0
    End With
    Selection.Font.Bold = True
End Sub

 wenn ich die Codes für das FormularENG in rot haben möchte?

Danke!

0 Punkte
Beantwortet von

Hallo fat61, 

sorry, dass ich mich jetzt erst melde. Bin nicht ganz so oft online.

zu deiner Frage.

(ich hoffe dieser Befehl ist richtig "ActiveWorkbook.Save")

Ja ist richtig, zu

wo ich in dem Makro diesen Teil einfügen muss 

Du kannst jedem Range-Objekt diese Eigenschaften mitgeben. Im aktuellen Beispiel ist Codepos ein Range-Objekt. und du kannst unter Codepos.Value = code noch die Zeilen Codepos.Font.Color=-16776961 und Codepos.Font.TintAndShade = 0 setzen. Oder du ersetzt einfach Selection durch Codepos, dann lautet der letzte Teil:

Codepos.Value = code
With Codepos.Font 
    .Color = -16776961 
    .TintAndShade = 0 
  .Bold=True
 End With
Next z

Gruß Mr. K.

0 Punkte
Beantwortet von
Perfekt vielen Dank! Das Projekt ist jetzt abgeschlossen und funktioniert. Es können jetzt die entsprechenden Anzahl der Formulare mir einem Code automatisch gedruckt werden. Und in der Tabelle der Codes sind die vón dem einen Formular in ner anderen Farbe wie die von dem anderen Formular.

Wirklich vielen vielen Dank!
...