VBA Endlosschleife


#1

Hey,bin gerade am lernen von VBA und soll als erstes Projekt eine Personalverwaltung mit Makros ausstatten. Das ganze soll mit einer Anmeldung versehen werden mit Registrieren. Ich hab daher versucht erstmal die Anmeldung ansich mit 2 Testdaten auszustatten, allerdings läuft das entweder auf nen Overflow oder Endlosschleife raus.

Erstmal der Code:

Private Sub einloggenButton_Click()
If benutzernameText.Value <> "" And passwortText.Value <> "" Then

Dim i As Integer
i = 1
Dim anzahl As Integer
anzahl = 0

Do While Tabelle4.Cells(i, 13).Value <> ""
    anzahl = anzahl + 1
Loop

Do While i <= anzahl
    If Tabelle4.Cells(i, 13).Value = benutzernameText.Value And Tabelle4.Cells(i, 14).Value = passwortText.Value Then
    
        MsgBox "Erfolgreich angemeldet! Herzlich Willkommen " & Tabelle4.Cells(i, 13).Value & "!"
        
        Tabelle3.Columns(1).Hidden = False
        Tabelle3.Columns(2).Hidden = False
        Tabelle3.Columns(3).Hidden = False
        Tabelle3.Columns(4).Hidden = False
        Tabelle3.Columns(5).Hidden = False
        Tabelle3.Columns(6).Hidden = False
        Tabelle3.Columns(7).Hidden = False
        Tabelle3.Columns(8).Hidden = False
        Tabelle3.Columns(9).Hidden = False
        Tabelle3.Columns(10).Hidden = False
        Tabelle3.Columns(11).Hidden = False
        Tabelle3.Columns(12).Hidden = False
        Tabelle3.Columns(13).Hidden = False
        Tabelle3.Columns(14).Hidden = False
        Tabelle3.Columns(15).Hidden = False
        Tabelle3.Columns(16).Hidden = False
        Tabelle3.Columns(17).Hidden = False
        Tabelle3.Columns(18).Hidden = False
        Tabelle3.Columns(19).Hidden = False
        
        Anmeldung.Hide
        
        Exit Do
    End If
    i = i + 1
Loop

If anzahl = i Then
    MsgBox "Benutzername oder Passwort falsch!"
End If

Else
    MsgBox "Bitte alle Felder ausfüllen!"
End If
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> 1 Then
        MsgBox "X nicht erlaubt!"
    End If
End Sub

(Die MsgBox beim x wird entfernt wenn alles läuft)

In der Tabelle 4 in Spalte 13 & 14 stehen jeweils benutzername und Passwort und ich versuche erstmal die Anzahl der gespeicherten Userdaten abzufragen und danach die Inhalte vergleichen. Aber iwie endet das Programm immer in einem “reagiert nicht mehr”… Bin schon seit 2h dadran und checks nich

Hat wer nen Rat?

Edit: Ne MsgBox bei der Anzahl hat ergeben, das das die Endlosschleife ist… aber warum?
Edit²: das i++ hat gefehlt… Keine Ahnung warum ich das dauernd übersehen hab


#2

Da du es ja jetzt scheinbar hinbekommen hast, schreibe ich jetzt auch nichts zum ursprünglichen Problem.
Eine Anmerkung habe ich jedoch. Die Zugangsdaten, die in der Tabelle4 stehen, sind durch jedermann auslesbar, der ein Entzipprogramm und einen einfachen Texteditor bedienen kann.

Deine Tabelle3.Columns(X).Hidden = False Zeilen kannst du in einer kurzen Zählschleife zusammenfassen.


#3

Ja, aber ersteres ist unwichtig, das ist nur für die Schule und danach wird das nie wieder benötigt. So genau sollen wir das nicht machen.

Zweiteres ist klar, das stammt noch aus anfangszeiten^^ Ändere ich gleich ab.

Hab aber jetz ein anderes Problem:
Ich hab eine UserForm, mit denen man die Personaldaten filtern kann. Als ich nur nach einer Spalte gleichzeitig filtern wollte klappte es wunderbar, nur nicht bei mehreren… Hier ist mein Ansatz:

Private Sub filternButton_Click()
Dim row As Integer
row = 5
Dim i As Integer
i = 1
Dim anzahl As Integer
anzahl = 0

Dim hide As Boolean
hide = False
        
Do While IsEmpty(Tabelle3.Cells(row + i, 3).Value) = False
    anzahl = anzahl + 1
    i = i + 1
Loop

i = 1
Do While i <= anzahl
    hide = False
    If IsEmpty(nummerText.Value) = False Then
        If Tabelle3.Cells(row + i, 2).Value <> nummerText.Value Then
            hide = True
        End If
    End If
    
    If IsEmpty(nameText.Value) = False Then
        If Tabelle3.Cells(row + i, 7).Value <> nameText.Value Then
            hide = True
        End If
    End If
    
    If IsEmpty(vornameText.Value) = False Then
        If Tabelle3.Cells(row + i, 8).Value <> vornameText.Value Then
            hide = True
        End If
    End If
    
    If IsEmpty(eingestelltText.Value) = False Then
        If Tabelle3.Cells(row + i, 13).Value <> eingestelltText.Value Then
            hide = True
        End If
    End If
    
    If IsEmpty(plzText.Value) = False Then
        If Tabelle3.Cells(row + i, 16).Value <> plzText.Value Then
            hide = True
        End If
    End If
    
    If IsEmpty(ortText.Value) = False Then
        If Tabelle3.Cells(row + i, 17).Value <> ortText.Value Then
            hide = True
        End If
    End If
    
    If IsEmpty(strasseText.Value) = False Then
        If Tabelle3.Cells(row + i, 18).Value <> strasseText.Value Then
            hide = True
        End If
    End If
    
    If IsEmpty(hausnummerText.Value) = False Then
        If Tabelle3.Cells(row + i, 19).Value <> hausnummerText.Value Then
            hide = True
        End If
    End If
    
    If IsEmpty(gehaltText.Value) = False Then
        If Tabelle3.Cells(row + i, 12).Value <> gehaltText.Value Then
            hide = True
        End If
    End If
    
    If IsEmpty(abtText.Value) = False Then
        If Tabelle3.Cells(row + i, 11).Value <> abtText.Value Then
            hide = True
        End If
    End If
    
    If hide = True Then
        Tabelle3.Rows(row + i).Hidden = True
    End If
    
    i = i + 1
    hide = False
Loop

End Sub

Er blendet immer ALLE Spalten aus. Durch die einzelnen ifs mit ner Variable wollte ich das lösen, warum geht das so nicht?
Zum testen kann ich euch die xlsm auch zur Verfügung stellen


#4

Lade das Dokument ruhig mal hoch. Das macht es ein wenig leichter, zu unterstützen.


#5

Personalverwaltung.zip (117,0 KB)

Hier is sie. Das Problem oben hab ich gelöst. “IsEmpty” Geht bei Textfelder einfach nich, nur Zellen.

Nur ist nun das Problem, das die Performance bei mir beim Filtern auf einmal im Keller ist?! Gestern lief alles problemlos, hab an dem Teil eig nur die Combobox eingefügt statt dem Textfeld (Vorgabe war musste Listen und Comboboxen iwo unterbringen…)

Liegt das nur an mir? Obwohl gestern gings ja noch


#6

Wir haben jetzt parallel geschrieben. Folgende Hinweise nur durch Draufschauen:

  • die zweite Schleife wäre besser eine For-Schleife
  • If-Bedingungen, die auf = False enden, schreibt man besser als If Not BEDINGUNG Then (z. B. If Not IsEmpty(nummerText.Value) Then)
  • bei If-Bedingung, die auf = True enden, lässt man das = True einfach weg (z. B. If hide Then)

#7

Ich hab an dem Teil einfach einiges ausprobiert, darum auch das = False bzw True, wollte einfach alles durchprobieren, bis ich den Fehler finde. Hab ihn nun ja auch gefunden.

Vorgabe war leider auch, das ich alle möglichen Schleifen unterbringen muss. Daher kann es gut sein, das man manche gut austauschen kann bzw sollte (z.B: die einzige while), aber es sollen halt alle vorkommen


#8

Bei mir dauert das Filtern gefühlt 2 Sekunden, was für die Anzahl Zeilen schon extrem lang ist. Excel ist, was die Performance angeht, aber sowieso schwierig. Der Quellcode sieht ok aus, es sind dort auch keine typischen Fallstricke verbaut, die die Performance negativ beeinflussen.


Da du bereits “echte” Tabellen verwendest, kannst du dich auch mit dem Excel-Objektmodell beschäftigen. Auf die Tabelle lässt sich mit Tabelle3.ListObjects("tabNamen") zugreifen. Darüber lassen sich auch echte Filter setzen:
https://msdn.microsoft.com/de-de/library/office/hh273486(v=office.14).aspx

Edit: ich habe das mit der echten Filterfunktion mal ausprobiert - das läuft ohne Performancebeeinträchtigungen und hat den positiven Nebeneffekt, dass man die Filterkriterien in der Tabelle selbst sieht und auch noch manuell anpassen kann.


#9

Sorry das ich mich so spät erst melde - hatte viel zu tun und hab privat weiter dran gearbeitet und das schon vor ner Woche abgegeben. Das Performance-Problem war dem im Endeffekt egal.

Das mit den echten Tabellen etc werd ich mir auf jedenfall mal anschauen, da es mich echt interessiert und wir auch bald ein 2. Projekt in VBA mit Datenbanken machen sollen. Danke schonmal für die Hilfe! Ich glaub aber auch, hätte ich das gleich eingebaut, hätte ich Probleme gehabt, alle Vorgaben einzubauen :smiley: Sollte ja quasi fast alles aus VBA iwo drin vorkommen, z.B. auch die formatierten Textfelder.
Hier einfach mal das Projekt nochmal hochgeladen, falls es dich interessiert, wie es am Ende aussah :slight_smile:
SW.zip (2,6 MB)