Anzeige
Archiv - Navigation
1356to1360
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Anmeldename mit Tabelle vergleichen

Anmeldename mit Tabelle vergleichen
14.04.2014 14:48:22
Peter
Hallo Forum,
mein Name ist Peter und ich bin IT-Systemadmin und absoluter VBA-Neuling.
Mein erstes VBA-Projekt ist eine Excelmappe mit min. zwei Worksheets.
Ein Formular (Tabellenblatt, nicht die Form) über das Berechtigungen aktiviert werden (Freigabe durch Klick eines Kontrollkästchen, wenn User = Mitglied Personal)
Einfacher, abgespeckter Testaufbau:
2 Worksheets: Formular und Personal
- Auf Worksheet Formular befindet sich ein Kontrollkästchen mit dem Namen CB_Freigabe der die Zelle A1 bei Freigabe von Rot auf Grün schalten soll und ansonsten wieder auf Rot zurückstellt.
- Auf Worksheet Personal befindet sich 1 Tabelle mit Tabellenname=tbl_AnPL und Bereichsname für Spalte1=AnPL (Hier stehen die zu berechtigten User drin)
Gewünschtes Vorgehen mit der Mappe wie folgt:
Beim Öffnen wird über Environ("Username“) der Anmeldename ausgelesen. Befindet sich dieser in AnPL, wird das Kontrollkästchen (CB_Freigabe) enabled, ansonsten disabled.
User in Tabelle=Berechtigt --> Kontrollkästchen enabled, .Value=True Zelle A1 wird Grün. Bei .Value=False wieder Rot.
User nicht in Tabelle=Nicht berechtigt --> Kontrollkästchen disabled
Das war es eigentlich schon. Leider ist der ausgelesene Anmeldename bei mir egal wer sich anmeldet immer berechtigt, ob er in der zu überprüfenden Tabelle steht oder nicht?! Da stehen nur test1, test2, test3… drin. Diese bekomme ich auch nacheinander mit
MsgBox "Mitglieder der Gruppe Personal:= " & rngAnPL
Next rngAnPL
angezeigt, aber nicht verglichen.
Das habe ich gemacht: (Kommentare sind nur für Neulinge, also für mich ;-) )
Option Explicit
Private Sub Workbook_Open()
'Alle Variablen setzen!!!
Dim AN As String 'AN = Anmeldename
Dim rngAnPL As Range
AN = Environ("Username")
'Anzeige des angemeldeten User zur Kontrolle
MsgBox "Dein Anmeldenme ist " & AN
'''** Alle Werte aus dem Bereichsnamen "anPL" auslesen
For Each rngAnPL In Range("AnPL")
MsgBox "Mitglieder der Gruppe Personal:= " & rngAnPL
Next rngAnPL
If AN = "rngAnPL" Then
Formular.CB_Freigabe.Enabled = True
Else
Formular.CB_Freigabe.Enabled = False
End If
End Sub

Code hinter dem Worksheet Formular:
Private Sub CB_Freigabe_Click()
If CB_Freigabe.Value = True Then
Formular.Range("A1").Interior.ColorIndex = 4 '4=grün, 6=gelb, 3=rot
Else
Formular.Range("A1").Interior.ColorIndex = 3 '4=grün, 6=gelb, 3=rot
End If
End Sub

So, dass war's! Übrigens, wenn ich AN einen festen Wert zuteile wie (test), dann funktioniert alles wie es soll. Also funktioniert "nur" der Vergleich Username mit User in Tabelle nicht.
Ich danke Euch im Voraus schon mal für Eure Bemühungen.
Gruß, Peter

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Anmeldename mit Tabelle vergleichen
14.04.2014 14:57:33
Rudi
Hallo,
Formular.CB_Freigabe.Enabled = Not IsError(Application.Match(AN, Range("AnPl"), 0))
Gruß
Rudi

AW: Anmeldename mit Tabelle vergleichen
14.04.2014 19:18:37
Peter
Hallo Rudi,
ich bin sprachlos!
Ich habe jetzt drei Tage probiert das alleine hinzubekommen. Und dann kommt 9 Min nach meinem Eintrag ein Einzeiler der auch noch funktioniert. Warum haben alle anderen so einen komplizierten Lösungsansatz? Die Aufgabenstellung den Anmeldenamen mit einer Usertabelle zu vergleichen sollte doch in Unternehmen nicht so selten sein, oder?
Jedenfalls war dies eine unheimlich schnelle und sehr übersichtliche Lösung.
Vielen Dank nochmals!
Gruß, Peter

Anzeige
AW: raus aus offen oT
14.04.2014 19:42:20
Hajo_Zi

AW: Anmeldename mit Tabelle vergleichen
14.04.2014 19:42:34
Peter
sorry, hab mich verklickt!
Frage wurde bestens beantwortet!

AW: Anmeldename mit Tabelle vergleichen
15.04.2014 11:05:53
Peter
Hallo,
leider muss ich doch nochmal an das Thema anknüpfen, da ich scheinbar eine Sache (mangels besseren Wissens) nicht beachtet hatte.
Der Befehl von Rudi funktioniert wunderbar, wenn er im Workbook(open) steht und dort die Gruppenzugehörigkeit überwachen und entsprechend aktiv werden soll. Wäre das CB_Freigabe Kontrollkästchen ständig visible=true, gäbe es wohl auch keine Probleme.
Was ich nicht bedachte, dass es wohl ein Problem darstellt, wenn das CB_Freigabe Kontrollkästchen zum Zeitpunkt des Workbook(open) selbst noch
Visible=false ist. Das wird erst durch ein aktivieren eines anderen Kontrollkästchens ausgelöst. Ich dachte nun wohl zu einfach und habe entsprechend den Befehl von Rudi ins Klickereignis des Kontrollkästchen geschrieben, der das CB_Freigabe auf visible=true stellt. Natürlich in den Anschluss.
NICHT wundern, ich habe das Formular nochmal was verändert und die Kontrollkästchen namentlich angepasst. Das ehemalige CB_Freigabe heißt nun CB.InternetMail.
Private Sub CB_InternetJA_Click() 'Ist das JA hinter Internet
If CB_InternetJA.Value = True Or _
CB_MailJA.Value = True Then
CB_InternetJA.BackStyle = fmBackStyleOpaque
CB_InternetJA.BackColor = &H80FF&
CB_InternetMail.Visible = True 'DAS ist das Problem
'        Call GruppenKontrollePL_IT
Maßnahmenformular.CB_InternetMail.Enabled = _
Not IsError(Application.Match(AN, Range("AnPl"), 0))
Else
CB_InternetJA.BackStyle = fmBackStyleTransparent
CB_InternetMail.Visible = False
CB_InternetMail.Value = False
CB_InternetMail.Enabled = False
End If
End Sub
Ich bekomme allerdings eine Fehlermeldung:
Laufzeitfehler 1004:
Die Methode "Range" für das Objekt "_Worksheet" ist Fehlgeschlagen.
Wie Ihr seht, habe ich es auch schon mal probiert über ein separates Macro zu starten…
Private Sub GruppenKontrollePL_IT()
Maßnahmenformular.CB_InternetMail.Enabled = _
Not IsError(Application.Match(AN, ActiveWorkbook.Range("AnPL"), 0))
End Sub
…dann bekomme ich aber folgende Meldung:
Laufzeitfehler 438
Objekt unterstützt diese Eigenschaft oder Methode nicht.
Kann die Gruppenprüfung nur beim Starten durchgeführt werden? Die Variablen stehen doch weiter zur Verfügung, oder?
Ich habe mal zum besseren Verständnis das Formular angehangen, damit man meine Gedanken besser nachvollziehen kann.
Userbild
Häkchen Internet schaltet Kontrollkästchen CB_InternetMail auf visible. Danach muss wohl erst die Prüfung der Gruppenzugehörigkeit AnPL geprüft werden, da wie bereits erwähnt CB_InternetMail mit Rudis Befehl in Workbook(open) nicht enabled wird, solange er auf visible=true steht.
Hoffe meine Ausführungen waren deutlich genug.
Danke für Eure Hilfe im Voraus
Gruß, Peter

Anzeige
AW: Anmeldename mit Tabelle vergleichen
16.04.2014 08:25:54
fcs
Hallo Peter,
Problem Nr. 1: Laufzeitfehler 1004 bzw. 438
wenn du innerhalb eines Tabellenblatt-Codemoduls Range oder Cells verwendest, dann beziehen sich diese immer auf das Tabellenblatt, zu dem der Code gehört - nicht auf das aktive Blatt. Dies gilt auch, wenn der Zellbereich als Name angegeben wird. Befindet sich der Zellbereich auf einem andeen Blatt, dann muss der Zellbereich inkl. Referenz zum zugehörigen Objekt (=Tabellenblatt) angegeben werden.
Bei Zellbereichen mit Namen haben sich die Entwickler von Excel leider irgendwann in der Vergangenheit entschieden, dass Namen, die allgemein in der Arbeitsmappe definiert wurden, als Referenzobjekt das Application-Objekt haben und nicht das Workbook-Objekt.
Du müsstest also in eine der folgenden Formen umschreiben, damit der Zellbereich mit den Usernamen im Blatt "Personal" korrekt angesprochen wird.

CB_InternetMail.Enabled = Not IsError(Application.Match(AN, Application.Range("AnPl"), 0))
CB_InternetMail.Enabled = Not IsError(Application.Match(AN, Personal.Range("AnPl"), 0))
CB_InternetMail.Enabled = Not IsError(Application.Match(AN, _
Worksheets("Personal").Range("AnPl"), 0))

Problem 2: Verfügbarkeit von Variablen
Wenn du die Variable AN in verschiedenen Prozeduren und Code-Modulen verwenden willst, dann muss du sie in einem allgemeinen Modul vor evtuellen Prozeduren als Public deklarieren. In den entsprechenden Prozeduren darf dann keine Dim-Anweisung für diese Variable stehen.
Die Zusweisung des Wertes muss dann vor der 1. Verwendung erfolgen. In deinem Fall dann in der Workbook_Open-Prozedur.
Dabei muss du noch beachten: Wenn der Code wegen eines Fehlers manuell beendet wird, dann werden auch die Public-Variablen auf ihren Basiswert zurückgesetzt.
Gruß
Franz

Anzeige
AW: Anmeldename mit Tabelle vergleichen
16.04.2014 12:35:50
Peter
Hallo Franz,
erst mal Danke für die gute Erklärung.
Zunächst hat es nicht funktioniert.
Dank Deiner guten Erklärung konnte ich folgendes mit Erfolg recherchieren:
Meine Variable AN stand bereits im Workbook_open.
Dim AN As String 'AnmeldeName
AN = Environ("Username")
Mit "Public AN As String" bekam ich allerdings den Fehler:
Fehler beim Kompilieren:
Ungültiges Attribut in Sub oder Function
War also offensichtlich nicht richtig wie ich das vorhatte.
Ich habe dann mal alle drei möglichen Varianten zum Test in Workbook_open
hineinkopiert, abgewandelt und mir über eine MsgBox anzeigen lassen, ob ich nun in der Gruppe bin, oder nicht. Die von Dir vermutete Tabelle Personal heißt bei mir Steuertabelle.
If Not IsError(Application.Match(AN, Application.Range("AnPL"), 0)) Then
Msgbox ("Application-Variante: Sie sind Mitglied in der Gruppe PL")
Else
Msgbox ("Application-Variante: Sie sind KEIN Mitglied der Gruppe PL")
End If
If Not IsError(Application.Match(AN, Steuertabelle.Range("AnPL"), 0)) Then
Msgbox ("Tabellen-Variante: Sie sind Mitglied in der Gruppe PL")
Else
Msgbox ("Tabellen-Variante: Sie sind KEIN Mitglied der Gruppe PL")
End If
If Not IsError(Application.Match(AN, _
Worksheets("Steuertabelle").Range("AnPL"), 0)) Then
Msgbox ("Worksheet-Tabellen-Variante: Sie sind Mitglied in der Gruppe PL")
Else
Msgbox ("Worksheet-Tabellen-Variante: Sie sind KEIN Mitglied der Gruppe PL")
End If
Hat mit allen Dreien (im Workbook_open) funktioniert und ich bekam immer die Meldung:
…. Sie sind Mitglied in der Gruppe PL
Dann habe ich das genauso in mein Klickereignis integriert und war KEIN Mitglied der Gruppe mehr! Also habe ich mir die Variable AN nochmals vorgenommen und mir einfach anzeigen lassen wie mein Name ist.
Msgbox "Dein Anmeldename ist " & AN
Und siehe da, ich hatte keinen Namen. So konnte dann natürlich auch kein Vergleich zum Bereich AnPL erfolgreich sein.
Da es bei mir ja mit dem Public und AN nicht funktioniert hat, habe ich einfach im Klickereignis nochmals die AN Variable deklariert und ab da hat es auch hier mit allen drei Versionen wie von Franz beschrieben funktioniert.
Ich hoffe, dass diese Rückmeldung auch anderen VBA-Anfängern weiterhelfen kann.
Ich bedanke mich nochmals bei meinen Helfern !
Frohes Osterfest
Gruß, Peter

Anzeige
AW: Anmeldename mit Tabelle vergleichen
16.04.2014 14:07:26
fcs
Hallo Peter,
irgendwo musst du noch die Deklaration und Anwendung der Variablen "AN" nicht korrekt umgesetzt haben. Denn grundsätzlich funktioniert es. Ich hab ich ja nicht das 1. Mal mit öffentlichen Variablen gearbeitet.
Hier eine kleine Beispieldatei.
https://www.herber.de/bbs/user/90208.xlsm
Mit Username "Admin" werden alle Blätter sichtbar, bei anderen Usern das Blatt Info (wenn Makros nicht akiv sind) oder Formular. Im VBA-Editor kannst du ggf. alle Blätter auf visible setzen. Beim Schließen der Datei werden alle Blätter außer "Info" ausgeblendet.
Gruß
Franz

Anzeige
AW: Anmeldename mit Tabelle vergleichen
17.04.2014 07:01:37
Peter
Hallo Franz,
es klappt nun alles! Ich schrieb ja bereits, dass ich irgendwo mit der AN-Variable wohl noch nicht ganz richtig unterwegs war. Das Deine Ausführungen stimmten bezweifelte ich nicht ;-)
Ich danke nochmals für die Unterstützung und nicht nur für die Lösungen, sondern vor allem für die Erklärungen. Wenn man weiß, warum man was tun muss, lernt man besser.
Gruß, Peter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige