Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA - Datum und Nutzernamen automatisch einfügen

VBA - Datum und Nutzernamen automatisch einfügen
05.01.2017 09:43:46
Mike
Hallo an das Herber-Forum.
Zunächst einmal wünsche ich ein frohes und gesundes neues Jahr 2017.
Ich habe eine kurze VBA-Frage,
Ich möchte gern in den Zellen B2 und B3 das Datum und den Benutzernamen automatisch einfügen. Im ersten Tabellenblatt sind einige Zellen, die gesperrt sind und deren Formeln nicht geändert werden sollen. Die anderen Tabellenblätter sollen nicht gesperrt werden. Ich habe es nun versucht irgendwie hinzubekommen. Leider erfolglos. Ideal wäre auch, wenn es sich einstellen ließe, dass zum entsperren der Tabelle 1 gar kein Passwort abgefragt wird.
Dies ist mein derzeitiger Ansatz:

Option Explicit
Dim WsTabelle As Worksheet
Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
WsTabelle.Unprotect ("Passwort")
Dim Benutzer As String
Benutzer = Environ("username")
With ActiveWorkbook
.Sheets(1).Range("B2").Value = Benutzer
.Sheets(1).Range("B3").Value = Date
End With
For Each WsTabelle In Sheets
WsTabelle.Protect ("Passwort")
Next WsTabelle
End Sub

Ich Erhalte den Laufzeitfehler '91':
"Objektvariable oder With-Blockvariable nicht festgelegt."
an der Stelle
"Dim WsTabelle As Worksheet"
Da ich in der Variablendeklaration von VBA noch ein blutiger Anfänger bin, würde es mich freuen, wenn mir jemand helfen könnte.

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Datum und Nutzernamen automatisch einfügen
05.01.2017 10:01:17
Klaus
Hallo
Teste mal das:
Dim Benutzer As String
Dim WsTabelle As Worksheet
Set WsTabelle = Worksheets("Tabelle1")
WsTabelle.Unprotect
Benutzer = Environ("username")
With ActiveWorkbook
.Sheets(1).Range("B2").Value = Benutzer
.Sheets(1).Range("B3").Value = Date
End With
Set WsTabelle = Nothing' Objekt freigeben
For Each WsTabelle In Sheets
WsTabelle.Protect
Next
Du musst festlegen, welches WorkSheet referenziert werden soll (Fett markiert)
Also bitte anpassen.
MfG Klaus
AW: VBA - Datum und Nutzernamen
05.01.2017 10:40:53
Mike
Dankeschön :)
So habe ich den Code jetzt in der Arbeitsmappe stehen.
Option Explicit
Dim Benutzer As String
Dim WsTabelle As Worksheet
Set WsTabelle = Worksheets("Tabelle1")
WsTabelle.Unprotect
Benutzer = Environ("username")
With ActiveWorkbook
.Sheets(1).Range("B2").Value = Benutzer
.Sheets(1).Range("B3").Value = Date
End With
Set WsTabelle = Nothing ' Objekt freigeben
For Each WsTabelle In Sheets
WsTabelle.Protect
Next
End Sub
Bei "Set WsTabelle = Worksheets("Tabelle1")"
sagt er nun "außerhalb der Prozedur ungültig". Beginnt die Prozedur nicht schon hinter dem Option explicit?
Muss ich ggf. statt "Tabelle1" "Datenblatt" angeben? So wurde das Tabellenblatt umbenannt.
Gruß
Mike
Anzeige
Dir fehlt der Prozedurkopf...
05.01.2017 10:46:03
Michael
Mike,
denn Beginnt die Prozedur nicht schon hinter dem Option explicit?
stimmt grds. aber nur wenn da auch der Beginn einer Prozedur steht...
Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
' restlicher Code
End Sub
;-)
LG
Michael
Du musst schon den Beitrag lesen, Mike
05.01.2017 10:47:54
Klaus
Hallo
Muss ich ggf. statt "Tabelle1" "Datenblatt" angeben? So wurde das Tabellenblatt umbenannt.
Im Beitrag stand doch eindeutig:
Du musst festlegen, welches WorkSheet referenziert werden soll (Fett markiert)
Also bitte anpassen!!!

Deinem Beitrag fehlt außerdem der Prozedurname
Es gibt zwar ein End Sub aber keine SUB()
MfG Klaus
Anzeige
AW: Du musst schon den Beitrag lesen, Mike
05.01.2017 12:37:42
Mike
Ok, danke für die Tipps euch allen. :)
Habe es nun mit eurer Hilfe gelöst. In der ersten Variante hat er mir zwar Datum und Nutzer ausgegeben, aber wegen der Schleife noch die anderen Tabellenblätter gesperrt. Nun ist es so wie ich es haben möchte. Nur das Datenblatt ist gesperrt. Das Entsperren geht ohne Passwort und sofern ich einmal auf Speichern klicke wird es automatisch wieder gesperrt. Sehr schön, so kann keiner "versehentlich" an den Formeln rumfummeln oder die Formatierung ändern
Option Explicit
Dim WsTabelle As Worksheet
Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Benutzer As String
Dim WsTabelle As Worksheet
Set WsTabelle = Worksheets("Datenblatt")
WsTabelle.Unprotect
Benutzer = Environ("username")
With ActiveWorkbook
.Sheets(1).Range("B2").Value = Benutzer
.Sheets(1).Range("B3").Value = Date
End With
Set WsTabelle = Worksheets("Datenblatt")
WsTabelle.Protect
End Sub
Ich lasse den Strang noch kurz offen, falls jemand eine praktikablere Lösung weiß, oder Fehler bei mir sieht.
Danke nochmal :)
Anzeige
AW: Du musst schon den Beitrag lesen, Mike
05.01.2017 13:12:43
Klaus
Hallo
Keine Ahnung warum Du es nun wieder geändert hast
Rot=Doppelt
Blau=Doppelt
Option Explicit
Dim WsTabelle As Worksheet'das gehört in die Sub, also löschen
Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Benutzer As String
Dim WsTabelle As Worksheet
Set WsTabelle = Worksheets("Datenblatt")
WsTabelle.Unprotect
Benutzer = Environ("username")
With ActiveWorkbook
.Sheets(1).Range("B2").Value = Benutzer
.Sheets(1).Range("B3").Value = Date
End With
Set WsTabelle = Worksheets("Datenblatt")'löschen, da doppelt
WsTabelle.Protect
End Sub
Du hast hier Einiges doppelt drin, warum?
MfG Klaus
Anzeige
AW: Du musst schon den Beitrag lesen, Mike
05.01.2017 13:33:31
Mike
Keine Ahnung warum Du es nun wieder geändert hast
Frag mich was Leichteres :)
Nein sorry, bin nur blind (und VBA-Einsteiger). Eine doppelte Variablendeklaration/Zuweisung macht natürlich wenig Sinn. Hab früher in Uni und Schule mal etwas mit Turbo Pascal und Fortran rumhantiert, ist aber schon ziemlich lange her und das waren auch meist Grundlagen, da fehlt mir der Blick für sowas. Habs nun korrigiert. Danke nochmal :)
was Du noch wissen solltest
05.01.2017 13:31:28
Klaus
Hallo
With ActiveWorkbook
.Sheets(1).Range("B2").Value = Benutzer
.Sheets(1).Range("B3").Value = Date
End With
Kann man so machen, sollte man aber vermeiden da es sein kann das
Sheets(1) mal an eine andere Position verschoben wird!
Übrigens ist Sheets(1) das erste Blatt von links überhaupt
Die (1) bedeutet den Index des Blattes (egal ob Tabellenblatt oder Diagramm) usw.
Stünde also ganz links z.B. ein Diagramm, käme es zu einem Fehler,
da es in einem Diagramm kein Range("B2") gibt.
Es ist also ratsam immer zu unterscheiden ob es ein Sheet, oder ein Worksheet ist.
Es ist also besser immer eine korrekte Referenz zu dem Blatt herzustellen, welches Du auch tatsächlich ansprechen möchtest.
Ist also in Deinem Bsp die Tabelle ("Datenblatt") das erste Register von links, so sprich es auch so an!
Also so:
With ThisWorkbook 'ist die Mappe die den Code enthält
.WorkSheets("Datenblatt").Range("B2").Value = Benutzer
.WorkSheets("Datenblatt").Range("B3").Value = Date
End With
Es sei denn es stünde tatsächlich immer als erstes Register in der Datei
MfG Klaus
Anzeige
AW: was Du noch wissen solltest
05.01.2017 13:45:15
Mike
Oh, danke für den nützlichen Tipp. Grundsätzlich sollte ja keiner die Blattreihenfolge ändern, aber man weiß ja nie :)
Ich habe es nun angepasst. Außerdem habe ich noch den
Benutzer = Environ("username")
in den
Benutzer = Application.UserName
abgeändert, weil er mir bei ersterem nur einen verkürtzen Nutzernamen, vermutlich den aus der Netzwerkanmeldung ausgibt. Nun schreibt er den vollen Namen hin.
Option Explicit
Dim WsTabelle As Worksheet
Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Benutzer As String
Set WsTabelle = Worksheets("Datenblatt")
WsTabelle.Unprotect
Benutzer = Application.UserName

With ThisWorkbook 'ist die Mappe die den Code enthält
.Worksheets("Datenblatt").Range("B2").Value = Benutzer
.Worksheets("Datenblatt").Range("B3").Value = Date
End With
WsTabelle.Protect
End Sub
Gruß
Mike
Anzeige
AW: was Du noch wissen solltest
05.01.2017 13:50:53
Mike
Was mir noch einfällt.
Wenn ich den Benutzer aus
Benutzer = Application.UserName

hole. Muss dieser denn vorher überhaupt noch als String deklariert werden?
Ja , owT
05.01.2017 14:28:42
Klaus
AW: VBA - Datum und Nutzernamen automatisch einfügen
05.01.2017 10:28:12
Hans
Entferne zunächst den Blattschutz auf aller Blättern (mit oder ohne VBA).

Option Explicit
Dim WsTabelle As Worksheet
Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ActiveSheet.Unprotect
Dim Benutzer As String
Benutzer = Environ("username")
With ActiveWorkbook
.Sheets(1).Range("B2").Value = Benutzer
.Sheets(1).Range("B3").Value = Date
End With
For Each WsTabelle In Sheets
WsTabelle.Protect
Next WsTabelle
End Sub

Anzeige

355 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige