Wir wünschen allen Forenteilnehmern ein frohes Fest und einen guten Rutsch ins neue Jahr. x

Urlaubsplaner
#1
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 ?
Antworten Top
#2
Hallo,

nachdem du schon so viel vorgearbeitet hast, wäre es sinnvoll, die Datei hier hochzuladen, dann kann man sehen, wie man helfen kann.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Antworten Top
#3

.xlsm   Urlaubsplaner.xlsm (Größe: 1,73 MB / Downloads: 19)

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.
Antworten Top
#4
Hallo,
 
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.
 
Gruß Uwe
Antworten Top
#5
Hallo Uwe,

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.
Antworten Top
#6
Zitat:Bevor ich noch mehr mühe rein stecke …
… bist du kurz nach Herber umgezogen?
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#7
Hallo RPP63,

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
Antworten Top
#8
Hallo,

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.

Gruß Uwe


Angehängte Dateien
.xlsm   Urlaubsplaner(2).xlsm (Größe: 1,73 MB / Downloads: 2)
Antworten Top
#9
Hallo,
 
ich habe mal einen Test auf meinen Laptop (Office2021) gemacht und dabei festgestellt, dass es so nicht klappt.

Änderungen für Find wäre es so:
Code:
        Set Kollege = .Columns(3).Find(ComboBoxVorundNachname.List(ComboBoxVorundNachname.ListIndex, 0), LookIn:=xlValues)

Gruß Uwe
Antworten Top
#10
Hallo Hirmthurs ,


Zitat:Hallo RPP63,


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
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste