Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
304to308
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
304to308
304to308
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

"Rückgängig"-Befehl per Makro erzeugen

"Rückgängig"-Befehl per Makro erzeugen
05.09.2003 12:25:44
steph@n
Hallo,

ich möchte verhindern, dass jemand aus einem Arbeitsblatt Zeilen löscht. Ich kann hierfür leider nicht mit dem Blattschutz arbeiten, da ich in dem Arbeitsblatt den Autofilter und Gruppierungen verwende, die bei eingeschaltetem Blattschutz nicht mehr funktionieren. Also wollte ich so vorgehen, dass ich irgendwie (ich weiß nicht wie) an das Worksheet_Change-Ergeignis übergeben bekomme, dass Zeilen gelöscht wurden und ich dann die "Rückgängig"-Funktion ausführe, um die gelöschten Zeilen wieder einzufügen! Das ist mein Zeil!

Hat denn jemand ein paar Wegweiser für mich, mit deren Hilfe ich mein Ziel erreichen kann (oder gibts vielleicht nen anderen Weg)?

Gruss Stephan

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 12:34:28
Otto Ecker
Hallo Stephan,

Option Explicit


Sub UndoTest()
Application.OnUndo "Eintragung löschen", ThisWorkbook.Name & "!UndoEin"
End Sub



Sub UndoEin()
Range("A1:A10").ClearContents
End Sub



Sub Eintragen()
Dim intCounter As Integer
For intCounter = 1 To 10
Cells(intCounter, 1).Value = intCounter
Next intCounter
Call UndoTest
End Sub


Gruß Otto
..ursprüngliche Frage nicht korrekt gelesen oT
05.09.2003 12:38:28
Otto Ecker
.
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 12:34:46
Matthias G
Hallo Stephan,
versuchs mal andersrum: Was darf der User denn verändern?
Im Worksheet_Change (oder Workbook_SheetChange)-Ereignis kannst du dann abfragen, was verändert wurde. Wenn erlaubt, ok, wenn nicht, "Application.Undo". Allerdings darfst du vor dem Undo im Makro keine Zellen verändern, sonst ist es nicht mehr möglich.

z.B eine Abfrage, ob eine komplette Zeile verändert (bzw. gelöscht) wurde:


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Address = Target.EntireRow.Address Then
MsgBox "komplette Zeile verändert!"
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub


Viele Grüße,
Matthias
Anzeige
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 12:46:16
steph@n
Hallo Matthias,

Danke für die Hilfe! Ich kann aber leider nicht sicher sein, dass keine Zellen verändert wurden, da das die User dürfen und sollen. Sie durfen lediglich keine Zeilen löschen!

Ich versuch aber mal mit den Hinweisen zu meinem Tread ein paar Schritte vorwärts zu kommen.

Danke Gruß Stephan
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 12:51:51
Matthias G
Hallo Stephan,
Was ist der Unterschied, wenn der User eine Zeile löscht oder nur den Inhalt aller Zellen der Zeile? Warum darf er das eine nicht, das andere schon?

Ich habe ein Dienstplanprogramm geschrieben, auch ohne Blattschutz, kenn mich deshalb mit Eingabebeschränkungen ohne Blattschutz recht gut aus.

Matthias
Anzeige
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 13:28:24
steph@n
Hallo Matthias,

ich habe einen Aktivitätenplan erstellt, in dem du verschiedene Hauptkategorien erstellen kann und unter den Hauptkategorien die Einzelaufgaben definieren kannst. Über alle Aktivitäten einer Hauptkategorie habe ich einen Gruppieren gezogen. Darüber hinaus verwende ich Formeln auf der Ebene Hauptkategorie die z.B. den Abarbeitungsgrad aller Einzelaufgaben je Hauptkategorie errechnen. Zusätzlich hast Du die Möglichkeit Aktivitäten zu Hauptkategorien hinzuzufügen. Für die Formeln und die Funktion des hinzufügens von Kategorien muss aber die letzte Aufgabenzeile einer Hauptkategorie leer sein. Darf also weder gefüllt noch gelöscht werden. (deswegen will ich das löschen einer solchen Zeile verhindern!) Da es ein Aktivitätenplan ist darf er natürlich sämtliche Zellen einer Zeile überarbeiten (z.B. Status, Abarbeitungsgrad, o.ä.).

Hoffe habe mich einigermaßen verständlich ausgedrückt!

Gruß Stephan
Anzeige
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 13:41:36
Matthias G
Hallo Stephan,
es steht und fällt alles damit, ob du diese Zeile oder Zelle, die nicht verändert werden darf, über VBA identifizieren kannst.
wenn die Zeile z.B. einen bestimmten Titel hat (in der ersten Spalte, das könnte ja auch vor Veränderung geschützt werden), oder wenn die Zeilennummern fest sind, also Tabellenkopf feste Zeilenanzahl und jede Hauptkategorie feste Zeilenanzahl.
Wenn der User Zeilen einfügen kann, geht die zweite Methode wohl nicht.

Die letzte Aufgabenzeile einer Hauptkategorie muss leer sein...
D.h., du könntest prüfen ob die nachfolgende Zeile die erste der Hauptkategorie ist...

Leider hab ich noch zu wenige Infos von Dir, um genauer helfen zu können.
Was heisst eigentlich "Über alle Aktivitäten einer Hauptkategorie habe ich einen Gruppieren gezogen."?

Gruß
Matthias
Anzeige
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 13:55:36
steph@n
Hallo Matthias,

bin gerade dabei auszutüffteln, wie ich die Zeileninformationen ermitteln kann. Dein Makro hat mich aber trotzdem schon etwas weiter gebracht, weil es die von mir gesuchten Befehle enthielt. Muss mal schauen wie ich das jetzt in mein Programm einbauen kann.

Beispiel zum Thema Gruppierung:
in Zeile 2 Steht der Name der Hauptkategorie (z.B. Reporting)
ab Zeile 3 sind die Einzelaufgaben zu dieser Kategorie aufgelistet (Reporting-Anforderungen ermitteln, Machbarkeit prüfen, Berichte kreieren/definieren)
dann habe ich die Zeilen der Einzelaufgaben mit 'Daten -> Gruppierung und Gliederung -> Gruppierung' gruppiert, so dass ich alle Einzelaufgaben ausblenden kann und nur noch die Hauptkategorien angezeigt bekomme (zwecks Übersichtlichkeit).

Gruß Stephan
Anzeige
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 14:16:03
Matthias G
Hallo Stephan,

das mit dem Gruppieren hab ich noch gar nicht gewusst... Wieder was gelernt!

Vielleicht fügst du zu noch eine Spalte ein, die in jeder Hauptkategorie-Überschrift irgendeinen festen Wert hat, den du mit WorksheetChange abfragen kannst.

Gruß,
Matthias

AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 14:22:43
steph@n
Freut mich, dass ich Dir auch noch zeigen konnte.

Werd das mal probieren!

Danke!

Gruß Stephan
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 13:39:01
GerdW
"ich in dem Arbeitsblatt den Autofilter und Gruppierungen verwende, die bei eingeschaltetem Blattschutz nicht mehr funktionieren."

Das ist nicht so siehe enableAutofilter und enableOutlining

Gerd
Anzeige
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 13:57:02
steph@n
Hallo Gerd,

wo kann ich die enable-Befehle setzen?

