Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1844to1848
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
Daten aus Listbox in Worksheet eintragen
08.09.2021 09:43:34
Sleepyhead
Guten Morgen zusammen.
Folgende Problemstellung:
Ich habe eine Userform erstellt, welche Daten einer Eingabe in einem String wie folgt in eine Listbox einträgt:
Datum; Name; Personenanzahl; Zimmernummer; reservierte Zeit
das Datum ist immer im Format TT.MM.JJJJ
und die reservierte Zeit kann folgende 4 Zeiten annehmen: "07:00-09:00" "09:15-11:00" "17:30-19:00" 19:30-21:00".
Nun zu meinem Problem:
Über einen Button in der Userform sollen nun die Daten in die jeweils dazugehörigen Exceltabellen welche pro Monat in einem Worksheet, welches je mit Monat + Jahr benannt ist eingetragen werden.
Folgenden Code habe ich dazu geschrieben, es erscheint auch keine Fehlermeldung, aber irgendwo muss ich einen Fehler gemacht haben, denn die Daten werden nicht eingetragen, die Userform aber wie am Ende des Codes steht ausgeblendet.
Vielleicht kann mir da ja jemand helfen.
Ich danke euch schonmal im Vorraus!
Nun der Code dazu:

Sub speichern_Click()
Dim i As Integer
Dim n As Integer
Dim k As Integer
Dim gesamt As String
Dim datum As String
Dim tag As String
Dim tagvs As Integer
Dim monat As String
Dim jahr As String
Dim name As String
Dim pax As String
Dim nummer As String
Dim zeit As String
With UserForm1.zusammenfassung
For i = 0 To .ListCount - 1
gesamt = .List(i)
datum = Left$(gesamt, InStr(1, gesamt, ";") - 1)
gesamt = Right$(gesamt, Len(gesamt) - InStr(1, gesamt, ";"))
name = Left$(gesamt, InStr(1, gesamt, ";") - 1)
gesamt = Right$(gesamt, Len(gesamt) - InStr(1, gesamt, ";"))
pax = Left$(gesamt, InStr(1, gesamt, ";") - 1)
gesamt = Right$(gesamt, Len(gesamt) - InStr(1, gesamt, ";"))
nummer = Left$(gesamt, InStr(1, gesamt, ";") - 1)
gesamt = Right$(gesamt, Len(gesamt) - InStr(1, gesamt, ";"))
zeit = gesamt
tag = Left$(datum, 2)
tagvs = CInt(tag)
jahr = Right$(datum, 4)
monat = Right$(Left$(datum, 5), 2)
If InStr(1, datum, ".01.")  0 Then
datum = Replace(datum, ".01.", ". Januar ")
ElseIf InStr(1, datum, ".02.")  0 Then
datum = Replace(datum, ".02.", ". Februar ")
ElseIf InStr(1, datum, ".03.")  0 Then
datum = Replace(datum, ".03.", ". März ")
ElseIf InStr(1, datum, ".04.")  0 Then
datum = Replace(datum, ".04.", ". April ")
ElseIf InStr(1, datum, ".05.")  0 Then
datum = Replace(datum, ".05.", ". Mai ")
ElseIf InStr(1, datum, ".06.")  0 Then
datum = Replace(datum, ".06.", ". Juni ")
ElseIf InStr(1, datum, ".07.")  0 Then
datum = Replace(datum, ".07.", ". Juli ")
ElseIf InStr(1, datum, ".08.")  0 Then
datum = Replace(datum, ".08.", ". August ")
ElseIf InStr(1, datum, ".09.")  0 Then
datum = Replace(datum, ".09.", ". September ")
ElseIf InStr(1, datum, ".10.")  0 Then
datum = Replace(datum, ".10.", ". Oktober ")
ElseIf InStr(1, datum, ".11.")  0 Then
datum = Replace(datum, ".11.", ". November ")
ElseIf InStr(1, datum, ".12.")  0 Then
datum = Replace(datum, ".12.", ". Dezember ")
Else
MsgBox "Auf den Boden werfen und nach Hauke schreien!", vbOKOnly, "Hilfe?"
End If
If InStr(1, datum, Left$(ThisWorkbook.Worksheets(2).name, Len(ThisWorkbook.Sheets(2).name) - 5))  0 Then
If InStr(1, zeit, "07:00-09:00")  0 Then
k = 2
ElseIf InStr(1, zeit, "09:15-11:00")  0 Then
k = 9
ElseIf InStr(1, zeit, "17:30-19:00")  0 Then
k = 16
ElseIf InStr(1, zeit, "19:30-21:00")  0 Then
k = 23
Else
MsgBox "Bitte nach Hauke schreien!", vbOKOnly, "Hilfe?"
End If
ThisWorkbook.Worksheets(2).Activate
For n = tagvs * 55 - 52 To n = tagvs * 55 - 2
If ThisWorkbook.Worksheets(2).Cells(n, k) = "" Then
ThisWorkbook.ActiveSheet.Cells(n, k) = nummer
ThisWorkbook.ActiveSheet.Cells(n, k + 1) = name
ThisWorkbook.ActiveSheet.Cells(n, k + 5) = pax
ElseIf n = tagvs * 55 - 1 Then
MsgBox "Dieser Termin ist bereits voll, bitte manuell oder handschriftlich eintragen", vbOKOnly, "Der Termin" & " " & zeit & " am " & datum & " ist voll!"
Else: GoTo weiter
End If
weiter:
Next n
End If
Next i
End With
UserForm1.Hide
End Sub

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Daten aus Listbox in Worksheet eintragen
08.09.2021 09:49:02
Oberschlumpf
Hi,
kannst du bitte per Upload eine Bsp-Datei mit Bsp-Daten, dem Userform(ular) und deinem Code zeigen?
Ciao
Thorsten
AW: Daten aus Listbox in Worksheet eintragen
08.09.2021 10:37:30
Sleepyhead
Aber natürlich,
https://www.herber.de/bbs/user/147956.xlsm
dort habe ich die Liste hochgeladen, als xlsm, bitte noch irgendein worksheet an erster stelle einfügen, damit alles andere passt, das erste worksheet wird als muster verwendet um die weiteren monate etc. hinzuzufügen.
Die Userformeingabe ist an sich selbsterklärend, Name, Zimmernummer, Personenanzahl ist alles als string definiert, daher bei der eingabe fast egal, außer man würde ein ";" verwenden. Datum muss noch im tt.mm.jjjj format eingetragen werden, da habe ich noch keine Möglichkeit gefunden die punkte automatisch einzufügen, und dann einfach eine frühstücks- und eine abendessenszeit auswählen und auf "in Liste vermerken" klicken.
MfG
Sleepyhead
Anzeige
AW: Daten aus Listbox in Worksheet eintragen
08.09.2021 22:46:35
Yal
Hallo Sleepyhead, Herr der goldenen Schlüsseln,
ein ganz schöne Spaghetti-Code hast Du da.
Im Prinzip: Name, Zimmer-nr und Standardauswahl für Früh-/Spätfrühstück bzw Abendessen. Dazu die Möglichkeit in Zusammenfassung einzelne Einträge zu "switchen".
Nicht ganz klar für mich ist die Beantragung in der elendlose Liste pro Monat. Ich gehe davon aus, diese Liste wird jeweils morgens vor dem Frühstück und abends vor dem Abendessen gedruckt. Wichtig ist bei der Buchung ein Übersicht der freie Plätze vor der Zusage. Dementsprechend würde ich alle Einträge in einer Liste reinbringen und eine Auswertung pro Tag (Pivottabelle machen). Für den täglichen Druck kann eine PowerQuery gezielter sein.
Ich habe nicht viel anderes gemacht als den Code verschlankt. Fehler sollte damit leichter zu entdecken sein.
Die Functionen Text_validieren und Zahl_validieren müssten noch auf Basis von Datum_validieren hergestellt werden.

