Guten Morgen Allerseits,
ich bin gerade etwas am Verzweifeln, da ich das Problem einfach nicht erkenne.
Ich habe, da ich aus restriktiven Gründen in meiner Mappe alle Menüleisten ausblenden muss, mir eine Funktion entwickelt, welche ein "Rückgängig" bzw. "Wiederholen" simuliert.
Ich weiß, dass dies etwas getrickst ist und sicherlich nicht ganz so schön und komfortabel ist wie die originale Funktion dazu von Excel, aber die steht nun einmal nicht zur Verfügung und mit meiner lassen sich auch durch VBA erzeugte Aktionen Rückgängig machen.
Ich habe den Code dazu einmal aus meinem Projekt heraus geschrieben und so zusammen gefasst, dass er in ein leere Mappe eingefügt werden kann. (Wichtig dabei ist allerdings, dass
das erste Tabellen Blatt auf "Ablauf Übersicht" (der Name hat aber nichts mit dem Programablauf zu tun, könnte auch theoreth. Osterhase heißen, also nicht verwirren lassen) umbenannt wird , sonst klappt es nicht.
Die Funktionen im einzelnen laufen auch super. Mein Problem ist eigentlich viel simpler. "Wiederholen" soll nicht ausgeführt werden können, bevor nicht mindestens einmal "Rückgängig" ausgeführt wurde, denn dies würde ja auch keinen Sinn machen und dazu noch Fehler verursachen. Also muss beim Durchlauf von "Rückgängig" "R" auf 1 gesetzt werden.
Leider erkennt dies die "Wiederholen"-Anweisung nicht und ich verstehe nicht wieso.
Wenn ich die kleineren Testläufe am Ende des Codes durchführe klappt es. Auch wenn ich hiermit "R" auf 1 setze funktioniert "Wiederholen".
Ich vermut das es an dieser Zeile in Sub Rückgängig () liegt, welche eigentlich aus VB stammt und nicht aus VBA,
da "R" übergeben wird, wenn ich sie ausschalte:
ThisWorkbook.VBProject.VBComponents("Tabelle2").Properties(5).Value = "Tabelle1"
Allerdings verstehe ich nicht wieso, da "R=1" erst im Anschluss folgt und die MsgBox ja auch reagiert.
Und zudem erzeugt die analoge Zeile in "Wiederholen" nicht diesen Fehler, da hier am Ende "R=0" ist.
Mein Code ist:
Option Explicit
Private Sub Workbook_open()
'eine Kopie des Startzustandes wird erzeugt
Application.DisplayAlerts = False
Worksheets("Ablauf Übersicht").Copy After:=Sheets(1)
Application.DisplayAlerts = True
'Setze R=0
R = 0
End Sub
Option Explicit
Public R As Integer
Public Function WorkSheetExists(ByVal strName As String) As Boolean
On Error Resume Next
WorkSheetExists = Not Worksheets(strName) Is Nothing
End Function
Private Sub Rückgängig()
Dim sBlattname As String
Application.DisplayAlerts = False
'Durchgangszähler für Rückgängig() um 1 erhöhen (Starten bei 0 aus Workbook_open())
'Prüfung, ob Rückgängig() bereits einmal ausgeführt wurde und somit Kopie des Arbeitsstandes (Sheet(3)) bereits existiert,
'wenn ja löschen
sBlattname = "Ablauf Übersicht (3)"
If WorkSheetExists(sBlattname) Then
Worksheets("Ablauf Übersicht (3)").Delete
End If
'Kopie des Arbeitsstandes erstellen für "Wiederholen"
Sheets("Ablauf Übersicht").Copy After:=Sheets(2)
'Kopie des Arbeitsstandes unsichtbar machen
'Sheets("Ablauf Übersicht (3)").Visible = False
'Kopie mit Startzustand sichtbar machen
Sheets("Ablauf Übersicht (2)").Visible = True
'Original Löschen
Sheets("Ablauf Übersicht").Delete
'Kopie, welche bei Workbook_open() erstellt wurde und Startzustand enthält, um benennen zu original Name
Sheets("Ablauf Übersicht (2)").Name = "Ablauf Übersicht"
'VB Komponente (Codename) der Kopie mit Stratzustand auf original Name umbenennen
ThisWorkbook.VBProject.VBComponents("Tabelle2").Properties(5).Value = "Tabelle1"
'Neue Kopie (Kopie der Kopie) erstellen
Sheets("Ablauf Übersicht").Copy After:=Sheets(1)
Application.DisplayAlerts = True
'setze R
R = 1
If R = 1 Then MsgBox ("so weit ok!") 'nur zum Test
End Sub
Sub Wiederholen()
'Prüfen von R
If R = 0 Then
MsgBox ("Geht nicht! Weil nichts da ist!")
Exit Sub
Else
Application.DisplayAlerts = False
'Kopie des Arbeitsstandes sichtbar machen
'Sheets("Ablauf Übersicht (3)").Visible = True
'NEUES Original aus "Rückgängig()", welches Startzustand enthält, wieder löschen
Sheets("Ablauf Übersicht").Delete
'Kopie mit Arbeitsstand, welche bei "Rückgängig" erstellt wurde, umbenennen zu original Namen
Sheets("Ablauf Übersicht (3)").Name = "Ablauf Übersicht"
'VB Komponente (Codename) der Kopie mit Arbeitsstand auf original Name umbenennen
ThisWorkbook.VBProject.VBComponents("Tabelle3").Properties(5).Value = "Tabelle1"
Application.DisplayAlerts = True
R = 0
End If
End Sub
'Nachfolgende Anweisungen nur zum Testen ob Variablen übergeben werden:
Sub Test_Variablensetzen()
R = 1
End Sub
Sub Test_Variabeln_Prüfung()
If R = 0 Then
Range("B10").Value = "nein, geht nicht"
Else
Range("B10").Value = "es geht"
R = 0
End If
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'überflüssige Arbeitsblätter werden vor dem Schließen gelöscht
Dim sBlattname As String
sBlattname = "Ablauf Übersicht (2)"
If Not WorkSheetExists(sBlattname) Then
Else
Application.DisplayAlerts = False
Worksheets("Ablauf Übersicht (2)").Delete
Application.DisplayAlerts = True
End If
sBlattname = "Ablauf Übersicht (3)"
If Not WorkSheetExists(sBlattname) Then
Else
Application.DisplayAlerts = False
Worksheets("Ablauf Übersicht (3)").Delete
Application.DisplayAlerts = True
End If
Save
End Sub
Ich hoffe ich konnte mich klar genug ausdrücken und dass jemand den Fehler sieht, der sich mir nicht offenbart, da ich einfach langsam betriebsblind bin.
Oder vielleicht hat ja jemand einen ganz anderen Ansatz für mein Ausgangsproblem.
Ich wäre über eine Antowrt sehr dankbar.
mfg
|