17.03.2024, 18:04 (Dieser Beitrag wurde zuletzt bearbeitet: 17.03.2024, 18:20 von Hirmthurs.)
Guten Tag zusammen,
ich suche ein wenig Hilfe für mein kleines Projekt. Ich selbst beschäftige mich seit kurzen mit VBA und es macht mir auch riesig Spaß. Daher hoffe ich hier auf Hilfe. Es geht um folgendes Möchte per UserForm Urlaub eintragen lassen.
Es geht um folgendes, ich möchte ganz gerne wenn der Name eingetragen ist und das Datum von und das Datum bis.
Beispiel UserFormNeu: Vor und Nachname : Mit Arbeiter 2 Abwesend von: 15.03.2024 Abwesend von: 19.03.2024
Abwesend Art : U
Das in der Zeile 9 bei diesem Mitarbeiter vom 15.03.2024 bis zum 19.03.2024 in diesen Bereich in den jeweiligen Zellen ein U steht. Wäre das mit einem VBA Code Machbar und kann man diese?
Des weitere würde ich dann sehr gerne im UserFormTool denn Namen auswählen und in der ListBox soll mir dann von Mitarbeiter seine ganzen Abwesenheits Zeiträume angezeigt werden. Wo man im Notfall einen der Zeiträume anklicken kann und ich diesen Bearbeiten kann in.
Beispiel UserFormBearbeiten: Vor und Nachname: Mit Arbeiter 2 Wert steht drin Abwesend von: 15.03.2024 ----->13.03.2024 Wert steht drin kann bearbeitet werden Abwesend von: 19.03.2024 Wert steht drin kann bearbeitet werden
Abwesend Art : U Wert steht drin kann bearbeitet werden
Wenn man dann auf Speichern klickt das dann in Zeile 9 des Mit Arbeiter 2 der bereich vom 13.03.2024 bis 19.03.2024 mit einem U markiert wird.
Schluss endlich mit dem Button löschen ggf den Urlaub komplett löschen ?
Wäre das mit einem Code machbar ? Vor allem mehrere bereiche bei Mit Arbeiter 2 oder 3 oder 5 zu Markieren ?
sehr gerne. Vorerst soll es halt nur für Schicht A sein. Möchte es natürlich dann auch auf Schicht B und dann mal auf Schicht C machen.
Was ich vergessen habe zu sagen. Würde sehr gerne das Kürzel der ComboBoxAbwesend dann in dem jeweiligen Bereich eintragen lassen ( von-bis)
Hoffe man kann mir dabei weiterhelfen
Und nicht erschrecken arbeite auf einen 4k Monitor. Also die Größen von denn Userformen könnten vielleicht etwas groß oder klein sein. Anpassungen werden zum Schluss gemacht.
ich hab mir jetzt mal einfach einen kurzen Blick ins Formular "BearbeitenMitarbeiter" erlaubt. Änderungen wie folgt: Die Property in ein allgemeines Modul
Code:
Private p_aktuelleZeile As Long Property Let aktuelleZeile(aktuelleZeile As Long) p_aktuelleZeile = aktuelleZeile End Property Property Get aktuelleZeile() As Long aktuelleZeile = p_aktuelleZeile End Property
ins UserForm "BearbeitenMitarbeiter":
Code:
Option Explicit Private Sub ButtonSchließen_Click() Unload Me End Sub Private Sub ButtonSchließen_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ButtonSchließen.BackColor = RGB(240, 240, 240) End Sub Private Sub ButtonSpeichern_Click() 'Prüfung ob alle felder befüllt sind If TextBoxPersonalnummer.Value = "" Or TextBoxVorname.Value = "" Or TextBoxNachname = "" Then MsgBox "Bitte füllen sie alle Felder aus!" Exit Sub
End If 'Daten ins Tabellenblatt eintragen With Tabelle5 .Cells(aktuelleZeile, 1).Value = TextBoxID.Value .Cells(aktuelleZeile, 2).Value = TextBoxPersonalnummer.Value .Cells(aktuelleZeile, 3).Value = TextBoxVorname.Value .Cells(aktuelleZeile, 4).Value = TextBoxNachname.Value .Cells(aktuelleZeile, 5).Value = ComboBoxMitarbeitergrad.Value .Cells(aktuelleZeile, 6).Value = ComboBoxBeschäftigung.Value .Cells(aktuelleZeile, 7).Value = ComboBoxSchicht.Value
End With 'UserForm schließen Unload Me End Sub Private Sub ButtonSpeichern_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ButtonSpeichern.BackColor = RGB(240, 240, 240) End Sub Private Sub UserForm_Activate() 'ComboBoxen befüllen ComboBoxBeschäftigung.List = Tabelle3.ListObjects("TblBeschäftigungsart1").DataBodyRange.Value ComboBoxSchicht.List = Tabelle3.ListObjects("TblSchicht").DataBodyRange.Value 'Daten laden With Tabelle5 TextBoxID.Value = .Cells(aktuelleZeile, 1).Value TextBoxPersonalnummer.Value = .Cells(aktuelleZeile, 2).Value TextBoxVorname.Value = .Cells(aktuelleZeile, 3).Value TextBoxNachname.Value = .Cells(aktuelleZeile, 4).Value ComboBoxMitarbeitergrad.Value = .Cells(aktuelleZeile, 5).Value ComboBoxBeschäftigung.Value = .Cells(aktuelleZeile, 6).Value ComboBoxSchicht.Value = .Cells(aktuelleZeile, 7).Value
End With End Sub Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ButtonSpeichern.BackColor = RGB(255, 255, 255) ButtonSchließen.BackColor = RGB(255, 255, 255) End Sub
und die Übergabe der Variable aktuelleZeile in UserForm "MA_Datenblatt"
Code:
aktuelleZeile = ListBox1Personal.ListIndex + 2
Das wäre der sinnvolle Weg diese Property zu verwenden.
Zu deiner Frage: Es braucht eine Zuweisung zur Schicht. Entweder via Optionbuttons oder Combobox als DropDown in der Userform. Es sei denn, die Zuordung der Schicht ist statisch. Dann könnte man dies aus Userform "UserFormUrlaub" via Steuerung des LabelsCaption auslesen oder gleich aus der Tabelle.
Da braucht es erst eine Festlegung deinerseits wie du es willst.
danke dir für deine Antwort. Klar kann man die UserFormNeu oder UserFormBearbeiten bearbeiten. Mir wäre es sogar lieber wenn man per ComboBox das jeweilige Tabellenblatt anspricht. Sprich wenn ich Urlaub eintrage das ich zwischen Schicht B und Schicht A entscheiden kann. Wen dieses natürlich klappt würde, würde ich diese Variante eher vorziehen.
P.S: Schicht B war erstmal zum Test. Schluss endlich sollen zum Schluss: Schicht A Schicht B Schicht C geben.
Nur wollte ich erstmal gucken ob mein vorhaben überhaupt möglich wäre. Bevor ich noch mehr mühe rein stecke.
danke das Sie mich von einem zum anderen Forum verlinken. Dennoch habe ich mich jeweils in einem Forum angemeldet um eine Antwort bei meinem Problem zu finden. Da es hier Leute vom Fach gibt . Daher würde ich Sie doch sehr gerne bitten, wenn Sie evtl. eine Lösung hätten mir dieses mit zu teilen und bei dem Thema zu bleiben :) Vielen Dank
markiere die Tabelle im Tabellenblatt Personal und mache mit Strg./T eine intelligente Tabelle draus.
Dann ins Modul des Formulars "UserFormNeu":
Code:
Option Explicit
Private Sub ButtonSchließen_Click() Unload Me End Sub
Private Sub ButtonSchließen_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ButtonSchließen.BackColor = RGB(240, 240, 240) End Sub
Private Sub ButtonSpeichern_Click() Dim sDatum As Variant Dim eDatum As Variant Dim Kollege As Range Dim Wks Dim i As Long Dim neueZeile As Long
If ComboBoxVorundNachname = "" Or TextBoxAbwesendvon.Value = "" Or TextBoxAbwesendbis = "" Or ComboBoxAbwesend.Value = "" Then MsgBox "Bitte füllen sie alle Felder aus!" Exit Sub End If
If ComboBoxVorundNachname.List(ComboBoxVorundNachname.ListIndex, 1) = "Schicht A" Then Set Wks = Tabelle2 If ComboBoxVorundNachname.List(ComboBoxVorundNachname.ListIndex, 1) = "Schicht B" Then Set Wks = Tabelle4 With Wks Set Kollege = .Columns(3).Find(ComboBoxVorundNachname.List(ComboBoxVorundNachname.ListIndex, 0)) If IsNumeric(TextBoxAbwesendvon) Then sDatum = Application.Match(CLng(CDate(TextBoxAbwesendvon)), .Rows(6), 0) Else MsgBox "Bitte Datum eintragen" TextBoxAbwesendvon = "" TextBoxAbwesendvon.SetFocus Exit Sub End If If IsNumeric(TextBoxAbwesendbis) Then eDatum = Application.Match(CLng(CDate(TextBoxAbwesendbis)), .Rows(6), 0) Else MsgBox "Bitte Datum eintragen" TextBoxAbwesendbis = "" TextBoxAbwesendbis.SetFocus Exit Sub End If If Not Kollege Is Nothing Then For i = sDatum To eDatum .Cells(Kollege.Row, i) = ComboBoxAbwesend Next i End If End With With Tabelle6 neueZeile = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 .Cells(neueZeile, 2).Value = ComboBoxVorundNachname.Value .Cells(neueZeile, 4).Value = TextBoxAbwesendvon.Value .Cells(neueZeile, 5).Value = TextBoxAbwesendbis.Value .Cells(neueZeile, 6).Value = ComboBoxAbwesend.Value End With Unload Me End Sub
Private Sub ButtonSpeichern_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ButtonSpeichern.BackColor = RGB(240, 240, 240) End Sub
Private Sub UserForm_Initialize() Dim arr(): arr = Tabelle5.ListObjects(1).DataBodyRange.Value arr = Application.Index(arr, Evaluate("row(1:" & UBound(arr, 1) & ")"), Array(10, 7)) 'ComboBoxen befüllen ComboBoxAbwesend.List = Tabelle3.ListObjects("TblKürzel").DataBodyRange.Value ComboBoxVorundNachname.List = arr End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ButtonSpeichern.BackColor = RGB(255, 255, 255) ButtonSchließen.BackColor = RGB(255, 255, 255) End Sub
Dann klappt es mit den Eintragen von Abwesenheiten. Da ich hier nur Office 2019 verwende, laufen die neuen Formeln aus 2021 bei mir nicht. Daher habe ich in Schicht A einige Werte zwecks Test fix gesetzt. Trage einfach die Formeln wieder ein.
danke das Sie mich von einem zum anderen Forum verlinken. Dennoch habe ich mich jeweils in einem Forum angemeldet um eine Antwort bei meinem Problem zu finden. Da es hier Leute vom Fach gibt . Daher würde ich Sie doch sehr gerne bitten, wenn Sie evtl. eine Lösung hätten mir dieses mit zu teilen und bei dem Thema zu bleiben :) Vielen Dank
1. in Foren ist es üblich, dass man sich duzt.
2. Es geht ja nicht um die Frage, ob man sich in einem Forum angemeldet hat oder nicht. Das ist in den meisten Foren ohnehin verpflichtend.
3. Auch spricht nichts dagegen, eine Frage in mehreren Foren einzustellen. Nur sollte man fairerweise darauf hinweisen, dass man seine Frage auch in anderen Foren gestellt hat, und einen Link zu den jeweiligen Beiträgen anfügen. Denn häufig wird es versäumt, überall mitzuteilen, dass die Frage beantwortet ist, wenn irgendwo eine Lösung gefunden wurde. In solch einem Fall wird dann in den anderen Foren möglicherweise noch nach Lösungen gesucht, obwohl es schon eine gibt.
Viele Grüße Klaus-Dieter Der Erfolg hat viele Väter, der Misserfolg ist ein Waisenkind Richard Cobden