Const FRF = "07:00-09:00"
Const FRS = "09:15-11:00"
Const AEF = "17:30-19:00"
Const AES = "19:30-21:00"
Private Sub aufenthalt_von_Change()
Datum_validieren Me.aufenthalt_von, "Bitte valide Startdatum eingeben"
End Sub
Private Function Datum_validieren(ByRef Ctrl, Optional Meldung As String = "") As Boolean
On Error GoTo Catch
Ctrl.Text = Format(CDate(Ctrl), "DD.MM.YYYY")
If Meldung  "" Then MsgBox Meldung, vbOKOnly, "Unvollständigkeit/Fehler"
Datum_validieren = True
Exit Function
Catch:
End Function
Private Sub uebernehmen_Click()
If Not Datum_validieren(Me.aufenthalt_von, "Bitte valide Startdatum eingeben") Then Exit Sub
If Not Datum_validieren(Me.aufenthalt_bis, "Bitte valide Enddatum eingeben") Then Exit Sub
If Not Text_validieren(Me.nachname, "Bitte valide Name eingeben") Then Exit Sub
If Not Zahl_validieren(Me.zimmernummer, "Bitte valide Zimmernummer eingeben") Then Exit Sub
If Not Zahl_validieren(Me.personenanzahl, "Bitte valide Personenanzahl eingeben") Then Exit Sub
Me.nachname = UCase(Me.nachname, 1) & LCase(Mid(Me.nachname, 2))
With Me.zusammenfassung
If Me.fruehstueck_frueh And Me.fruehstueck_spaet Then
MsgBox "Bitte nur eine Frühstückszeit auswählen", vbOKOnly, "Haste Blödsinn gemacht?"
ElseIf Not Me.fruehstueck_frueh And Not Me.fruehstueck_spaet Then
MsgBox "Bitte eine Frühstückszeit auswählen", vbOKOnly, "Haste Blödsinn gemacht?"
ElseIf Me.abendessen_frueh And Me.abendessen_spaet Then
MsgBox "Bitte nur eine Abendessenszeit auswählen", vbOKOnly, "Haste Blödsinn gemacht?"
Else
For d = Me.aufenthalt_von To Me.aufenthalt_bis
If Me.abendessen_frueh Then .AddItem (d & "; " & Me.nachname & "; " & Me.personenanzahl & " Pax" & "; # " & Me.zimmernummer & "; " & AEF)
If Me.abendessen_frueh Then .AddItem (d & "; " & Me.nachname & "; " & Me.personenanzahl & " Pax" & "; # " & Me.zimmernummer & "; " & AES)
If Me.fruehstueck_frueh Then .AddItem (d + 1 & "; " & Me.nachname & "; " & Me.personenanzahl & " Pax" & "; # " & Me.zimmernummer & "; " & FRF)
If Me.fruehstueck_spaet Then .AddItem (d + 1 & "; " & Me.nachname & "; " & Me.personenanzahl & " Pax" & "; # " & Me.zimmernummer & "; " & FRS)
Next
End If
End With
End Sub
Private Sub zusammenfassung_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Integer
With UserForm1.zusammenfassung
For i = 0 To .ListCount - 1
If .Selected(i) Then
Select Case Right$(.Text, 11)
Case FRF: .List(i) = Replace(.Text, FRF, FRS)
Case FRS: .List(i) = Replace(.Text, FRS, FRF)
Case AEF: .List(i) = Replace(.Text, AEF, AES)
Case AES: .List(i) = Replace(.Text, AES, AEF)
Case Else
MsgBox "Kein Plan was du angestellt hast!", vbOKOnly, "Bockmist gebaut?"
Exit Sub
End Select
End If
Next
End With
End Sub
Sub speichern_Click()
Dim i, n, k
Dim gesamt
Dim datum As Date
Dim tagvs As Integer
With UserForm1.zusammenfassung
For i = 0 To .ListCount - 1
gesamt = Split(.List(i), ";")
datum = CDate(gesamt(0))
tagvs = Day(datum)
If Month(datum) = Month(CDate("1. " & ThisWorkbook.Worksheets(2).name)) Then
Select Case gesamt(4) 'zeit
Case FRF: k = 2
Case FRS: k = 9
Case AEF: k = 16
Case AES: k = 23
End Select
With ThisWorkbook.Worksheets(2)
For n = tagvs * 55 - 52 To tagvs * 55 - 2
If n = tagvs * 55 - 1 Then
MsgBox "Dieser Termin ist bereits voll, " & vbCr & datum & " " & gesamt(4) & vbCr & "bitte manuell oder handschriftlich eintragen", vbOKOnly, "Termin ist voll!"
ElseIf .Cells(n, k) = "" Then
.Cells(n, k) = Replace(gesamt(3), "# ", "") 'nummer (ohne Prefix "# ")
.Cells(n, k + 1) = gesamt(1) 'name
.Cells(n, k + 5) = Replace(gesamt(2), " Pax", "")  'pax (ohne Suffix " Pax")
Else
GoTo weiter
End If
weiter:
Next n
End With
End If
Next i
End With
UserForm1.Hide
End Sub
Viele Grüsse nach Bad Kissingen
Yal
Anzeige
AW: Daten aus Listbox in Worksheet eintragen
09.09.2021 11:28:12
Sleepyhead
Hallo Yal,
erstmal vielen Dank für deine Mühe und verzeih meinen "Spaghetti-Code" :D
Ich habe einfach die Funktionen verwendet von denen ich sicher wusste, wie sie funktionieren und diese halbwegs kombiniert.
Du hast vollkommen recht mit deiner Vermutung, die Liste wird gebraucht um täglich die Anzahl der Personen, welche gleichzeitig im Restaurant sein werden zu begrenzen, Danke Corona...
Aktuell wird diese Liste per Hand geführt und nimmt somit pro Gast gut und gerne 10 Minuten ein.
Da ich bisher noch nie mit Pivottabelle gearbeitet habe werde ich mich da mal reinlesen und schauen was ich basteln kann, sonst hätte ich vermutlich einfach ein Sheet gebastelt über das die tägliche Auslastung angezeigt wird. Dort hätte ich dann auch die Eingabemaske hingebaut.
Es kommen jetzt noch die Funktionen "Drucken" "Reservierung ändern" und "externe Gäste" hinzu.
Vielen Dank für deine Hilfe, und falls ich wieder Hilfe brauche, dann werde ich das in einem weiteren Thread hier anfragen.
MfG
Sleepyhead
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige