Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1480to1484
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
Inhaltsverzeichnis

Vor dem Speichern Prüfen und ggf löschen

Vor dem Speichern Prüfen und ggf löschen
13.03.2016 21:55:45
jones
Hallo,
bin vba Anfänger und komme hier gerade nicht weiter.
Die Aufgabe:
Mit einem Knopfdruck soll vor dem Schließen:
- überprüft werden ob in bestimmten Zellen ein "x" steht
....- falls nein: speichern mit Dateiname bestehend aus der Zellinhalt E3+E4+"Entwurf"
....- falls ja: Prüfung ob die Datei "Zellinhalt E3+E4+"Entwurf"" im Pfad existiert
.......- falls ja: Datei löschen und speichern unter dem Namen "E3+E4"
.......- falls nein: SPeichern unter dem Namen "E3+E4"
Wenn jemand eine Idee dazu hat, wäre mir sehr geholfen.
Danke & Gruß,
jones

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Vor dem Speichern Prüfen und ggf löschen
14.03.2016 08:54:30
Steve
Hallo Jones,
das ließe sich mit dem BeforeClose-Event relativ leicht realisieren. Dies gehört in den Code-Bereich "DieseArbeitsmappe":
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim wks As Worksheet
Dim sName As String
Dim rZellen As Range, rZelle As Range
Dim bAllX As Boolean
Dim sFormat As String, lFormat As Long
Set wks = Tabelle1
sFormat = ".xlsm": lFormat = 52 ' Mappe mit Makros
'sFormat = ".xlsx": lFormat = 51 ' Mappe ohne Makros
With wks
Const sPfad As String = "R:\Arbeitsordner\" 'Backslash hinten drann nicht vergessen
' oder
'Dim sPfad as string
'sPfad = .range("E3") ' Zelle in der der Pfad steht
' zuprüfende Zellen
Set rZellen = Union(.Range("A1:B100"), _
.Range("C5:D9"), _
.Range("A2:Z2"))
bAllX = True
For Each rZelle In rZellen
If LCase(rZelle)  "x" Then bAllX = False
Next rZelle
Application.DisplayAlerts = False
sName = sPfad & .Range("E3") & .Range("E4")
If bAllX Then ' Ja
If Dir(sName & "Entwurf" & sFormat)  "" Then
Kill sName & "Entwurf" & sFormat ' lösche alten Entwurf
End If
ThisWorkbook.SaveAs sName & sFormat, lFormat
Else ' Nein
ThisWorkbook.SaveAs sName & "Entwurf" & sFormat, lFormat
End If
Application.DisplayAlerts = True
End With
End Sub
Ich habe dir die Wahl ermöglich deine Mappe ohne die Makros zu speichern, falls das gewünscht ist. Du musst nur die entsprechende Zeilen aus-/entkommentieren.
Da ich nicht weis ob in deinen Zellen E3 bzw. E4 der Pfad enthalten ist, habe ich das erstmal über eine Konstante gelöst, aber das lässt anpassen.
lg Steve

Anzeige
AW: Vor dem Speichern Prüfen und ggf löschen
14.03.2016 22:37:49
jones
Hallo Steve,
tausend Dank erstmal für die Lösung! Sie ist schon nahezu Perfekt.
Ein paar Fragen hab ich noch dazu:
1. Wenn ich richtig gelesen habe, gibt es die LCase Funktion erst ab Office 2013. Gibt es noch eine Alternativ Lösung die auch bei älteren Versionen einwandfrei läuft? (zB 2010..)
Zudem funktioniert die LCase Funktion nur mit klein geschriebenen Buchstaben oder? Wenn ich z.B. das "x" durch "Richtig" ersetzen möchte, wird
If LCase(rZelle)  "Richtig" Then bAllX = False

auf False gesetzt, obwohl in allen Zellen "Richtig" steht. Hab ich da was übersehen?
2. Wenn die Zellüberprüfung positiv ist soll ja unter dem Namen ohne den Zusatz "Entwurf" gespeichert werden und die Datei mit Zusatz "Entwurf" gelöscht werden. Problem: Wenn die Datei mit Endung "Entwurf" geöffnet ist (mit Makro), kann Sie beim Schließen nicht gelöscht werden, da sie ja noch offen ist...gibt es hier eine Lösung?
3. Wenn alle Zellen positiv sind und unter dem Namen E3+E4 abgespeichert wurde, ist das Makro eigentlich hinfällig und es muss nicht jedesmal wieder erneut durchlaufen wenn man die Mappe geöffnet hatte und wieder schließt. Kann ich das einfach ausschalten, indem ich als .xlsx speichere in diesem Fall, oder kommt es dann zu Komplikationen?
Danke & Gruß,
jones

Anzeige
AW: Vor dem Speichern Prüfen und ggf löschen
15.03.2016 08:48:42
Steve
Hallo Jones,
zu 1.:
LCase heist nix anderes als den Text in Kleinbuchstaben umzuwandeln. Das bedeutet, dass du niemals ein "falsches" Ergebnis erzielen kannst weil dein Prüftext ja mit einem Großbuchstaben beginnt. Somit wird bAllX immer falsch sein. Wenn du das Wort "Richtig" verwenden willst, nimmst du also "richtig". Wenn du mit einer Dropdown arbeitest, kannst du auch das LCase() weglassen, ich habe nur sicherstellen wollen, dass dir sowohl ein großes als auch ein kleines X als Eingabe möglich waren.
LCase() gibt es auch unter Office 2010. Sicherlich hast du das hier gelesen?:
https://msdn.microsoft.com/de-de/library/office/gg264497.aspx
Direkt unter der Überschrift "Other Versions" auswählen, dann kommt auch eine Hilfe für O2010.
zu 2.:
Da muss ich kurz nachfragen: Ist das die Datei in der dieses Makro ausgeführt werden soll?
Falls ja, mein Fehler. Die Datei kann sich ja nicht selber killen, daher muss zuerst das " _ Speichern unter" ausgeführt werden, dann ist deine Entwurfs-Datei auch nicht mehr offen. Danach kann man sie löschen.

Application.DisplayAlerts = False
sName = sPfad & .Range("E3") & .Range("E4")
If bAllX Then ' Ja
ThisWorkbook.SaveAs sName & sFormat, lFormat
If Dir(sName & "Entwurf" & sFormat)  "" Then
Kill sName & "Entwurf" & sFormat ' lösche alten Entwurf
End If
Else ' Nein
ThisWorkbook.SaveAs sName & "Entwurf" & sFormat, lFormat
End If
Application.DisplayAlerts = True

Wenn nicht gebe ich dir den Tipp, Schließe die Mappen vorher. Das sollte für dich kein Problem sein und erspart viel Aufwand beim Programmieren. Wenn ein anderer Benutzer im Netzwerk die Datei offen hat, kann man mit Excels VBA nicht viel machen. Da hilft nur Telefon in die Hand nehmen.
zu 3.:
Nein, du hast ja erreicht was du wolltest. Deshalb habe ich dir auch das Format ohne Makros mit in den Code getan, weil ich der Ansicht war dass das Makro hinterher nicht mehr gebraucht wird, aber die Entscheidung triffst du. Komplikationen sollte es dabei nicht geben. Auch wenn der Code entfernt wird beim Speichern unter, so wird das Makro noch bis zum Schluss abgearbeitet.
lg Steve

Anzeige
AW: Vor dem Speichern Prüfen und ggf löschen
16.03.2016 22:06:32
jones
Hallo Steve,
vielen Dank, das funktioniert super! Mir fällt ein Stein vom Herzen!
zu 1. was LCase angeht bin ich komplett in das VBA Beginner Fettnäpfchen getreten...und ja, ich hatte es meine ich auf besagter Homepage gelesen (und falsch verstanden:)
Ich hab LCase nun weggelassen weil das "Richtig" wiederum auch von einem Makro geschrieben wird, das sollte sich wohl nicht so schnell verschreiben...
zu 2. Astrein! Hab die Zeilen getauscht und es funktioniert!!!
zu 3. Ebenfalls perfekt mit xlsx!
Noch eine Frage zur BeforeClose Ausführung:
Ich möchte lieber, dass das Makro über eine Schaltfläche ausgeführt wird. Das also beim Schließen regulär nichts passiert. Eigentlich könnte ich doch dann nur das Programm in z.B.
Sub PrüfenUndSpeichern()

umbenennen und gegen Ende ein Befehl zum Schließen einbauen oder? Wie müsste der heißen und kommt der einfach vor "End Sub"?
Und wenn man es jetzt noch komplett auf die Spitze treiben möchte: gibt es die Möglichkeit beim SPeichern als xlsx, auch den CommandButton vom Makro zu löschen?
LG
jones

Anzeige
AW: Vor dem Speichern Prüfen und ggf löschen
17.03.2016 08:59:01
Steve
Hallo Jones,
das ist mehr als eine Frage.
Ja, du kannst den Makronamen einfach umbenennen, das hast du richtig erkannt.
Mit dem Befehl "Thisworkbook.Close" kannst du die Mappe schließen. Eigentlich bezeichnet "Thisworkbook" immer die Mappe von der aus der Code ausgeführt wird, aber mit dem Speichern unter-Befehl setzt sich der Bezug auf deine neue Mappe, die alte wird dabei geschlossen.
Grundsätzlich gehören alle Befehle zwischen ein "Sub" und "End Sub". Es gibt Ausnahmefälle, zum Beispiel öffentliche Variablendeklarationen oder diverse Modul-Optionen, aber das führt jetzt zu weit.
Das kommt darauf an welche Art von Button du verwendet hast. Sowohl Formularsteuerelemente als auch ActiveX-Steuerelemente lassen sich wie folgt löschen:
For Each oButton In ThisWorkbook.Sheets("Tabelle1").Shapes
' 12 entspricht ActiveX "Commandbutton.1"
'  8 entspricht Formularsteuerlement "Schaltfläche"
If oButton.Type = 12 Or oButton.Type = 8 Then oButton.Delete
Next oButton

Falls du nur bestimme löschen willst und nicht alle, kann man auch eine Namens bzw. Titel-Prüfung einbauen, aber ich gehe davon aus dass hast du nicht vor. Sofern du auf mehreren Blättern Buttons hast, kann man das auch ggf. erweitern.
lg Steve
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige