Personaldatent Userform
#1
Hallo liebes Forum,

ich bin neu hier und habe mich angemeldet, da ich mit einem Fehler verzweifel.
Ich habe viele Beiträge im Internet gefunden, aber keinen der mir konkret weiterhelfen konnte.

Erstmal zu dem was ich hier mit VBA Programmiere:

Es gibt eine UserForm

in der sind Comboboxen für:
Nachname
Vorname
3LC
Personalnummer
Postfach
Postfachschlüssel

Des Weiteren eine TextBox für: 
Abteilung

Der Code den ich bis jetzt geschrieben habe aktiviert beim Betätigen dieser Comboboxen die Funktion .find in einem Tabellenblatt.

Soweit funktioniert der Code auch. Allerdings, wenn ich mehrere Durchläufe mache, dann kommt der Fehler:

Laufzeitfehler '1004'
Anwendungs- oder objektdefinierter Fehler

Ich habe den Verdacht, dass passiert nur, wenn die Mitarbeiterstammdatentabelle länger ist. Habe ich da nur 20 Daten drinne stehen passiert es nicht, stehen dort allerdings 500 Daten, dann passiert es.

Wenn ich über die NachnameComboBox den Wert ändere, also suche, dann erscheint der Fehler bei folgender Zeile:

Set gefunden = Mitarbeiterstammdaten.Range(NameSpalte & ErsteMitarbeiterstammdatenZeile & ":" & NameSpalte & TabellenendePersonaldaten).Find(PersonaldatenForm.NachnameComboBox)

Ich schicke euch mal Teile meines Quellcodes:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Public Mitarbeiterstammdaten As Worksheet                          ' globales Datenblatt
Public StammdatenblattName As String                                 ' globale Variable
Public TabellenendePersonaldaten As Integer
Public ErsteMitarbeiterstammdatenZeile As Byte

Public PersonalnummerSpalte As String
Public VornameSpalte As String
Public NameSpalte As String
Public LCSpalte As String
Public AbteilungSpalte As String
Public PostFachnummerSpalte As String
Public PostFachschlüsselnummerSpalte As String

Public PersonalnummerSpaltenNummer As Byte
Public VornameSpaltenNummer As Byte
Public NameSpaltenNummer As Byte
Public LCSpaltenNummer As Byte
Public AbteilungSpaltenNummer As Byte
Public PostFachnummerSpaltenNummer As Byte
Public PostFachschlüsselnummerSpaltenNummer As Byte

Public gefunden As Object

Sub globaleVariablen()

'############################################################################
'#                                                                                                                                                                           #
'#          bitte die Datenblätter an die eigenen Wünsche anpassen                                                                                 #
'#                                                                                                                                                                           #
'############################################################################
   
    StammdatenblattName = "Mitarbeiterstammdaten"                             ' Name des Mitarbeiterstammdatenblattes
   
    Set Mitarbeiterstammdaten = Worksheets(StammdatenblattName)       ' Arbeitsblatt für alle Personaldaten
    ErsteMitarbeiterstammdatenZeile = 4                                               ' erste Zeile in der Mitarbeiterdaten stehen
   
    PersonalnummerSpalte = "A"                                                         ' Spalte in der die Personalnummer steht
    VornameSpalte = "B"                                                                     ' Spalte in der der Vorname steht
    NameSpalte = "C"                                                                         ' Spalte in der der Nachname steht
    LCSpalte = "D"                                                                             ' Spalte in der der 3LC steht
    AbteilungSpalte = "E"                                                                   ' Spalte in der die Abteilung steht
    PostFachnummerSpalte = "F"                                                       ' Spalte in der die Postfachnummer steht
    PostFachschlüsselnummerSpalte = "G"                                           ' Spalte in der die Postfachschlüsselnummer steht
   
    PersonalnummerSpaltenNummer = 0                                             ' Spaltennummer begonnen mit 0, da es in einer Suchfunktion genutzt wird
    VornameSpaltenNummer = 1                                                       ' in der die Entfernung zur Personalnummernspalte gezählt wird
    NameSpaltenNummer = 2
    LCSpaltenNummer = 3
    AbteilungSpaltenNummer = 4
    PostFachnummerSpaltenNummer = 5
    PostFachschlüsselnummerSpaltenNummer = 6
   
End Sub

Sub Quellen()

Call globaleVariablen                                              ' die globalen Variablen werden gezogen

    ' in der folgenden Funktion wird die länge der Tabelle im Personaldatenblatt definiert
    TabellenendePersonaldaten = Mitarbeiterstammdaten.Cells(Rows.Count, 1).End(xlUp).Row

    ' der Inhalt der PersonalnummerComboBox wird aud dem Personaldatenblatt importiert
    PersonaldatenForm.PersonalnummerComboBox.RowSource = StammdatenblattName & "!" & PersonalnummerSpalte & ErsteMitarbeiterstammdatenZeile & ":" & PersonalnummerSpalte & TabellenendePersonaldaten

    ' der Inhalt der VornameComboBox wird aud dem Personaldatenblatt importiert
    PersonaldatenForm.VornameComboBox.RowSource = StammdatenblattName & "!" & VornameSpalte & ErsteMitarbeiterstammdatenZeile & ":" & VornameSpalte & TabellenendePersonaldaten

    ' der Inhalt der NachnameComboBox wird aud dem Personaldatenblatt importiert
    PersonaldatenForm.NachnameComboBox.RowSource = StammdatenblattName & "!" & NameSpalte & ErsteMitarbeiterstammdatenZeile & ":" & NameSpalte & TabellenendePersonaldaten
   
    ' der Inhalt der DreilettercodeComboBox wird aud dem Personaldatenblatt importiert
    PersonaldatenForm.DreilettercodeComboBox.RowSource = StammdatenblattName & "!" & LCSpalte & ErsteMitarbeiterstammdatenZeile & ":" & LCSpalte & TabellenendePersonaldaten
     
    ' der Inhalt der PostfachComboBox wird aud dem Personaldatenblatt importiert
    PersonaldatenForm.PostfachComboBox.RowSource = StammdatenblattName & "!" & PostFachnummerSpalte & ErsteMitarbeiterstammdatenZeile & ":" & PostFachnummerSpalte & TabellenendePersonaldaten
   
    ' der Inhalt der PostfachschlüsselComboBox wird aud dem Personaldatenblatt importiert
    PersonaldatenForm.PostfachschlüsselComboBox.RowSource = StammdatenblattName & "!" & PostFachschlüsselnummerSpalte & ErsteMitarbeiterstammdatenZeile & ":" & PostFachschlüsselnummerSpalte & TabellenendePersonaldaten

End Sub

Sub Personalnummer()

    ' die Änderung in der PersonalnummerComboBox wird in die anderen Textboxen übertragen
    Set gefunden = Mitarbeiterstammdaten.Range(PersonalnummerSpalte & ErsteMitarbeiterstammdatenZeile & ":" & PersonalnummerSpalte & TabellenendePersonaldaten).Find(PersonaldatenForm.PersonalnummerComboBox)
   
        If Not gefunden Is Nothing Then                                                                                    ' Wenn ein Wert gefunden wird, dann:
                                                                                                                            ' Die Personaldaten werden vom Personaldatenblatt
                                                                                                                            ' in die UserForm geschrieben
                                                                                       
            'PersonaldatenForm.PersonalnummerComboBox = gefunden.Offset(0, PersonalnummerSpaltenNummer).Value              ' Personalnummer von hier aus zählt die 0
            PersonaldatenForm.VornameComboBox = gefunden.Offset(0, VornameSpaltenNummer).Value                              ' Vorname
            PersonaldatenForm.NachnameComboBox = gefunden.Offset(0, NameSpaltenNummer).Value                                ' Nachname
            PersonaldatenForm.DreilettercodeComboBox = gefunden.Offset(0, LCSpaltenNummer).Value                            ' 3LC
            PersonaldatenForm.AbteilungTextBox = gefunden.Offset(0, AbteilungSpaltenNummer).Value                          ' Abteilung
            PersonaldatenForm.PostfachComboBox = gefunden.Offset(0, PostFachnummerSpaltenNummer).Value                      ' Postfachnummer
            PersonaldatenForm.PostfachschlüsselComboBox = gefunden.Offset(0, PostFachschlüsselnummerSpaltenNummer).Value    ' Postfachschlüssel
           
            'PersonaldatenForm.ErhaltenPFTextBox = gefunden.Offset(0, 6).Value                                              ' Postfachschlüssel erhalten am
            'PersonaldatenForm.ZurueckPFTextBox = gefunden.Offset(0, 7).Value                                                ' Postfachschlüssel zurück am
           
           
        End If
       
        If PersonaldatenForm.PersonalnummerComboBox.Value = "" Then                                                        ' Wenn die PersonalnummerComboBox leer ist werden alle anderen Felder auch geleert

            Call Felderleeren
           
        End If
       
End Sub

Sub Vorname()

    ' die Änderung in der VornameComboBox wird in die anderen Textboxen übertragen
    Set gefunden = Mitarbeiterstammdaten.Range(VornameSpalte & ErsteMitarbeiterstammdatenZeile & ":" & VornameSpalte & TabellenendePersonaldaten).Find(PersonaldatenForm.VornameComboBox)
   
        If Not gefunden Is Nothing Then                                                    ' Wenn ein Wert gefunden wird, dann:
                                                                                            ' Die Personaldaten werden vom Personaldatenblatt
                                                                                            ' in die UserForm geschrieben
           
            PersonaldatenForm.PersonalnummerComboBox = gefunden.Offset(0, -1).Value        ' Die Personalnummer wird eingetragen um einen Bezugspunkt für die Funktion Personalnummer zu haben.
                                                                                            ' Der erste Wert in der Klammer ist die vertikale Bewegung, der zweite Wert ist die
                                                                                            ' horizontale Bewegung und berechnet sich immer von der gewählten Zelle zur Personalnummernzelle.
               
                Call Personalnummer                                                        ' Die Funktion Personalnummer kann nun gestartet werden, da ein Nachname eingetragen wurde
               
        End If
       
        If PersonaldatenForm.VornameComboBox.Value = "" Then                                ' Wenn die VornameComboBox leer ist werden alle anderen Felder auch geleert

            Call Felderleeren
           
        End If
       
End Sub


Sub Nachname()

    ' die Änderung in der NachnameComboBox wird in die anderen Textboxen übertragen

    Set gefunden = Mitarbeiterstammdaten.Range(NameSpalte & ErsteMitarbeiterstammdatenZeile & ":" & NameSpalte & TabellenendePersonaldaten).Find(PersonaldatenForm.NachnameComboBox)

        If Not gefunden Is Nothing Then                                                    ' Wenn ein Wert gefunden wird, dann:
                                                                                            ' Die Personaldaten werden vom Personaldatenblatt
                                                                                            ' in die UserForm geschrieben
           
            PersonaldatenForm.PersonalnummerComboBox = gefunden.Offset(0, -2).Value        ' Die Personalnummer wird eingetragen um einen Bezugspunkt für die Funktion Personalnummer zu haben.
                                                                                            ' Der erste Wert in der Klammer ist die vertikale Bewegung, der zweite Wert ist die
                                                                                            ' horizontale Bewegung und berechnet sich immer von der gewählten Zelle zur Personalnummernzelle.
               
                Call Personalnummer                                                        ' Die Funktion Personalnummer kann nun gestartet werden, da ein Nachname eingetragen wurde
               
        End If
       
        If PersonaldatenForm.NachnameComboBox.Value = "" Then                              ' Wenn die NachnameComboBox leer ist werden alle anderen Felder auch geleert

            Call Felderleeren
           
        End If

End Sub

Sub Dreilettercode()

    ' die Änderung in der DreilettercodeComboBox wird in die anderen Textboxen übertragen
    Set gefunden = Mitarbeiterstammdaten.Range(LCSpalte & ErsteMitarbeiterstammdatenZeile & ":" & LCSpalte & TabellenendePersonaldaten).Find(PersonaldatenForm.DreilettercodeComboBox)
   
        If Not gefunden Is Nothing Then                                                    ' Wenn ein Wert gefunden wird, dann:
                                                                                            ' Die Personaldaten werden vom Personaldatenblatt
                                                                                            ' in die UserForm geschrieben
           
            PersonaldatenForm.PersonalnummerComboBox = gefunden.Offset(0, -3).Value        ' Die Personalnummer wird eingetragen um einen Bezugspunkt für die Funktion Personalnummer zu haben.
                                                                                            ' Der erste Wert in der Klammer ist die vertikale Bewegung, der zweite Wert ist die
                                                                                            ' horizontale Bewegung und berechnet sich immer von der gewählten Zelle zur Personalnummernzelle.
               
                Call Personalnummer                                                        ' Die Funktion Personalnummer kann nun gestartet werden, da ein Nachname eingetragen wurde
               
        End If
       
        If PersonaldatenForm.DreilettercodeComboBox.Value = "" Then                        ' Wenn die DreilettercodeComboBox leer ist werden alle anderen Felder auch geleert

            Call Felderleeren
           
        End If
       
End Sub

Sub Postfach()

    ' die Änderung in der PostfachComboBox wird in die anderen Textboxen übertragen
    Set gefunden = Mitarbeiterstammdaten.Range(PostFachnummerSpalte & ErsteMitarbeiterstammdatenZeile & ":" & PostFachnummerSpalte & TabellenendePersonaldaten).Find(PersonaldatenForm.PostfachComboBox)
   
        If Not gefunden Is Nothing Then                                                    ' Wenn ein Wert gefunden wird, dann:
                                                                                            ' Die Personaldaten werden vom Personaldatenblatt
                                                                                            ' in die UserForm geschrieben
           
            PersonaldatenForm.PersonalnummerComboBox = gefunden.Offset(0, -5).Value        ' Die Personalnummer wird eingetragen um einen Bezugspunkt für die Funktion Personalnummer zu haben.
                                                                                            ' Der erste Wert in der Klammer ist die vertikale Bewegung, der zweite Wert ist die
                                                                                            ' horizontale Bewegung und berechnet sich immer von der gewählten Zelle zur Personalnummernzelle.
               
                Call Personalnummer                                                        ' Die Funktion Personalnummer kann nun gestartet werden, da ein Nachname eingetragen wurde
               
        End If
       
        If PersonaldatenForm.PostfachComboBox.Value = "" Then                              ' Wenn die PostfachComboBox leer ist werden alle anderen Felder auch geleert

            Call Felderleeren
           
        End If
       
End Sub
Sub Postfachschluessel()

    ' die Änderung in der PersonalnummerComboBox wird in die anderen Textboxen übertragen
    Set gefunden = Mitarbeiterstammdaten.Range(PostFachschlüsselnummerSpalte & ErsteMitarbeiterstammdatenZeile & ":" & PostFachschlüsselnummerSpalte & TabellenendePersonaldaten).Find(PersonaldatenForm.PostfachschlüsselComboBox)
   
        If Not gefunden Is Nothing Then                                                    ' Wenn ein Wert gefunden wird, dann:
                                                                                            ' Die Personaldaten werden vom Personaldatenblatt
                                                                                            ' in die UserForm geschrieben
           
            PersonaldatenForm.PersonalnummerComboBox = gefunden.Offset(0, -5).Value        ' Die Personalnummer wird eingetragen um einen Bezugspunkt für die Funktion Personalnummer zu haben.
                                                                                            ' Der erste Wert in der Klammer ist die vertikale Bewegung, der zweite Wert ist die
                                                                                            ' horizontale Bewegung und berechnet sich immer von der gewählten Zelle zur Personalnummernzelle.
               
                Call Personalnummer                                                        ' Die Funktion Personalnummer kann nun gestartet werden, da ein Nachname eingetragen wurde
               
        End If
       
        If PersonaldatenForm.PostfachschlüsselComboBox.Value = "" Then                              ' Wenn die PostfachschlüsselComboBox leer ist werden alle anderen Felder auch geleert

            Call Felderleeren
           
        End If
       
