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
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.
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
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
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
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.
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 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 SW.zip (2,6 MB)