Moin Excelianer,
Excel-Dateien, die durch mehrere Nutzer abwechselnd verwendet werden, sollen durch eine Protokolldatei ( auch Excel ) ergänzt werden, die verschiedene Zellbereiche nutzerabhängig freigibt / entsperrt und aufzeichnet, wer wann welche Zelle geändert hat.
Wer hat schon ähnliches programmiert, so dass ich nicht bei Null anfangen muss?
Freundliche Grüße
Thomas
Excel-Dateien, die durch mehrere Nutzer abwechselnd verwendet
werden, sollen durch eine Protokolldatei ( auch Excel )
ergänzt werden, die verschiedene Zellbereiche nutzerabhängig
freigibt / entsperrt und aufzeichnet, wer wann welche Zelle
geändert hat.
Wer hat schon ähnliches programmiert, so dass ich nicht bei
Null anfangen muss?
Hallo Thomas,
wie soll das laufen, du hast da 10 Dateien, für jede soll dann eine extra Protokolldatei mitgestartet werden?
Geht sowieso nur mit vba. Bietet sich an, in jede Datei gleich den Code reinzuschreiben und ein versteckts Blatt „protokoll“ o.ä. anzulegen wo alles protokolliert wird.
Wobei ich da nicht weiß ob diese Aufzeichnung legal ist.
Zumindest müßten m.M. nach die user darüber informiert werden.
Jedenfalls, da Vba notwendig ist mußt du auch alle User dazu zwingen auch Vba zu aktivieren beim Dateistart.
Da hat Hajo schon was gebastelt.
(links die Punkte unter „nur mit Makros“)
Jetzt zur Protokollierung, Schau mal hier
Den Code im ersten Treffer fand ich mal, nie getestet, sieht auch so aus als ob man da viel anpassen müßte.
Im 4-ten Treffer ist lauffähiger Code von Nepumuk.
Kopiere den in das Modul „Diese Arbeitsmappe“, erselle ein Blatt „Protokoll“ in der Mappe, Schließe sie und starte sie neu.
Dann mach was du willst und schau dir dann das Blatt „protokoll“ an.
Ist es das was du willst?
Ich weiß, Nepu muß da nen schlechten Tag gehabt haben
), sind noch paar Fehler drin.
Jedenfalls, wenn diese Fehler weg sind und man diesen Code zusammen mit dem von Hajo mischt müßtest du das haben was du da willst.
Gruß
Reinhard
Excel-Dateien, die durch mehrere Nutzer abwechselnd verwendet
werden, sollen durch eine Protokolldatei ( auch Excel )
ergänzt werden, die verschiedene Zellbereiche nutzerabhängig
freigibt / entsperrt und aufzeichnet, wer wann welche Zelle
geändert hat.
Wer hat schon ähnliches programmiert, so dass ich nicht bei
Null anfangen muss?Hallo Thomas,
Hallo Reinhard,
vielen Dank für Deine Antwort. Schön, das Du da so viel Überblick hast 
wie soll das laufen, du hast da 10 Dateien, für jede soll dann
eine extra Protokolldatei mitgestartet werden?
Jein, diese Funktionalität will ich in verschiedene Anwendungen einbauen. Insgesamt möchte ich natürlich weniger Dateien haben, damit ich nicht ständig so viele Widersprüche aufklären muss, die die einzelnen Nutzer in teilweise selbstgestrickte Listen einpflegen.
Geht sowieso nur mit vba. Bietet sich an, in jede Datei gleich
den Code reinzuschreiben und ein versteckts Blatt „protokoll“
o.ä. anzulegen wo alles protokolliert wird.
Versteckt habe ich nicht gesagt ( wo denkst Du hin?.. ). Aber geschützt sollte es schon sein. Es könnte auch eine separate Datei sein.
Wobei ich da nicht weiß ob diese Aufzeichnung legal ist.
Zumindest müßten m.M. nach die user darüber informiert werden.
Werden sie.
Jedenfalls, da Vba notwendig ist mußt du auch alle User dazu
zwingen auch Vba zu aktivieren beim Dateistart.
Ist sowieso bei den meisten meiner Rechenblätter notwendig.
Da hat Hajo schon was gebastelt.
Das ist gut. Schaue ich mir gleich ´mal an.
(links die Punkte unter „nur mit Makros“)
Jetzt zur Protokollierung, Schau mal hier
Den Code im ersten Treffer fand ich mal, nie getestet, sieht
auch so aus als ob man da viel anpassen müßte.
Besser als ganz neu anzufangen wird es wohl sein…
Im 4-ten Treffer ist lauffähiger Code von Nepumuk.
Kopiere den in das Modul „Diese Arbeitsmappe“, erselle ein
Blatt „Protokoll“ in der Mappe, Schließe sie und starte sie
neu.
Dann mach was du willst und schau dir dann das Blatt
„protokoll“ an.
Ist es das was du willst?
Werde ich ausprobieren.
Ich weiß, Nepu muß da nen schlechten Tag gehabt haben
),
sind noch paar Fehler drin.
Da solltest Du ´mal die Produkte meiner „guten“ Tage sehen 
Jedenfalls, wenn diese Fehler weg sind und man diesen Code
zusammen mit dem von Hajo mischt müßtest du das haben was du
da willst.
Ich werde mir Mühe geben 
Gruß
Reinhard
Gruß zurück
Thomas
Hallo Thomas,
vielen Dank für Deine Antwort. Schön, das Du da so viel
Überblick hast
ja, so eine protokollierung bringt nur was wenn sie wasserdicht ist.
Das ist insgesamt aufwendig, alle Einzelschritte sind aber recht einfach und logisch aufeinander aufgebaut.
In der Summe gibt das dann schon längere Codes um alles abzudecken.
Das beginnt schon damit daß zur protokollierung Vba gehört, ergo muß man verhindern daß User Vba deaktivieren.
Vba hat nun eingebaut einige hilfreiche automatisch reagierende Ereignisprozeduren die auf Ereignisse reagieren, wie z.B. Zellenwechsel oder Änderung des Zellinhaltes.
Dies kann man nutzen um dadurch den Vorher/Nacher Inhalt einer Zelle zu protokollieren.
Dazu muß man halt jedes Mal wenn der user eine Zelle (Zellenbereich) markiert sich die Inhalte merken, wird nun da der Inhalt geändert, so schreibt man den Vorher und nachherwert in die protokolldatei, dazu halt noch Zelladresse, datum/Uhrzeit Username.
Fallstricke gibt es da noch zuhauf.
Wenn du wie gesagt, in eine neue Zelle gehst oder in dieser zelle etwas änderst kriegt Vba davon Wind und kann das auswerten.
Leider gibt es Dinge, die kriegt Vba nicht mit. Zum Bleistift, wenn du eine Zeile oder mehrere löschst oder einfügst.
Oder Zellen färbst oder, oder.
Und dann dafür eine nahezu 100 %ige Lösung zu finden wird dann noch mal aufwendiger.
Ist wie bei Schornsteinfiltern eines Firmenschornsteins, 90% Dreck zuhalten kostet 1 Mio, 95% aufhalten 10 Mio, 98% aufhalten 100 Mio…
Aber keine Panik, halten wir den Ball flach, ich hab quasi nur sinniert 
Mit Blattschutz kann man schon mal das Zeilenentfernen unterbinden usw.
Geht sowieso nur mit vba. Bietet sich an, in jede Datei gleich
den Code reinzuschreiben und ein versteckts Blatt „protokoll“
o.ä. anzulegen wo alles protokolliert wird.
Versteckt habe ich nicht gesagt ( wo denkst Du hin?.. )
Ich würde sie „verstecken“, dann spielt da keiner rum.
. Aber
geschützt sollte es schon sein. Es könnte auch eine separate
Datei sein.
Seperate Datei ist unklug, dann muß der User immer zwei Mappen aufrufen, oder in den jeweiligen Mappen steht ein Vba-Code der dies tut, da sind wir schon wieder beim Thema Makros aktivieren.
Wobei ich da nicht weiß ob diese Aufzeichnung legal ist.
Zumindest müßten m.M. nach die user darüber informiert werden.Werden sie.
*grins* Logisch, hätte ich jetzt auch gesagt *gg*
Jedenfalls, da Vba notwendig ist mußt du auch alle User dazu
zwingen auch Vba zu aktivieren beim Dateistart.Ist sowieso bei den meisten meiner Rechenblätter notwendig.
Das ist gut, dann sinds die User ja gewöhnt. Ich krieg mit daß halt User sich denken, makros? kenne ich nicht, will ich nicht, lieber erst nicht aktivieren.
Was ja korrekt ist, mache ich ja auch, was ich nicht kenne, erstmal weg damit.
Den Code im ersten Treffer fand ich mal, nie getestet, sieht
auch so aus als ob man da viel anpassen müßte.Besser als ganz neu anzufangen wird es wohl sein…
Ansichtssache, liegt auch am jeweiligen Code.
Ich weiß, Nepu muß da nen schlechten Tag gehabt haben
),
sind noch paar Fehler drin.Da solltest Du ´mal die Produkte meiner „guten“ Tage sehen
Stell dein Licht nicht unter den Scheffel.
Ich werde mir Mühe geben
Das wirste auch müssen, keine Sorge *grins*
Anscheinend willst du das durchziehen, okay, ich schau mal ob ich den Code von Nepumuk in richtige Bahnen lenken kann.
(da ich ne faule Socke bin frag ich ihn wahrscheinlich selbst wenn er mir in einem anderen Forum über die Füße latscht *hihi*)
Gruß
Reinhard
Hallo,
ich habe das mal relativ wasserdicht durchgezogen - naja, für Durchschnittsnutzer wasserdicht halt 
Es gibt ein schreibgeschütztes Protokollblatt. Mappenschutz und Blattschutz sind auf allen Blättern aktiviert und die änderbaren Zellen entsperrt, alle andere gesperrt. Jeder User muss eingeloggt sein (Test über Application.Username) oder sich mit einem individuellen Passwort identifizieren, das aus seinem eingegebenen Namen errechnet wird, falls lokal auf einem Nicht-Firmenrechner gearbeitet wird (Test über Application.OrganizationName). Vor jedem Schließen wird automatisch gespeichert und alle relevanten Tabellen verborgen (very hidden). Beim Öffnen werden diese nur dann wieder eingeblendet, wenn Makros aktiviert sind.
Die Auswertung/Protokollierung selbst geht dann mit WS_Change und Co.
Wobei jeder Vorgang ein automatisches vorheriges Entsperren des Protokollblatts erfordert und ein Sperren danach.
Das Beispiel mit dem Schornstein trifft den Sachverhalt recht gut: Je idiotensicherer, desto mehr Aufwand (und desto langsamer das Programm).
Gruß
smalbop
Hallo Smallbop,
ich habe das mal relativ wasserdicht durchgezogen - naja, für
Durchschnittsnutzer wasserdicht halt
Zeig mal bitte den Code, vielleicht unter einem treffenderen Betreff, dann hat das Archiv und Interessierte etwas davon.
Das Beispiel mit dem Schornstein trifft den Sachverhalt recht
gut: Je idiotensicherer, desto mehr Aufwand (und desto
langsamer das Programm).
Die Langsamkeit ist halt so, wenn ein User z.B. bei 2007 alle zellen auf einaml markiert, muß man sich halt alle Zellinhalte einzeln merken und bei 1 Million Zeilen mal 16xxx Spalten kann das dauern.
Und, um ein idiotensicheren Code zu schreinen, weia, der wird aufwendig.
„idiotensicher“ jetzt und überhaupt auch nicht negativ gemeint.
Ein Code, der weltweit jderzeit in jedem Excel laufen soll, der ist echt nicht einfach.
Es gibt Sprachprobleme, ist es Windows oder Mac, usw. Tastaturprobleme, siehe Schweiz oder gar China, Japan, aber noch anderes
Rainer aus dem VB-Brett hat so eine seltsame Excelversion, da fehlt „irgendwie“ einiges.
Ich nehme an er hat eine Starter-Version, schau mal hier:
Um jetzt einen Code wirklich weltweit lauffähig zu machen, mußt du natürlich exakt herausfinden was denn wohl MS mit reduzierter Version meint und alles andere auch abprüfen.
Damit verglichen ist das eigentliche Codeprogrammieren recht einfach, relativ gesehen 
Gruß
einhard
Nepumuks Code
Hallo Reinhard,
meintest Du diesen Code von Nepumuk?
Private Declare Function GetUserName Lib „advapi32.dll“ Alias „GetUserNameA“ (ByVal lpBuffer As String, nSize As Long) As Long
Dim Username As String
Private Sub Workbook_Open()
Dim Buffer As String * 100, BuffLen As Long
BuffLen = 100
GetUserName Buffer, BuffLen
Username = Left(Buffer, BuffLen)
Username = Left(Username, InStr(Username, vbNullChar) - 1)
’ Username = Left(Username, InStr(Username, Chr(0)) - 1)
If Trim$(Username) = „“ Then Username = Application.Username
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim intSpalte As Integer, lngZeile As Long, strBuchstabe1 As String, strBuchstabe2 As String
Dim varArray_neu As Variant, varArray_alt As Variant, intArrayspalte As Integer, strAdresse As String
Dim lngArrayzeile As Long, lngLetzteZeile As Long, varAlt As Variant, varNeu As Variant
Dim strBenutzer As String
If Sh.Name „Protokoll“ Then
If Target.Count > 1 Then varArray_neu = Range(Target.Address) Else varNeu = Target
strAdresse = Selection.Address
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
If Target.Count > 1 Then
varArray_alt = Range(Target.Address)
With Worksheets(„Protokoll“)
For intSpalte = Target.Column To Target.Column + Target.Columns.Count - 1
intArrayspalte = intArrayspalte + 1
lngArrayzeile = 0
For lngZeile = Target.Row To Target.Row + Target.Rows.Count - 1
lngArrayzeile = lngArrayzeile + 1
If varArray_neu(lngArrayzeile, intArrayspalte) varArray_alt(lngArrayzeile, intArrayspalte) Then
lngLetzteZeile = .Cells(65536, 1).End(xlUp).Row + 1
If lngLetzteZeile = 65536 Then
lngLetzteZeile = 2
.Range(„A2:E65536“).ClearContents
End If
.Cells(lngLetzteZeile, 1) = Now
.Cells(lngLetzteZeile, 2) = varArray_alt(lngArrayzeile, intArrayspalte)
.Cells(lngLetzteZeile, 3) = varArray_neu(lngArrayzeile, intArrayspalte)
.Cells(lngLetzteZeile, 4) = Cells(lngZeile, intSpalte).Address(0, 0)
.Cells(lngLetzteZeile, 5) = Sh.Name
.Cells(lngLetzteZeile, 6) = Username
End If
Next
Next
End With
Else
varAlt = Range(Target.Address)
With Worksheets(„Protokoll“)
lngLetzteZeile = .Cells(65536, 1).End(xlUp).Row + 1
If lngLetzteZeile = 65536 Then
lngLetzteZeile = 2
.Range(„A2:E65536“).ClearContents
End If
.Cells(lngLetzteZeile, 1) = Now
.Cells(lngLetzteZeile, 2) = varAlt
.Cells(lngLetzteZeile, 3) = varNeu
.Cells(lngLetzteZeile, 4) = Target.Address(False, False)
.Cells(lngLetzteZeile, 5) = Sh.Name
.Cells(lngLetzteZeile, 6) = Username
End With
End If
Range(strAdresse).Select
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
End If
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Areas.Count > 1 Then
MsgBox „Auswahl nicht zulässig.“, 48, „Hinweis“
Application.EnableEvents = False
Range(Target.Address).Cells(1, 1).Select
Application.EnableEvents = True
End If
End Sub
Als 4. Treffer wurde bei mir irgendetwas mit Gewichtsüberwachung ausgeworfen. Ich hoffe aber, jetzt das Richtige gefunden zu haben und werde gleich testen.
Gruß
Thomas
Hallo Reinhard
ich habe das mal relativ wasserdicht durchgezogen - naja, für
Durchschnittsnutzer wasserdicht haltZeig mal bitte den Code, vielleicht unter einem treffenderen
Betreff, dann hat das Archiv und Interessierte etwas davon.
Viel zu umfangreich, außerdem eben vertraulich…
smalbop
Schade
Viel zu umfangreich, außerdem eben vertraulich…
smalbop
Hallo smalbop,
das ist recht bedauerlich.
Der Code von Nepumuk sieht zwar recht komfortabel aus ( andere Codes haben nur ein fünftel an Code …)
Das Problem ist, dass das Meiste davon bei mir nicht richtig läuft.
Ich habe es zwar inzwischen geschafft, den alten Wert der geänderten Zelle zu erfassen, aber die ganze Protokollierung funktioniert ( bei mir ) nur bei Bearbeitung einzelner Zellen. Sobald ich einen Zellenbereich markiert habe wird es nichts, obwohl das wohl irgendwie versucht wurde zu lösen.
Freundliche Grüße
Thomas
Hallo Thomas
Ich habe es zwar inzwischen geschafft, den alten Wert der
geänderten Zelle zu erfassen, aber die ganze Protokollierung
funktioniert ( bei mir ) nur bei Bearbeitung einzelner Zellen.
Sobald ich einen Zellenbereich markiert habe wird es nichts,
obwohl das wohl irgendwie versucht wurde zu lösen.
Genau das ist der große Schritt, bei dem es anfängt knifflig zu werden.
Im Grunde muss man doch wohl einen Bereich (Target) Zelle für Zelle durchgehen (For each Zelle in Target…usw.). Das wäre wohl noch einigermaßen leicht zu lösen, wenn man nicht auch die alten (bereits gelöschten) Zellinhalte mit protokollieren müsste.
Wie sieht das Pflichtenheft diesbezüglich bei dir aus?
Eventuell wäre eine Methode, ein verborgenes temporäres Blatt anzulegen, in das beim Öffnen und bei jedem Aufruf eines neuen Worksheets alle Zellinhalte des jeweils aktiven Blatts kopiert werden. Bei jeder geänderten Zelle des gerade aktiven Blatts sind auf diese Weise den alten Wert bis zur Protokollierung gespeichert. Erst danach ist der neue Zellwert auch in das temp. Blatt zu übertragen.
Gruß
smalbop
Pflichtenheft
Hi,
Wie sieht das Pflichtenheft diesbezüglich bei dir aus?
Vorweg noch einmal: Es geht nicht um eine bestimmte Datei, deren Veränderungen ich protokollieren will. Vielmehr soll diese Funktionalität in verschiedenen Rechenblättern eingesetzt werden, die ich für unsere Mitarbeiter schon erstellt habe und noch erstellen werde.
Im Grunde genommen könnte ich die Bearbeitung von mehrzelligen Bereichen ausschließen. Das wird auch kaum genutzt. Eher, dass man eine Zeile komplett kopiert und dann verändert.
Dann hat man eben nicht mehr die volle Excel-Funktionalität…
Insbesondere möchte ich das Löschen von Datensätzen ( Zeilen ) in den meisten Fällen unterbinden oder zumindest überwachen.
Eine kleine Schwierigkeit ist wohl auch, dass es sich vielfach um Blätter handelt, in die ich standardmäßig eine komfortable Sortierfunktion eingebunden habe, so dass ich Schlüsselfelder mitprotokollieren muss, um überhaupt feststellen zu können, welcher Datensatz da gerade verändert worden ist. Das ist aber wohl hinzukriegen.
Eventuell wäre eine Methode, ein verborgenes temporäres Blatt
anzulegen, in das beim Öffnen und bei jedem Aufruf eines neuen
Worksheets alle Zellinhalte des jeweils aktiven Blatts kopiert
werden. Bei jeder geänderten Zelle des gerade aktiven Blatts
sind auf diese Weise den alten Wert bis zur Protokollierung
gespeichert. Erst danach ist der neue Zellwert auch in das
temp. Blatt zu übertragen.
Die Tabellen sind teilweise so groß, dass sie an älteren Rechnern nur noch mit viel Geduld zu bearbeiten sind. Daher möchte ich eher die Protokollierung in eine andere Datei schreiben als so große Datenmengen zusätzlich zu erzeugen.
Das Beste wäre für die Datenbank-Listen sicherlich eine Umsetzung in Access oder so. Darin habe ich allerdings keine Erfahrung und auch nur geringes Interesse, noch einmal ganz neu einzusteigen :-S
Eine Besonderheit, die ich noch einbauen möchte:
Userabhängiges Sperren/Entsperren von bestimmten Spalten. Dürfte aber auch kein Problem sein.
Ja, Alles nicht so wahnsinnig schwierig, aber in Summe mit anderen Aufgaben doch ´ne ganze Menge 
Freundliche Grüße
Thomas
Hallo
Im Grunde genommen könnte ich die Bearbeitung von mehrzelligen
Bereichen ausschließen.
Das wäre mit einem Selection_Change-Makro einfach möglich, indem der gewählte Bereich immer auf die erste Zelle zusammenschnurrt.
Insbesondere möchte ich das Löschen von Datensätzen ( Zeilen )
in den meisten Fällen unterbinden oder zumindest überwachen.
Das unterbinden geht immer noch am einfachsten mit Blattschutz nebst Passwort.
Eine kleine Schwierigkeit ist wohl auch, dass es sich vielfach
um Blätter handelt, in die ich standardmäßig eine komfortable
Sortierfunktion eingebunden habe, so dass ich Schlüsselfelder
mitprotokollieren muss, um überhaupt feststellen zu können,
welcher Datensatz da gerade verändert worden ist. Das ist aber
wohl hinzukriegen.
Ja. Einfach den momentanen Inhalt der Tabellenköpfe mitnehmen.
Die Tabellen sind teilweise so groß, dass sie an älteren
Rechnern nur noch mit viel Geduld zu bearbeiten sind. Daher
möchte ich eher die Protokollierung in eine andere Datei
schreiben als so große Datenmengen zusätzlich zu erzeugen.
Das läuft dann nur, wenn die Dateien beide geöffnet sind.
Das Beste wäre für die Datenbank-Listen sicherlich eine
Umsetzung in Access oder so. Darin habe ich allerdings keine
Erfahrung und auch nur geringes Interesse, noch einmal ganz
neu einzusteigen :-S
Würde ich auch abraten. Erstens ist Access anders als Excel nicht in kurzer Zeit soweit zu lernen, dass man damit wirklich arbeiten kann, zweitens protokollieren Datenbanken grundsätzlich nichts.
Eine Besonderheit, die ich noch einbauen möchte:
Userabhängiges Sperren/Entsperren von bestimmten Spalten.
Dürfte aber auch kein Problem sein.
Nein, wenn man mit Passwörtern arbeitet oder Application.UserName verwenden kann.
Ja, Alles nicht so wahnsinnig schwierig, aber in Summe mit
anderen Aufgaben doch ´ne ganze Menge
Das ist das Kreuz mit dem Programmieren durch Nicht-Programmierer, ja.
Gruß
smalbop
Hallo Falken,
Im Grunde genommen könnte ich die Bearbeitung von mehrzelligen
Bereichen ausschließen. Das wird auch kaum genutzt.
schon, wenn aber doch, was soll dann geschehen?
Eher, dass
man eine Zeile komplett kopiert und dann verändert.
?
Dann hat man eben nicht mehr die volle Excel-Funktionalität…
??
Insbesondere möchte ich das Löschen von Datensätzen ( Zeilen )
in den meisten Fällen unterbinden oder zumindest überwachen.
Überwachen st schwierig bis unmöglich. Unterbinden ist möglich, man deaktiviert alle Excelmöglichkeiten Zeilen zu löschen oder einzufügen, dito für Spalten.
Eine kleine Schwierigkeit ist wohl auch, dass es sich vielfach
um Blätter handelt, in die ich standardmäßig eine komfortable
Sortierfunktion eingebunden habe,
Sagt mir nix, ist das Vba? Zeige den Code bitte. In Excel kann ich mir das grad nicht vorstellen.
so dass ich Schlüsselfelder
mitprotokollieren muss, um überhaupt feststellen zu können,
welcher Datensatz da gerade verändert worden ist. Das ist aber
wohl hinzukriegen.
Wenn jede manuelle Zellenwertänderung protokolliert wird ist wurscht wie vorher sortiert wurde *glaub*
Eventuell wäre eine Methode, ein verborgenes temporäres Blatt
anzulegen, in das beim Öffnen und bei jedem Aufruf eines neuen
Worksheets alle Zellinhalte des jeweils aktiven Blatts kopiert
werden. Bei jeder geänderten Zelle des gerade aktiven Blatts
sind auf diese Weise den alten Wert bis zur Protokollierung
gespeichert. Erst danach ist der neue Zellwert auch in das
temp. Blatt zu übertragen.
Ist ein Ansatz von mehreren. DEN goldenen Ansatz wird es nicht geben, aber vielleicht den besten für deinen Wunsch.
Dazu fehlen aber noch Infos. Um wieviele Zellen die ein user so pro Tag ändert handelt es sich denn?
Hämmern die da täglich stundenlang irgendwelche Werte in zellen, oder eher wenige daten?
U.v.m. ist mir unklar.
Die Tabellen sind teilweise so groß, dass sie an älteren
Rechnern nur noch mit viel Geduld zu bearbeiten sind.
Das ist blöd und erzeugt logischerweise Frust der Benutzer:frowning:
Kann man aber ohne kenntnis der Datei nicht aus der Ferne lösen.
Daher
möchte ich eher die Protokollierung in eine andere Datei
schreiben als so große Datenmengen zusätzlich zu erzeugen.
Okay, ich würde eine txt-datei vorschlagen.
Das Beste wäre für die Datenbank-Listen sicherlich eine
Umsetzung in Access oder so. Darin habe ich allerdings keine
Erfahrung und auch nur geringes Interesse, noch einmal ganz
neu einzusteigen :-S
K.A. ob da Access hilreich/besser ist, ich kann’s nicht.
Eine Besonderheit, die ich noch einbauen möchte:
Userabhängiges Sperren/Entsperren von bestimmten Spalten.
Dürfte aber auch kein Problem sein.
Sehe ich genauso.
Ja, Alles nicht so wahnsinnig schwierig, aber in Summe mit
anderen Aufgaben doch ´ne ganze Menge
Ja, deshalb versuche ich dir mit mehr oder weniger hilfreichen Tipps zu helfen, ist mir für mich echt zu aufwendig.
Natürlich wenn du mir ein korrektes Pflichtenheft schickst mit einem dicken GEDECKTEN Scheck drin, ändert das die Sache
))
Achja, der Code von Nepumuk, ich weiß auch daß da in Spalte c und D oder was das war, die gleichen Werte stehen, das spielt aber keine Rolle erstmal, Code kann man ändern.
Ich wollte wissen, ob dir grundsätzlich reicht was da steht.
Ob dann das was da steht nicht in der jeweiligen datei steht sondern in einer wie auch immer naderen ist etwas anderes.
Noch eine Frage, deine Mitarbeiter da, wenn du denen jeweils eine .xla schickst und sagst sie sollen sie abspeichern, dann in Excel unter Extras—Add-In-manager diese xla einbinden, machen die das?
Ich frag so, bekam da schon viel mit was es für Mitarbeiter geben kann, von nicht können bis hin nicht wollen.
Gruß
Reinhard
Hallo Falken,
Hallo Reinhard,
Im Grunde genommen könnte ich die Bearbeitung von mehrzelligen
Bereichen ausschließen. Das wird auch kaum genutzt.schon, wenn aber doch, was soll dann geschehen?
„zusammenschnurren“ auf die oberste linke Zelle, wie smalbop schon schrieb und wie es auch passiert, wenn der Code von Nepumuk auf einen nicht-rechteckigen Zellenbereich trifft.
Eher, dass
man eine Zeile komplett kopiert und dann verändert.?
Macht man doch oft, um sich Arbeit zu ersparen: Ein Datensatz wird kopiert und angepasst statt ihn neu zu erstellen.
Dann hat man eben nicht mehr die volle Excel-Funktionalität…
??
Z. B. indem das Bearbeiten ( Löschen ) von Zellenblöcken verhindert wird
Insbesondere möchte ich das Löschen von Datensätzen ( Zeilen )
in den meisten Fällen unterbinden oder zumindest überwachen.Überwachen st schwierig bis unmöglich. Unterbinden ist
möglich, man deaktiviert alle Excelmöglichkeiten Zeilen zu
löschen oder einzufügen, dito für Spalten.
Das kenne ich bereits ( Blattschutz ). Aber: Kann ich so auch verhindern, dass nur der Inhalt einer Zeile gelöscht wird?
Eine kleine Schwierigkeit ist wohl auch, dass es sich vielfach
um Blätter handelt, in die ich standardmäßig eine komfortable
Sortierfunktion eingebunden habe,Sagt mir nix, ist das Vba? Zeige den Code bitte. In Excel kann
ich mir das grad nicht vorstellen.
Klar, gerne:
Sub sortieren_nach_aktueller_Spalte()
’ Überschriften NUR OBERHALB Zeile 9!!!
lr = ActiveCell.SpecialCells(xlLastCell).Row
lc = ActiveCell.SpecialCells(xlLastCell).Column
ar = ActiveCell.Row
ac = ActiveCell.Column
Cells.Select
Selection.EntireColumn.Hidden = False
Selection.EntireRow.Hidden = False
Range(Cells(8, 1), Cells(lr, lc)).Select
ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add Key:=Range( _
Cells(9, ac), Cells(lr, ac)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortTextAsNumbers
With ActiveWorkbook.ActiveSheet.Sort
.SetRange Range(Cells(8, 1), Cells(lr, lc))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Cells(ar, ac).Select
End Sub
so dass ich Schlüsselfelder
mitprotokollieren muss, um überhaupt feststellen zu können,
welcher Datensatz da gerade verändert worden ist. Das ist aber
wohl hinzukriegen.Wenn jede manuelle Zellenwertänderung protokolliert wird ist
wurscht wie vorher sortiert wurde *glaub*
Theoretisch vielleicht, aber es wird unübersichtlich. Es wäre bestimmt möglich - aber auch sehr aufwändig - die komplette Historie nachzuvollziehen, um zu ermitteln, in welcher Zeile der verfälschte Datensatz zum fraglichen Zeitpunkt gestanden hat
Eventuell wäre eine Methode, ein verborgenes temporäres Blatt
anzulegen, in das beim Öffnen und bei jedem Aufruf eines neuen
Worksheets alle Zellinhalte des jeweils aktiven Blatts kopiert
werden. Bei jeder geänderten Zelle des gerade aktiven Blatts
sind auf diese Weise den alten Wert bis zur Protokollierung
gespeichert. Erst danach ist der neue Zellwert auch in das
temp. Blatt zu übertragen.Ist ein Ansatz von mehreren. DEN goldenen Ansatz wird es nicht
geben, aber vielleicht den besten für deinen Wunsch.
Das klingt schon ´mal gut 
Dazu fehlen aber noch Infos. Um wieviele Zellen die ein user
so pro Tag ändert handelt es sich denn?
Hämmern die da täglich stundenlang irgendwelche Werte in
zellen, oder eher wenige daten?
Wir haben hier einen mittelständischen Fahrzeugbaubetrieb. Die Produktion von Daten ist nicht unser Hauptgeschäft 
Für den einzelnen Mitarbeiter ist das Einpflegen von Daten jeweils auch nur eine von vielen Tätigkeiten. Daher muss man schon einige Abstriche machen. Deshalb versuche ich auch, die Datenlisten mit einer einfachen und einheitlichen Oberfläche auszustatten, die die „Eingewöhnungsphase“ verkürzt.
U.v.m. ist mir unklar.
Da würde ich gerne zur Klärung beitragen …
Die Tabellen sind teilweise so groß, dass sie an älteren
Rechnern nur noch mit viel Geduld zu bearbeiten sind.Das ist blöd und erzeugt logischerweise Frust der Benutzer:frowning:
Genau.
Kann man aber ohne kenntnis der Datei nicht aus der Ferne
lösen.Daher
möchte ich eher die Protokollierung in eine andere Datei
schreiben als so große Datenmengen zusätzlich zu erzeugen.Okay, ich würde eine txt-datei vorschlagen.
Ja, die belastet natürlich den Rechner nicht so. Andererseits ist die schlechter zu filtern / sortieren als ein Excel-Sheet. Aber könnte man ja bei Bedarf wieder importieren.
Das Beste wäre für die Datenbank-Listen sicherlich eine
Umsetzung in Access oder so. Darin habe ich allerdings keine
Erfahrung und auch nur geringes Interesse, noch einmal ganz
neu einzusteigen :-SK.A. ob da Access hilreich/besser ist, ich kann’s nicht.
Kriege ich jedenfalls manchmal zu hören, wenn es um die Bearbeitung von Datenlisten per Excel geht. Ich kanns auch nicht. Und die nicht vorhandene Protokollierung spricht auch eher gegen Access 
Eine Besonderheit, die ich noch einbauen möchte:
Userabhängiges Sperren/Entsperren von bestimmten Spalten.
Dürfte aber auch kein Problem sein.Sehe ich genauso.
Ja, Alles nicht so wahnsinnig schwierig, aber in Summe mit
anderen Aufgaben doch ´ne ganze MengeJa, deshalb versuche ich dir mit mehr oder weniger hilfreichen
Tipps zu helfen, ist mir für mich echt zu aufwendig.
??
Natürlich wenn du mir ein korrektes Pflichtenheft schickst mit
einem dicken GEDECKTEN Scheck drin, ändert das die Sache))
Unsere Schecks sind i m m e r recht dünn ( 80 g/qm ). Aber man kann über Alles reden 
Achja, der Code von Nepumuk, ich weiß auch daß da in Spalte c
und D oder was das war, die gleichen Werte stehen, das spielt
aber keine Rolle erstmal, Code kann man ändern.
Bereits erledigt. Ich glaube, der Patch stammt sogar von Dir:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
’ Diese Zeile sichert lediglich VOR einer Änderung den bisherigen Wert der Zielzelle
’ da nach der Änderung (wenn Sub Worksheet_Change() aufgerufen wird, siehe oben) der alte Wert nicht mehr zur Protokollierung
’ zur Verfügung steht
alterWert = Target ’ Wert sichern, wenn neue Zelle selektiert wird. Ersatz für ein „Before_Change“ Ereignis.
…
Ich wollte wissen, ob dir grundsätzlich reicht was da steht.
Ist schon ganz o.k. Ich werde vielleicht in manchen Dateien zusätzlich die ersten 30 Spalten der bearbeiteten Zeile oder so pauschal mitkopieren ( erleichtert die Wiederherstellung - muss aber nicht sein, weil wir auch sowas wie eine Datensicherung betreiben ). Das ginge aus Speichergründen aber nur, wenn die Protokolldatei trotzdem rel. klein bleibt. Das könnte man z. B. so regeln, dass pro „Sitzung“ eine numerierte (Text-)Datei erzeugt wird.
Ob dann das was da steht nicht in der jeweiligen datei steht
sondern in einer wie auch immer naderen ist etwas anderes.
Genau das meinte ich. — Irgendwie habe ich bei der Beantwortung hier jetzt einen oder zwei Beiträge übersprungen …?
Noch eine Frage, deine Mitarbeiter da, wenn du denen jeweils
eine .xla schickst und sagst sie sollen sie abspeichern, dann
in Excel unter Extras—Add-In-manager diese xla einbinden,
machen die das?
Das mache ich sicherheitshalber lieber selber. Sind ja nur 5 Arbeitsplätze, die das betrifft.
Ich frag so, bekam da schon viel mit was es für Mitarbeiter
geben kann, von nicht können bis hin nicht wollen.
Eben. Oder: Noch keine Zeit gehabt … vergessen …
Gruß
Reinhard
Vielen Dank für Deine Mühe und Hilfe sowie
herzliche Grüße
Thomas
Moin smalbop,
vielen Dank für Deine Antwort.
Im Grunde genommen könnte ich die Bearbeitung von mehrzelligen
Bereichen ausschließen.Das wäre mit einem Selection_Change-Makro einfach möglich,
indem der gewählte Bereich immer auf die erste Zelle
zusammenschnurrt.
So, dass nur noch die oberste linke Zelle ausgewählt ist? Das wäre wohl ganz sinnvoll.
Insbesondere möchte ich das Löschen von Datensätzen ( Zeilen )
in den meisten Fällen unterbinden oder zumindest überwachen.Das unterbinden geht immer noch am einfachsten mit Blattschutz
nebst Passwort.
Das Löschen ganzer Zeilen auf jeden Fall. Aber kann man auch das Löschen „nur“ des Inhaltes von ganzen Zeilen verhindern?
…
Erstens ist Access anders als Excel
nicht in kurzer Zeit soweit zu lernen, dass man damit wirklich
arbeiten kann, zweitens protokollieren Datenbanken
grundsätzlich nichts.
-) Sehr interessant. Meistens wird einem ja sofort Access angeraten, wenn man sich mit datenbankähnlichen Listen beschäftigt.
Userabhängiges Sperren/Entsperren von bestimmten Spalten.
Dürfte aber auch kein Problem sein.Nein, wenn man mit Passwörtern arbeitet oder
Application.UserName verwenden kann.
Klappt bereits. Der ( mein ) Username wird mitprotokolliert - meistens. Da muss ich noch forschen, warum das dann manchmal einfach aufhört 
…
Das ist das Kreuz mit dem Programmieren durch
Nicht-Programmierer, ja.
Gut gesagt. Nützt aber nix. Da muss man durch 
Freundliche Grüße
Thomas