End Sub


Sub Felderleeren()
           
            PersonaldatenForm.NachnameComboBox.Value = ""
            PersonaldatenForm.VornameComboBox.Value = ""                                          ' Vorname
            PersonaldatenForm.DreilettercodeComboBox.Value = ""                                  ' 3LC
            PersonaldatenForm.PersonalnummerComboBox.Value = ""                                  ' Personalnummer
            PersonaldatenForm.PostfachComboBox.Value = ""                                        ' Postfachnummer
            PersonaldatenForm.PostfachschlüsselComboBox.Value = ""                                ' Postfachschlüssel
            PersonaldatenForm.ErhaltenPFTextBox.Value = ""                                        ' Postfachschlüssel erhalten am
            PersonaldatenForm.ZurueckPFTextBox.Value = ""                                        ' Postfachschlüssel zurück am
End Sub

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Ich hoffe ihr könnt mit dem Code etwas anfangen und mir bei der Lösung des Problemes helfen.
Vielen Dank schonmal!


Angehängte Dateien
.xlsm   Testmappe.xlsm (Größe: 62,43 KB / Downloads: 8)
Top
#2
Hallo,

als erstes: Du verwendest den Datentyp Byte. Dieser kann nur ganze Zahlen von 0 bis 255 aufnehmen. Da dein Excel mehr als 255 Zeilen hat und du auch mehr als 255 Personen anlegen willst, knallt es.
Gruß Stefan
Win 10 / Office 2016
Top
#3
Hallo Stefan,

erstmal natürlich Danke für deine Antwort. Den Typ Byte verwende ich meines erachtens nur dort, wo er ausreichend ist. Es geht da um Spalten, da brauche ich nicht mehr als 255. Bei den Zeilen nutze ich Integer. Die Zeilen würden die Mitarbeiterzahl definieren. Ich habe jetzt auch mal eine Exceldatei angehängt die "in Ausschnitten" das zeigt was die Datei machen soll  Blush.

Viele Grüße!
Top
#4
Hallo,

(14.09.2020, 15:12)Digger schrieb: Den Typ Byte verwende ich meines erachtens nur dort, wo er ausreichend ist. Es geht da um Spalten, da brauche ich nicht mehr als 255. Bei den Zeilen nutze ich Integer. Die Zeilen würden die Mitarbeiterzahl definieren.

Nein. Einen Auszug aus deinem Code

(14.09.2020, 14:51)Digger schrieb: Public ErsteMitarbeiterstammdatenZeile As Byte

ErsteMitarbeiterstammdatenZeile = 4 ' erste Zeile in der Mitarbeiterdaten stehen

Integer ist übrigens für eine Tabelle auch nicht ausreichend. Und wieso hast Du so viele globale Variablen?
Gruß Stefan
Win 10 / Office 2016
Top
#5
Hallo Stefan,

mit dem Auszug hast du recht Angel . Aber der Wert (ErsteMitarbeiterstammdatenZeile) ist erstmal immer nur als 4 angedacht, daher wollte ich ihn erstmal nicht größer definieren - Wobei das den Kohl auch nicht fett macht was die Dateigröße angeht.

Die große Anzahl der globalen Variablen habe ich, damit ich später recht flexibel im Code sein kann und andere Module hinzufügen kann, die auch diese Variablen nutzen können.
Generell versuche ich viele Variablen zu nutzen, damit ich später, wenn ich etwas ändere nicht den Ganzen Quellcode ändern muss.

Generell bin ich mir alles andere als sicher, ob das was ich dort mache zielführend ist - momentan kann ich ja z.B. nur einen Müller finden, da es nicht möglich ist beide anzuzeigen, da über die .find Methode direkt der erst Match gilt. Aber dem Problem wollte ich mich später stellen. Auch eine Möglichkeit der Suche von Namen etc. ist so noch nicht möglich. 

Viele Grüße
Top
#6
Hallo,

ich habe mir deinen Code mal angeschaut, das ist ja noch komplizierter und umständlicher gemacht als ich vermutet habe  Confused
Wieso lagerst Du den Userform-Code in eine Modul aus? Wieso das komplizierter mit den Spaltennamen? Wie oft wirst Du mal die Spalte ändern müssen. Wahrscheinlich nie.

Nachtrag:

(14.09.2020, 15:35)Digger schrieb: Generell bin ich mir alles andere als sicher, ob das was ich dort mache zielführend ist - momentan kann ich ja z.B. nur einen Müller finden, da es nicht möglich ist beide anzuzeigen, da über die .find Methode direkt der erst Match gilt. Aber dem Problem wollte ich mich später stellen. Auch eine Möglichkeit der Suche von Namen etc. ist so noch nicht möglich.

Kommt darauf an, in welcher Richtung Du suchst: vor- oder rückwärts. Den zweiten, dritten oder …. Match findest Du eigentlich mit der FindNext-Methode. Einfach mal den Cursor auf setzen und die F1-Taste drücken. Da wird es dir erklärt.
Gruß Stefan
Win 10 / Office 2016
Top
#7
Hallo in die Runde,

ich glaube einen Fehler habe ich schon gefunden Idea :

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
If PersonaldatenForm.PersonalnummerComboBox.Value = "" Then                                                        ' Wenn die PersonalnummerComboBox leer ist werden alle anderen Felder auch geleert

            Call Felderleeren
           
End If

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Dieser Abschnitt darf nur beim Feld PersonalnummerComboBox stehen, da dieses sozusagen das Masterfeld ist. Wenn der Abschnitt auch bei den anderen Feldern steht werden die ja ins unendliche geleert, wenn dort kein Inhalt vorhanden ist.
Ich bekomme aber immer noch nach einigen Durchläufen den Fehler...weiß da jemand weiter Huh ?

Viele Grüße!
Top
#8
So,
ich habe mich mal weiter mit der Fehlersuche beschäftigt.

Hier habe ich auch ein paar Workarrounds versucht, ich finde aber die Lösung mit:
ComboBox und _Change
und dann If not gefunden Is Nothing Then am geschicktesten.
Leider hängt es sich hier auf, da dann das Object gefunden = Leer ist.
 
Es scheint ein Fehler aufzutreten, wenn ich größere Daten verarbeite. Ich kann dann nicht mehr auf das Blatt zugreifen. Es wirkt als ob das Blatt komplett, bis auf die Zelle "A2" eingefroren ist. Daher kann denke ich das Makro auch nicht auf die Datei zugreifen. Ich habe schon geschaut, ob da die ScrollArea der Tabellenblätter eine Rolle spielt. Das ist aber nicht so. Ich muss die Anwendung beenden und neustarten um sie wieder zum Funktionieren zu bekommen. Hat jemand von euch schonmal in dieser Hinsicht Erfahrungen gemacht? Ich bekomme im Moment auch immer den Fehler:

Laufzeitfehler-2147467259 (80004005) beim Festlegen einer Eigenschaft eines Diagramms

Ich würde mich über eine Antwort freuen!
Viele Grüße
Top
#9
Hallöchen,

Zitat:und dann If not gefunden Is Nothing Then am geschicktesten.
Leider hängt es sich hier auf, da dann das Object gefunden = Leer ist.

deswegen nimmt man hier mal ausnahmsweise Variant und nicht Object bei der Deklaration ...
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • Digger
Top
#10
Vielen Dank,

ich habe jetzt so lange daran gebastelt bis es funktioniert. Habe aber auch viele andere Dinge verändert, weiß aber nicht mehr, was genau der ausschlaggebende Fehler war. Aber deinen Tipp werde ich auf jeden Fall behalten, falls ich ein ähnliches Problem haben sollte!

Vielen Dank nochmal...
Top


Gehe zu:


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