VisualBasic VBA Benutzer Auslesen!

Learco

Ensign
Registriert
Nov. 2011
Beiträge
195
Moin moin!
Ich bin noch relativ frisch was VB und VBA angeht, deshalb brauch ich dringend eure Hilfe... :/ Folgendes: ich habe eine Excel-Tabelle, in dieser werden bereits Benutzer abgefragt, die einen können gewisse Zellen lesen die anderen wiederum nicht bzw. andere Zellen.. etc. Meine Frage ist jetzt, was ich für eine Abfrage machen muss, damit ein anderer Benutzer Vollzugriff beim Start hat, aber die anderen, die aufgelistet werden nur den ursprünglichen Teilinhalt lesen und die die gar nicht aufgelistet sind gar nichts lesen können? :o
Hier einmal der bisherige Quellcode (Aus Persontechnischen Gründen habe ich die Benutzer mit "XXX1-XXX12" gekennzeichnet der XXX1 sollte der Benutzer sein, der Vollzugriff hat):

Public Annehmer As String
Public WinUser As String

Sub Variablen()
WinUser = VBA.Environ("UserName") 'Ruft den Windows-Benutzernamen ab
Annehmer = StrConv(WinUser, vbProperCase) 'Speichert den Windowsbenutzernamen großgeschrieben
End Sub



Sub PasswortJa()
ActiveSheet.Protect Password:="carlw" 'Setzt ein Passwortschutz
End Sub

Sub PasswortNein()
ActiveSheet.Unprotect Password:="carlw" 'Hebt den Passwortschutz auf
End Sub

Sub Filter()
With ActiveWorkbook.ActiveSheet
.AutoFilterMode = False
.Range("A2:P2").AutoFilter
.Range("A2:P2").AutoFilter Field:=12, Criteria1:=Annehmer
End With 'Aktiviert den Autofilter mit dem Kriterium Annehmer in der Spalte L (12)
End Sub



Sub KeinFilter()
With ActiveWorkbook.ActiveSheet
If .FilterMode Then
.ShowAllData
End If
End With 'Hebt jegliche Filter auf
End Sub


Sub Abfrage()
If Annehmer = "XXX2" Or Annehmer = "XXX3" Or Annehmer = "XXX4" Or Annehmer = "XXX5" Or Annehmer = "XXX6" Or Annehmer = "XXX7" Or Annehmer = "XXX8" Or Annehmer = "XXX9" Or Annehmer = "XXX10" Or Annehmer = "XXX11" Or Annehmer = "XXX12" Then
Call Filter
Call PasswortJa
Else 'Abfrage, ob ein Annehmer, festmachend am Windowsnutzer, die Datei öffnet, setzt daraufhin den Filter und Passwortschutz
Call KeinFilter
End If 'Wenn kein Annehmer die Datei öffnet, soll es auch keinen Filter geben
End Sub

Sub Applikation()
Call PasswortNein
Call Variablen
Call Abfrage
'Hebt zuerst den Passwortschutz auf, holt sich die Variablen und startet dann die If-Abfrage
End Sub



Was ich vergessen habe zu ergänzen: Ich habe dieses Programm ursprünglich nicht geschrieben, sondern der vorherige Mitarbeiter, den man nicht mehr erreichen kann. :/ Ich verstehe zwar auch wie das aufgebaut ist, aber es ist halt diese eine Sache wo es stecken geblieben ist... Vielleicht hat ja auch jemand einen besseren Vorschlag wie man diese Abfrage insgesamt machen kann :) Vielen Dank für eure Hilfe :)

Lg,
Learco
 
Zuletzt bearbeitet:
hi,
kannst du mal eine Beispieldatei hochladen?

Ich zB. verstehe grad nicht, was du mit Abfrage(im Zusammenhang mit Excel) genau meinst.

Außerdem ist es von Vorteil wenn du hier den Entsprechend postest, das macht es lesbarer.
Weiterhin, ka. ob dus im Code gemacht hast oder nicht, ist das entsprechende einrücken von Funktionen.

Zb. so:

Code:
Public Annehmer As String
Public WinUser As String
Code:
Sub Variablen()
WinUser = VBA.Environ("UserName") 'Ruft den Windows-Benutzernamen ab
Annehmer = StrConv(WinUser, vbProperCase) 'Speichert den Windowsbenutzernamen großgeschrieben
End Sub
Code:
Sub PasswortJa()
ActiveSheet.Protect Password:="carlw" 'Setzt ein Passwortschutz
End Sub

Sub PasswortNein()
ActiveSheet.Unprotect Password:="carlw" 'Hebt den Passwortschutz auf
End Sub
Code:
Sub Filter()
With ActiveWorkbook.ActiveSheet
.AutoFilterMode = False
.Range("A2:P2").AutoFilter
.Range("A2:P2").AutoFilter Field:=12, Criteria1:=Annehmer
End With 'Aktiviert den Autofilter mit dem Kriterium Annehmer in der Spalte L (12)
End Sub


Sub KeinFilter()
With ActiveWorkbook.ActiveSheet
If .FilterMode Then
.ShowAllData
End If
End With 'Hebt jegliche Filter auf
End Sub

Code:
Sub Abfrage()
If Annehmer = "XXX2" Or Annehmer = "XXX3" Or Annehmer = "XXX4" Or Annehmer = "XXX5" Or Annehmer = "XXX6" Or Annehmer = "XXX7" Or Annehmer = "XXX8" Or Annehmer = "XXX9" Or Annehmer = "XXX10" Or Annehmer = "XXX11" Or Annehmer = "XXX12" Then
Call Filter
Call PasswortJa
Else 'Abfrage, ob ein Annehmer, festmachend am Windowsnutzer, die Datei öffnet, setzt daraufhin den Filter und Passwortschutz
Call KeinFilter
End If 'Wenn kein Annehmer die Datei öffnet, soll es auch keinen Filter geben
End Sub
Code:
Sub Applikation()
Call PasswortNein
Call Variablen
Call Abfrage
'Hebt zuerst den Passwortschutz auf, holt sich die Variablen und startet dann die If-Abfrage
End Sub

Paar verbesserungen vom Code:

in Sub Abfrage statt If Funktion eine Select case Funktion: (inkl. ungarischer Notation!Wichtig!, Einrücken)
Code:
Select Case strAnnehmer
  Case "XXX2","XXX3","XXX4", ... ,"XXX12"
    Call Filter
    Call PasswordJa
  Case Else 'Abfrage, ob ein Annehmer, festmachend am Windowsnutzer, die Datei öffnet, setzt daraufhin den Filter und Passwortschutz
    Call KeinFilter
End Select 'Wenn kein Annehmer die Datei öffnet, soll es auch keinen Filter geben

Bei der Ungarischen Notation wird vor die Variable der Datentyp als Abkürzung geschrieben zB:
lng Long
str String
dbl Double
var Variant
dat Date
...
Sinn des ganzen ist, dass man den Datentyp schon direkt anhand der Variablenbezeichnung sieht.
http://de.wikipedia.org/wiki/Ungarische_Notation
 
Zuletzt bearbeitet:
Also der Ablauf sollte so sein:
1. Man öffnet das Programm
2. Die erste Abfrage entscheidet, ob man Rechte zum Bearbeiten bekommt d.h. es muss Benutzer XXX1 sein, der die Schreibrechte bekommt.
3. Die nächste Abfrage wäre, ob das einer der anderen XXX-User wäre (sprich XXX2-XXX12), wenn das keiner dieser ist darf der das Programm nicht mal lesen oder es schließt sich einfach wieder.
4. Die nächste Abfrage wäre, je nach XXX2-XXX12 User darf einer nur eine Art von Spalten sehen, diese sind mit seinem Namen schon versehen müssen also nach diesem gefiltert werden, also wenn irgendwo dort XXX2 steht, darf das nur XXX2 lesen, der rest wird raus gefiltert.

XXX1 darf aber alles lesen und bearbeiten...

Die Sache dabei ist die, dass ich von VBA und VB so gut wie gar keine Ahnung habe ^.^' Ich hab jetzt auch die If-Abfrage mit dem Case ersetzt und auf einmal lässt sich das ganze nicht mehr kompilieren :/
 
Erstmal vorweg:
Eine Abfrage, wird vor allem bei Datenbanken (bsp. SQL-Abfrage) eingesetzt, und kommt so in Excel nicht vor. Ich vermute als Abfrage meinst du die If- bzw. Select Case-Funktion, also eine Fallunterscheidung.

Mach nen anderen Aufbau:
Die erste Prozedur unter DieseArbeitsmappe als Workbook_Open Prozdeur und setzt die Abfrage gleich mit rein, also so:
Code:
Private Sub Workbook_Open()
  Dim strWinUser As String
  Dim strAnnehmer As String

  strWinUser = VBA.Environ("UserName") 'Ruft den Windows-Benutzernamen ab
  strAnnehmer = StrConv(strWinUser, vbProperCase) 'Speichert den Windowsbenutzernamen großgeschrieben
  
  Select Case strAnnehmer
    Case "XXX1", "XXX2", "XXX3" ' Die dürfen dieses und jenes
      'Dieses
      'Jenes
    Case "XXX4", "XXX5" ' Die dürfen das Andere
      'Das Andere
    Case "XXX6" 'Darf Nur Das
      'Nur Das
    Case Else 'Der Rest darf Alles
      'Alles
  End Select
End Sub

Hat sich bei mir Compilieren lassen, was kam denn bei dir für ein Fehler?

Die Globalen Variablen fallen hier weg. (Ich persönlich mag se nicht so :D)

Dafür musst du sie Allerdings den anderen Subs als Parameter übergeben:
Code:
Sub Filter(ByVal strBeliebigerName as String)
  With ActiveWorkbook.ActiveSheet
    .AutoFilterMode = False
    .Range("A2:P2").AutoFilter
    .Range("A2:P2").AutoFilter Field:=12, Criteria1:=strBeliebigerName
  End With 'Aktiviert den Autofilter mit dem Kriterium Annehmer in der Spalte L (12)
End Sub

Aufruf mit:
Code:
Call Filter(strAnnehmer)
 
Zuletzt bearbeitet:
Bei mir kommt das Problem, dass da dann steht, dass KeinFilter() ein mehrdeutiger Name ist^^

Könntest du mir vielleicht deinen gesamten Quelltext in korrekter Reinfolge reinschreiben, damit ich das nachvollziehen kann :o :)

Und ich sags mal so... in dem Fall müssten es ja 3 Case Fälle geben. Der erste: ob das einer der Aufgelisteten XXX1-XXX12 user ist, wenn ja, dann lesbar, wenn nein, dann schließen

Der 2. Wäre dann: ob das User XXX2-XXX12 wäre, denn diese können nur den Teil der Tabelle sehen, wo ihr Name in einer Zelle hinterlegt ist. Diese können nichts Editieren

Der 3. Wäre dann: ob das User XXX1, der alles lesen und Editieren kann.

Wie wäre dann die Case abfrage denn dann aufgebaut? :o (Irgendwie voll die peinlichen Fragen zu VBA, aber ich hab das erst vor ner Woche angefangen zu lernen und mein Chef hat mich ganz dringend gebeten das zu beheben, weil das der vorherige Programmierer nicht bedacht hat^^)
 
Zuletzt bearbeitet:
Mehrdeutiger Name sieht für mich jetzt so aus als ob er die Prozedur/Variable KeinFilter mehrfach findet. Wenn du zB. 2x eine Prozedur mit gleichem Namen im gleichen Modul hast, dann weiß er natürlich nicht welches er bei einem Call Befehl aufrufen soll.

Ich glaub auch du hast ein kleinen Logikfehler oder ich ein Verständnisproblem:
Wenn der User zwischen 1 und 12 Liegt (ich lass XXX mal weg) dann darf er prinzipiell erstmal lesen, ansonsten wird das Programm geschlossen?
Wenn der User dann 1 ist, dann darf er Alles, wenn er 2-12 ist dann darf er nur lesen?

Prinzipiell kannst du das ähnlich lösen wie von mir Unten geschrieben, in einer Select-Case (If geht auch, ist aber unübersichtlicher):
Fall 1: User ist 1
Fall 2: User ist 2-12
Fall Sonst: Schließen

Alternativ kannst du natürlich die Funktionen ineinander Verschachteln.
 
Also ich bin jetzt so weit, dass beim Case 2-12 nur angezeigt wird. Wie soll ich denn jetzt den Befehl zu dem User "1" dazu schreiben, sodass dieser das sowohl editieren kann als auch alles lesen kann?

Code:
Sub Abfrage()
Select Case strAnnehmer
  Case "1"
  Call Filter
  Call PasswordJa
  Case Else
  Case "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"
    Call Filter
    Call PasswordJa
  Case Else 'Abfrage, ob ein Annehmer, festmachend am Windowsnutzer, die Datei öffnet, setzt daraufhin den Filter und Passwortschutz
    Call KeinFilter
End Select 'Wenn kein Annehmer die Datei öffnet, soll es auch keinen Filter geben
End Sub


Was genau muss ich daran denn jetzt verändern, dass am Anfang da entschieden wird ob man das Editieren darf? (Hoffentlich bis dahin alles richtig gemacht :D

Was mir dazu noch auffällt ist: wäre das dann nicht so, dass der Benutzer "1" nicht alles was die Tabelle hat sehen würde? Also wie müsste ich das denn verändern, sodass der Benutzer 1 alles sieht?

Argh :D Ich mag VBA und VB nicht :D Ich bleib nach dem Programm bei Java für mich fühlt es sich so an, als ob ich als Engländer ohne Japanischkenntnisse versuchen würde Japanisch zu reden (Joke :D Wäre ich auch nicht so in Zeitdruck würde ich in Ruhe das alles auch selbst irgendwann lösen können :/)
 
Zuletzt bearbeitet:
Also die Select-Case Passt so denk ich.
Zum Thema Editieren wäre die Frage wie dein Excel jetzt genau aufgebaut ist.
 
Meinst du, wie die Tabelle aufgebaut ist? Oder wie meinst du das?
 
Genau das, mit einer Beispieldatei würde sich denk ich alles klären lassen.
 
Also bevor das jetzt verschollen geht :D
Das ist jetzt zwar nicht die eleganteste Lösung, aber es funktioniert :)
Für die Nachwelt einmal die Lösung - Vielen Dank noch mal an die Hilfe, war echt super :)

Code:
    Public Annehmer As String
    Public WinUser As String

Code:
    Sub Variablen()
        WinUser = VBA.Environ("UserName") 'Ruft den Windows-Benutzernamen ab
        Annehmer = StrConv(WinUser, vbProperCase) 'Speichert den Windowsbenutzernamen großgeschrieben
    End Sub

Code:
    Sub PasswortJa()
        ActiveSheet.Protect Password:="carlw" 'Setzt ein Passwortschutz
    End Sub

Code:
    Sub PasswortNein()
        ActiveSheet.Unprotect Password:="carlw" 'Hebt den Passwortschutz auf
    End Sub

Code:
    Sub Filter()
        With ActiveWorkbook.ActiveSheet
            .AutoFilterMode = False
            .Range("A2:P2").AutoFilter
            .Range("A2:P2").AutoFilter Field:=12, Criteria1:=Annehmer
    End With 'Aktiviert den Autofilter mit dem Kriterium Annehmer in der Spalte L (12)
    End Sub

Code:
    Sub KeinFilter()
        With ActiveWorkbook.ActiveSheet
            If .FilterMode Then
                .ShowAllData
            End If
        End With 'Hebt jegliche Filter auf
    End Sub

Code:
    Sub Abfrage()
        If WinUser = "XXX1" Then
        KeinFilter
        Call PasswortNein
        Else
            Select Case strAnnehmer
                Case "XXX2", "XXX3", "XXX4", "XXX5", "XXX6", "XXX7", "XXX8", "XXX9", "XXX10", "XXX11", "XXX12"
                Call Filter
                Call PasswortJa
                Case Else 'Abfrage, ob ein Annehmer, festmachend am Windowsnutzer, die Datei öffnet, setzt daraufhin den Filter und Passwortschutz
                Call Filter
            End Select 'Wenn kein Annehmer die Datei öffnet, soll es auch keinen Filter geben
        End If
    End Sub

Code:
   Sub Applikation()
        Call PasswortNein
        Call Variablen
        Call Abfrage 'Hebt zuerst den Passwortschutz auf, holt sich die Variablen und startet dann die If-Abfrage
    End Sub
 
Ein Problem fällt mir da schon noch ein :/ Wenn ich jetzt für 2-12 und den Rest das Dokument mit Blattschutz versehen möchte, wie mache ich das dann am Besten? Mir ist ja schon eingefallen, dass man das in die Case Abfrage einfügen könnte, aber als ich das Passwort gesetzt habe kam da ein Debugging-Fehler und dieser Sprang dann beim Sub PasswortNein() raus... :/ Wie umgehe ich das bzw. was kann ich machen, dass der Blattschutz bei 2-12 gesetzt ist? x: ich hab das zwar auch mit dem sub PasswortJa und PasswortNein ausprobiert, aber das funktioniert bei den einzelnen Benutzern nicht, alles andere schon... Der Blattschutz soll halt nur bei 2-12 gehen :/
Ergänzung ()

Hat sich alles geklärt ich hab die Pw Abfrage am Anfang total vergessen :'D Danke für die Hilfe etc. :3 Echt super :)
 
Zuletzt bearbeitet:
Zurück
Oben