Application.Displayalerts in anderer Mappe
#1
Hi Leute,

ich habe ein längeres Makro geschrieben, bei dem zunächst eine Kopie der Datei erstellt wird. Anschließend wird diese Kopie geöffnet und es werden dann von der Kopie nicht benötigte Blätter (52 Stück) gelöscht.

Nun stört mich, dass das Makro an diesem Punkt 52 Mal von mir fordert, das Löschen zu bestätigen. Ich habe deshalb am Anfang des Makros Application.Displayalerts = False geschrieben. Leider scheint diese Code-Zeile nicht für die neu generierte Mappe zu gelten - die Aufforderung, das Blattlöschen zu bestätigen kommt trotzdem.

Habe ihr eine Idee, wie ich das lösen kann?


Gruß Tim
Top
#2
Achso, falls das hilft:


Code:
Sub NeueMappe_Loeschen()

Dim strPfad As String
Dim wks As Worksheet
Dim Dateiname_neu As String
Dim Dateiname_alt As String
Dim i As Integer

strPfad = ActiveWorkbook.Path
Dateiname_neu = "Test " & ThisWorkbook.Sheets("Einstellungen_neu").Range("O12").Value
Dateiname_alt = ThisWorkbook.Name

Application.DisplayAlerts = False

'Aktuelle Mappe speichern und dann eine Kopie mit neuem Namen erstellen
   Call speichern
   With ThisWorkbook
       .SaveCopyAs Filename:=strPfad & "\" & Dateiname_neu & ".xlsm"
   End With

'Neue Mappe öffnen und alle Blätter bis auf ___ löschen
Workbooks.Open Filename:=strPfad & "\" & Dateiname_neu & ".xlsm"

For Each wks In Workbooks(Dateiname_neu).Sheets
If LCase(wks.Name) <> "einstellungen_neu" And _
  LCase(wks.Name) <> "mitarbeiter" And _
  LCase(wks.Name) <> "berechnungshilfe" And _
  LCase(wks.Name) <> "zwischenspeicher" And _
  LCase(wks.Name) <> "mitarbeiterliste" Then wks.Delete
Next

Application.DisplayAlerts = True
End sub
Top
#3
Hallo Tim,

(16.04.2019, 16:34)EasY schrieb: Ich habe deshalb am Anfang des Makros Application.Displayalerts = False geschrieben.

warum am Anfang?

Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • EasY
Top
#4
Nach vielen Versuchen dürfte ich des Rätsels Lösung gefunden haben: Ich habe vor dem Löschen der Blätter das Workbook zunächst aktiviert und dann den Application.Displayalerts = false - Befehl erneut eingegeben.

Weiß jemand wie ich prüfen kann, ob die Displayalerts aktiviert oder deaktiviert sind? Nicht, dass nun bei der alten Datei die Alerts ausgeschaltet bleiben.
Top
#5
Moin!
Mit Call speichern verlässt Du das Makro temporär.
Application.DisplayAlerts stellt sich automatisch beim Verlassen des Makros wieder auf True

Richtiger wäre also (ungetestet)
Call speichern
Application.DisplayAlerts = False

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#6
Hi Ralf,

(16.04.2019, 18:29)RPP63 schrieb: Application.DisplayAlerts stellt sich automatisch beim Verlassen des Makros wieder auf True

w.z.b.w. Wink
Sub aaa()
 Application.DisplayAlerts = False
 Debug.Print "a1: " & Application.DisplayAlerts
 Call bbb
 Debug.Print "a2: " & Application.DisplayAlerts
 Application.DisplayAlerts = True
End Sub

Sub bbb()
 Debug.Print "b: " & Application.DisplayAlerts
End Sub
Gruß Uwe
Top
#7
Ja, nachdem ich meine unausgegorene Antwort überdacht habe, war es zu spät. Wink
War eine flüchtige Eingebung, die n.b.w.m. (nicht bewiesen werden muss)  Blush

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#8
Dennoch:
Application.DisplayAlerts muss nicht wieder auf True gestellt werden.
Dies schafft der Interpreter ganz von allein …
(dennoch macht das Wiederanstellen aus "ästhetischen" Gründen Sinn)
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#9
In der Doku steht 

Zitat:Wenn Sie diese Eigenschaft auf False festlegen, legt Excel diese Eigenschaft auf True fest,
wenn der Code abgeschlossen ist, es sei denn, Sie führen einen prozessübergreifenden Code aus.
Was ist denn prozessübergreifender Code?

Ok, in Original ist es deutlicher
Zitat:If you set this property to False, Excel sets this property to True when the code is finished,
unless you are running cross-process code.
Top
#10
Hi,

(16.04.2019, 19:38)Storax schrieb: Was ist denn prozessübergreifender Code?

z.B. per OnTime ist keiner:
Sub aaa()
 Application.DisplayAlerts = False
 Debug.Print "a1: " & Application.DisplayAlerts
 Call bbb
 Debug.Print "a2: " & Application.DisplayAlerts
 Application.OnTime Now + CDate("00:00:01"), "bbb"
End Sub

Sub bbb()
 Debug.Print "b: " & Application.DisplayAlerts
End Sub
Gruß Uwe
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste