VBA - AllowEditRanges
#1
Hi Leute,

ich möchte in meiner Datei die Zugriffsberechtigungen ein wenig dynamischer gestalten. Dazu möchte ich den AllowEditRanges-Befehl nutzen. Habe mit Hilfe von Google auch ein Makro gefunden, welches schon fast alles macht, was ich möchte, aber eben nur fast. Leider finde ich zu dem VBA-Befehl im Internet nur sehr wenig, sonst hätte ich mich selbst eingelesen.


Code:
Sub neu()
   Dim ws As Worksheet, ual As UserAccessList, aer As AllowEditRange, _
     usr As UserAccess
   Set ws = ThisWorkbook.ActiveSheet
   ws.Unprotect
   Set aer = ws.Protection.AllowEditRanges.Add("Edit Range", ws.[H1:H4])
   Set usr = aer.Users.Add("Name", True)
   ws.Protect


End Sub


Zu diesem Makro hätte ich einige Fragen, die ihr mir ja vielleicht netterweise beantworten könnt :)

1. Wo bzw. wie füge ich ein Passwort für den Bereich hinzu, der mich legitimiert, obwohl ich kein berechtigter Nutzer bin?
2. Ich möchte nun nicht nur "Name" als User hinzufügen sondern mehrere Personen. Mache ich das über eine Schleife? Da in meinem Netzwerk nur ein Benutzer ist, kann ich es leider nicht testen :/
In dem Makro ist eine UserAccessList "ual" definiert. Ich finde sie jedoch nirgends im Code. Damit sind vermutlich eher Benutzergruppen innerhalb der Netzwerkstruktur gemeint?!
3. Wofür steht das true hinter dem Nutzernamen?
4. Zum Löschen der AllowEditRange funktioniert

Code:
.Protection.AllowEditRanges(1).Delete


Ich möchte jedoch eine bestimmte Löschen - zum Beispiel die mit dem Namen "Edit Range" ... ich bekomme das aber nicht hin. Kann mir da auch wer helfen?


Ich bedanke mich schon im voraus

Gruß
Top
#2
Hallo, :19:

1.
Code:
Option Explicit
Public Sub Main()
    Dim lngCount As Long
    With Tabelle1
        ' Tabellenblatt entsperren - sonst laufen Aktionen auf einen Fehler
        .Unprotect
        ' Schleife über alle Bereiche
        For lngCount = 1 To .Protection.AllowEditRanges.Count
            ' Titel im Direktfenster ausgeben
            Debug.Print .Protection.AllowEditRanges(lngCount).Title
            ' Löschen
            .Protection.AllowEditRanges(lngCount).Delete
        Next lngCount
        ' Bereich hinzufügen, Titel, Range und Passwort vergeben
        .Protection.AllowEditRanges.Add Title:="DerTitel", Range:=.Range("A1:C4"), Password:="DasPasswort"
        ' Titel im Direktfenster ausgeben
        Debug.Print .Protection.AllowEditRanges("DerTitel").Title
        ' Bestimmtes löschen
        .Protection.AllowEditRanges("DerTitel").Delete
        ' Bereich hinzufügen, Titel, Range und Passwort vergeben
        .Protection.AllowEditRanges.Add Title:="DerTitel", Range:=.Range("A1:C4"), Password:="DasPasswort"
        ' Tabellenblatt schützen - sonst nützt das alles nichts
        .Protect
    End With
End Sub

2.
Du kannst nur User hinzufügen, die in deinem System bekannt sind.

3.
Das "True" gibt den Zugriff.

4.
Siehe 1.

Link 1
Link 2
Top
#3
Hi Case, 

Danke für deine Hilfe :).
Kann ich also keinen bestimmten Bereich per Angabe mit Name löschen sondern nur die Nummer? 

In deinem Code fügst du zwei Mal den Bereich aber kein mal einen User hinzu. Geht das denn dann über eine normale Schleife, wenn ich mehrere User hinzufügen möchte? 

Einen User der in meinem system bekannt ist? Damit ist nicht gemeint einer, der sich mal an meinem Rechner angemeldet hat oder? Sondern einer der im Netzwerk bekannt ist, richtig? Und es ist der windows-anmeldename relevant und sonst nichts oder? 


Gruß
Top
#4
Hallo, :19:

ich lösche hier doch per Name: :21:

Code:
.Protection.AllowEditRanges("DerTitel").Delete

Auf einem privaten PC mit einem User gibt das hinzufügen keinen Sinn her.

Zu allem anderen - Ja. Angel

Also nicht falsch verstehen. Wenn du deinen Windows Anmeldename hinzufügst, musst du zum bearbeiten des entsprechenden Bereiches kein Passwort eingeben. Diese Feature ist aber eher im Netzwerk sinnvoll. Hier nochmal mit hinzufügen: :21:

Code:
Option Explicit
Public Sub Main()
    Dim UAL As UserAccessList
    Dim AER As AllowEditRange
    Dim USR As UserAccess
    Dim lngCount As Long
    With Tabelle1
        ' Tabellenblatt entsperren - sonst laufen Aktionen auf einen Fehler
        .Unprotect
        ' Schleife über alle Bereiche
        For lngCount = 1 To .Protection.AllowEditRanges.Count
            ' Titel im Direktfenster ausgeben
            Debug.Print .Protection.AllowEditRanges(lngCount).Title
            ' Löschen
            .Protection.AllowEditRanges(lngCount).Delete
        Next lngCount
        ' Bereich hinzufügen, Titel, Range und Passwort vergeben
        .Protection.AllowEditRanges.Add Title:="DerTitel", Range:=.Range("A1:C4"), Password:="DasPasswort"
        ' Titel im Direktfenster ausgeben
        Debug.Print .Protection.AllowEditRanges("DerTitel").Title
        ' Bestimmtes löschen
        .Protection.AllowEditRanges("DerTitel").Delete
        ' Bereich hinzufügen, Titel, Range und Passwort vergeben
        .Protection.AllowEditRanges.Add Title:="DerTitel", Range:=.Range("A1:C4"), Password:="DasPasswort"
        ' User hinzufügen
        Set AER = .Protection.AllowEditRanges("DerTitel")
        Set UAL = AER.Users
        Set USR = UAL.Add("DeinWindowsAnmeldeName", True)
        ' Tabellenblatt schützen - sonst nützt das alles nichts
        .Protect
    End With
    Set USR = Nothing
    Set UAL = Nothing
    Set AER = Nothing
End Sub

Und ja - ich füge zweimal hinzu, ich lösche ja auch raus. Einmal am Anfang per Schleife und einmal den Einzelnen. Exclamation

Der Code läuft jetzt natürlich auf einen Fehler!!! Bis du "Set USR = UAL.Add("DeinWindowsAnmeldeName", True)" richtig angepasst hast!
[-] Folgende(r) 1 Nutzer sagt Danke an Gast für diesen Beitrag:
  • EasY
Top
#5
Perfekt, damit versuche ichs! DANKE!!!
Top
#6
Hi Case, 

ich muss den Thread doch noch mal aktivieren, da mir zwei Bereiche Probleme bereiten. 

1. Beim Löschen der Alloweditrange per Schleife läuft der Code immer in einen Fehler, wenn ich das entsprechende Blatt nicht offen habe. 

2. Ich schaffe es nicht, einen zweiten Bereich in die range einzupflegen. Also die alloweditrange soll zwei Bereiche umfassen. Weder mit ; noch mit & noch mit , akzeptiert er meine Eingabe :(


Gruß und danke schonmal
Top
#7
Hallo, :19:

1.
Blatt muss aktiv sein.

2. 
Code:
.Protection.AllowEditRanges.Add Title:="DerTitel", Range:=.Range("A1:C4", "B5:C7"), Password:="DasPasswort"
Top
#8
Hossa,

1. leider nicht das, was ich hören wollte :D ... also muss ich jedes Blatt aktivieren vor dem Löschen? Ich dachte ich komme ohne select aus. Oder gibt es noch eine andere Variante?

2. Ok, da war ich wohl zu undeutlich. Bisher sieht meine Range für den Bereich so aus:


Code:
range:= .Range(Replace(ThisWorkbook.Sheets(g).Cells(1, 5).FormulaLocal, "=", ""))


In E1 steht =D1:E4 z.B.
Und nun soll da noch eine zweite Range hinzukommen, die exakt so aufgebaut ist, jedoch in einer anderen Zelle steht.

Danke und Gruß

:)
Top
#9
Hallo, :19:

1.
Mir ist keine bekannt. Wenn du eine findest, dann poste sie hier. :21:

2.
Code:
.Protection.AllowEditRanges.Add Title:="DerTitel", Range:=.Range(Replace(ThisWorkbook.Sheets(g).Cells(1, 5).Value, "=", ""), Replace(ThisWorkbook.Sheets(g).Cells(2, 5).Value, "=", "")), Password:="DasPasswort"

Gilt, wenn "Sheets(g)" ein anderes Tabellenblatt ist, sonst geht’s natürlich kürzer.
Top
#10
Mh,

ich danke dir ganz herzlich, dass du mir immer hilfst :).

Leider funktioniert das mit den zwei Bereichen nicht.

In E1 habe ich =H4:AA36 stehen,
in F1 habe ich =AF6:AJ36 stehen.

Mit dem Makro schreibt er mir eine AllowEditRange von H4:AJ36. Er scheint immer das Maximum der Zeilen/Spalten zu wählen, anstatt zwei Bereiche innerhalb einer AllowEditRange zu schreiben.

Ich befürchte, dass ich zwei voneinander getrennte AllowEditRanges schreiben muss, oder fällt dir noch etwas ein? :)


Gruß
Top


Gehe zu:


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