Registriert seit: 28.05.2017
Version(en): 365
26.10.2019, 21:46
(Dieser Beitrag wurde zuletzt bearbeitet: 26.10.2019, 21:47 von EasY.)
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ß
Registriert seit: 30.08.2014
Version(en): Office 365 - Beta 32 Bit
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
________
Servus
Case
Registriert seit: 28.05.2017
Version(en): 365
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ß
Registriert seit: 30.08.2014
Version(en): Office 365 - Beta 32 Bit
27.10.2019, 09:47
(Dieser Beitrag wurde zuletzt bearbeitet: 27.10.2019, 10:19 von Case.
Bearbeitungsgrund: Ergänzungen...
)
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.
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.
Der Code läuft jetzt natürlich auf einen Fehler!!! Bis du " Set USR = UAL.Add("DeinWindowsAnmeldeName", True)" richtig angepasst hast!
________
Servus
Case
Folgende(r) 1 Nutzer sagt Danke an Case für diesen Beitrag:1 Nutzer sagt Danke an Case für diesen Beitrag 28
• EasY
Registriert seit: 28.05.2017
Version(en): 365
Perfekt, damit versuche ichs! DANKE!!!
Registriert seit: 28.05.2017
Version(en): 365
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
Registriert seit: 30.08.2014
Version(en): Office 365 - Beta 32 Bit
Hallo, :19:
1.
Blatt muss aktiv sein.
2.
Code: .Protection.AllowEditRanges.Add Title:="DerTitel", Range:=.Range("A1:C4", "B5:C7"), Password:="DasPasswort"
________
Servus
Case
Registriert seit: 28.05.2017
Version(en): 365
29.10.2019, 20:09
(Dieser Beitrag wurde zuletzt bearbeitet: 29.10.2019, 20:09 von EasY.)
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ß
:)
Registriert seit: 30.08.2014
Version(en): Office 365 - Beta 32 Bit
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.
________
Servus
Case
Registriert seit: 28.05.2017
Version(en): 365
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ß
|