Gruß Stephan
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 14:13:23
Reinhard
Hi Steph@an,
die sauberste Lösung ist sicher das Zeilen löschen komplett zu deaktivieren. Im Archiv fand ich auch einen Code der genau das tun sollte, aber es klappt nicht :-(


Sub SetKontext()
With Application
.CommandBars("Cell").Controls(6).Enabled = False
.CommandBars("Column").Controls(6).Enabled = False
.CommandBars("Row").Controls(6).Enabled = False
End With
End Sub


Vielleicht muss da nur die 6 ausgetauscht werden, oder deutsche Begriffe, test halt mal rum...
Gruß
Reinhard
Anzeige
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 14:26:04
steph@n
Hallo Reinhard,

dieser Befehl deaktiviert die Schaltflächen in der Symbolleiste. Aber sicherlich nicht die Funktionen des Kontextmenüs (rechte Maustaste auf eine Zeile) mit denen ich dann die Zellen trotzdem noch löschen kann. Trotzdem vielen Dank!

Gruß Stephan
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 15:01:50
Matthias G
Hallo Stephan,
stimmt nicht, der Befehl
Application.CommandBars("Row").Controls(6).Enabled = False
deaktiviert im Zeilenkontextmenü den Eintrag "Zeilen löschen".

(Application.CommandBars("Row").Reset macht das ganze wieder rückgängig.)

Gruß,
Matthias
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 15:23:55
steph@n
aber es setzt leider nicht die Möglichkeit außer Kraft, dass ich im Kontext-Menü der Zelle den Befehl (Zelle löschen -> Ganze Zeile) ausführen kann! Ansonsten wäre das wirklich die einfachste Variante!

Gruß Stephan
Anzeige
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 16:07:22
Matthias G
Hallo Stephan,
wenn es nur das ist, was du willst:

Private Sub Workbook_Activate()
Application.CommandBars("Row").Controls(6).Enabled = False
Application.CommandBars("Column").Controls(6).Enabled = False
Application.CommandBars("Cell").Controls(6).Enabled = False
Application.CommandBars(1).Controls(2).Controls(11).Enabled = False
End Sub


Private Sub Workbook_Deactivate()
Application.CommandBars("Row").Reset
Application.CommandBars("Column").Reset
Application.CommandBars("Cell").Reset
Application.CommandBars("Worksheet Menu Bar").Reset
End Sub


Grüße!
Matthias
Anzeige
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 16:38:47
steph@n
:o)

Dem hab ich nichts mehr entgegen zu setzen! Danke!

Gruß Stephan
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 16:52:28
Matthias G
Hallo Stephan,

hier noch eine Erweiterung, die zusätzlich vor einer Veränderung der Symbolleisten schützt:

Private Sub Workbook_Activate()
Dim cBar As CommandBar
On Error Resume Next
For Each cBar In Application.CommandBars
cBar.Protection = msoBarNoCustomize
Next cBar
On Error GoTo 0
Application.CommandBars("Row").Controls(6).Enabled = False
Application.CommandBars("Column").Controls(6).Enabled = False
Application.CommandBars("Cell").Controls(6).Enabled = False
Application.CommandBars(1).Controls(2).Controls(11).Enabled = False
End Sub



Private Sub Workbook_Deactivate()
Dim cBar As CommandBar
On Error Resume Next
For Each cBar In Application.CommandBars
cBar.Protection = msoBarNoProtection
Next cBar
On Error GoTo 0
Application.CommandBars("Row").Reset
Application.CommandBars("Column").Reset
Application.CommandBars("Cell").Reset
Application.CommandBars("Worksheet Menu Bar").Reset
End Sub


Trotzdem gäbe es noch eine Möglichkeit, Zeilen zu löschen oder sonst was zu tun. Ich kämpfe im Moment mit dem gleichen Problem.
Man kann zwar die vorhandenen Symbolleisten nicht mehr verändern, aber man kann eine neue Symbolleiste erstellen und z.B. den "Zeile löschen"-Befehl dort hinsetzen.

Es kommt halt darauf an, ob du die Excel-Tabelle "nur" für DAUs schreibst oder ob Du sie auch gegen "Hacker" schützen willst. Die hätten nämlich mit oben angegebenen Schutz kein Problem...

Viele Grüße,
Matthias
AW: "Rückgängig"-Befehl per Makro erzeugen
05.09.2003 17:09:35
Matthias G
Hallo Stephan,
Es zeigt sich mal wieder, dass man durch helfen anderer sich selbst auch hilft!
Ich hab den Befehl, um auch das in meinem vorigen Beitrag geschilderte Problem zu lösen:

Application.CommandBars.DisableCustomize = True

Damit verhindert man auch das Erstellen einer neuen Symbolleiste.
Wobei auch mein Problem gelöst wäre!

Vielen Dank für die Anregungen!
Matthias

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige