Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

leere Excel Instanz bleibt offen


Betrifft: leere Excel Instanz bleibt offen von: Werner
Geschrieben am: 13.09.2019 21:33:42

Hallo,

ich bräuchte auch mal wieder Hilfe bei einem Makro-Problem. Ist zwar nur ein Schönheitsfehler aber vielleicht kann mir den ja jemand beseitigen.

Zur Sache:
Ich habe eine Excel .xlsm mit der tägliche Stärkemeldungen erfasst werden. Das ganze läuft ausschließlich über Userformen, Excel selbst wird minimiert gestartet.

Sobald die Daten für die Nachtschicht erfasst sind soll eine leere Datei für den nächsten Tag angelegt werden.

Dabei soll aber die aktuelle .xlsm als .xlsx gespeichert werden. So können dann nachträglich keine Änderungen daran mehr durchgeführt werden (Blatt ist geschützt).

Mein Code macht auch alles was ich von ihm will. Die .xlsm wird als .xlsx gespeichert, die .xlsm wird (ggf. wird ein neuer Jahresordner und/oder ein neuer Monatsordner angelegt), die .xlsm wird umbenannt in den nächsten Tag und ggf. in den neuen Monatsordner/Jahresordner verschoben.

Klappt alles wunderbar, nur bleibt mir nach Makrodurchlauf eine leere Excelinstanz offen.

Ich vermute der Casus Knacktus liegt darin, dass die .xlsm als .xlsx gespeichert wird, das Makro der .xlsm aber zu diesem Zeitpunkt ja noch nicht durch ist.

Vielleicht denke ich bei dem Code auch zu sehr um die Ecke.

  •     Private Sub CommandButton18_Click()
        Dim Pfad As String, Jahr As String, Monat As String
        Dim daDatum As Date, i As Long, loZähler As Long, sh As Shape
        Dim mldg As Variant, Quelle As String, Ziel As String
        
        Application.ScreenUpdating = False
        
        'Prüfung ob alle Stärkemeldungen erfasst sind
        For i = 1 To 12
            If Me.Controls("Commandbutton" & i).BackColor = vbGreen Then
                loZähler = loZähler + 1
            End If
        Next i
        
        If Me.CommandButton15.BackColor = vbGreen Then loZähler = loZähler + 1
        
        'Datu aus Zelleholen
        daDatum = Range("L3")
        
        If loZähler < 13 Then
            mldg = MsgBox("Fehler: Unzulässig, es sind noch nicht alle Särkemeldungen erfasst." _
            , , "Hinweis für " & Application.UserName)
            Exit Sub
        Else
            If MsgBox("Sind alle Stärkemeldungen" & vbLf & "für den " & daDatum _
                & " bereits erfasst?", vbYesNo, "Sicherheitsabfrage an " _
                & Application.UserName) = vbYes Then
                
                'Userform ausblenden
                Start.Hide
                'neues Datum für Folgetag erstellen
                Jahr = Year(daDatum + 1)
                Monat = Format(daDatum + 1, "MM") & "-" & Format(daDatum + 1, "MMMM")
                Worksheets("Tabelle1").Range("D1") = "Abschluß"
                ThisWorkbook.Save
                
                '# Pfad zur aktuellen Datei anpassen ##
                Pfad = "P:\Stärke\" & Jahr & "\"    '##
                '######################################
                
                'Quelldatei festlegen = Datei des aktuellen Tages
                Quelle = ThisWorkbook.Path & "\" & daDatum & ".xlsm"
                
                'ggf. neuen Jahresordner und/oder neuen Monatsordner anlegen
                If Dir(Pfad, vbDirectory) = "" Then
                    MkDir (Pfad)
                End If
        
                Pfad = Pfad & Monat & "\"
        
                If Dir(Pfad, vbDirectory) = "" Then
                    MkDir (Pfad)
                End If
                
                'aktuelle .xlsm als .xlsx speichern
                Application.DisplayAlerts = False
                With ThisWorkbook
                    .Worksheets("Personal").Delete
                    .Worksheets("Tabelle1").Range("D1").ClearContents
                    .Worksheets("Tabelle1").Columns("N:U").ClearContents
                    For Each sh In .Worksheets("Tabelle1").Shapes
                        sh.Delete
                    Next sh
                    .SaveAs Filename:=ThisWorkbook.Path & "\" & daDatum & ".xlsx", _
                    FileFormat:=xlOpenXMLWorkbook
                    
                    'aktuelle .xlsm umbenennen (neuer Tag)
                    'und ggf. in neuen Ordner verschieben
                    On Error GoTo Ausgang
                    Ziel = Pfad & daDatum + 1 & ".xlsm"
                    Name Quelle As Ziel
                    mldg = MsgBox("Die Datei für den " & daDatum + 1 & " wurde erfolgreich angelegt." _
                    , , "Hinweis für " & Application.UserName)
                    .Close False
                End With
                Application.DisplayAlerts = True
                
                'aktive Datei speichern und schließen
                ThisWorkbook.Close True
                'Excel beenden
                Application.Quit
            End If
        End If
        Exit Sub
        
        Ausgang:
        MsgBox "Es ist ein Fehler aufgetreten." & vbLf _
        & "Die Datei für den neuen Tag konnte nicht angelegt werden." _
        & vbLf & vbLf & "Bitte die Datei ""Vorlage Stärkemeldung"" aus dem Hauptverzeichnis öffnen." _
        & vbLf & "Anschließend die Datei mit ""Speichern unter... im entsprechenden Monat" _
        & vbLf & "unter dem Datum des neu anzulegenden Tages abspeichern." & vbLf _
        & "Datumsformat: XX.XX.XXXX"
        End Sub


  • Gruß Werner
      

    Betrifft: AW: leere Excel Instanz bleibt offen von: 1713009.html
    Geschrieben am: 13.09.2019 22:14:16

    Hi Werner

    Ich denke das Grundproblem hast du erkannt. Gemäss dem Symptom vermute ich, dass Quit ausgelassen wird, nachdem die Datei bereits zu ist.

    ThisWorkbook.Close True
       Application.Quit
    Speichere (bei Bedarf) die Datei und schliesse danach direkt die Applikation.

    Tendenziell würde ich den Code aber umschreiben. Mit einer XLTM (Vorlage) starten und die relevanten Daten in eine neue Datei (oder in eine zentrale Tabelle/Datenbank) speichern.

    cu
    Chris
      

    Betrifft: AW: leere Excel Instanz bleibt offen von: 1713012.html
    Geschrieben am: 13.09.2019 22:41:48

    Hallo Chris,

    das mit einer .XLTM wollte ich nicht, da die Nutzer dann wieder die Vorlagendatei öffnen und für den neuen Tag unter dem Tagesdatum abspeichern müssen.
    Da gibt es welche, die selbst damit überfordert sind.

    Mit meiner Version läuft das alles automatisch ab. Die müssen nur noch ein Knöppchen drücken, die Datei wird als .xlsx gespeichert, die .xlsm für den neuen Tag wird angelegt ggf. auch mit Ordner für ein neues Jahr bzw. für einen neuen Monat.

    Aber weitergeholfen hast du mir trotzdem.

    Einfach nach dem Abspeicheren als .xlsx ein Application.Quit und am Schluß wird alles sauber geschlossen.

    Das hatte ich noch nicht versucht, weil ich davon ausgegangen bin, dass ich mir damit den Ast absäge auf dem ich sitze.

    Danke für die Erleuchtung.

    Gruß Werner

      

    Betrifft: AW: leere Excel Instanz bleibt offen von: 1713132.html
    Geschrieben am: 14.09.2019 21:24:49

    Hallo Werner,

    das mit dem leeren Excel-Fenster ist wirklich lästig. Das 1. Mal habe ich das in einem Vba-Programm festgestellt, wo mehrere Exceldateien nacheinander von der Hauptdatei dazu geladen werden.
    Allerdings erst ab Excel 2013, denn da hat man ja die gesamte Excel-Festertechnologie geändert, _ siehe:

     http://www.excel-ticker.de/uebersicht-der-globalen-aenderungen-in-den-office-2013-anwendungen/

    Ich selbst hatte es gar nicht so richtig bemerkt, aber mein Obertechnologie-Fritze machte mich darauf aufmerksam, daß da (nicht) immer ein leeres Excel-Fester übrig bleibt, wenn das Vba-Programm längst beendet ist.
    Ich schau morgen mal, wie ich das gelöst habe:
    - auf alle Fälle muß man die Excel-Fenster-Handle per Vba/API durchlaufen
    - und das leere Excel-Fenster schließen
    - mit Excel 2016 gab es die Problematik immer noch
    - ob das aber mit Excel 2019 noch existiert, kann ich Dir nicht sagen
    - da die Kunden darauf noch nicht umgestellt haben
    - aber bis Excel 2010 kannte ich dieses Merkwürdigkeit überhaupt nicht

    Gruß von Luschi
    aus klein-Paris
      

    Betrifft: AW: leere Excel Instanz bleibt offen von: 1713986.html
    Geschrieben am: 19.09.2019 20:29:05

    Hallo Werner,

    und nun - kein Interesse mehr. Ich habe nachgeschaut, wie ich das Problem löste aber bei Null Interesse bleibt der Hilfekasten einfach zu.

    Gruß von Luschi
    aus klein-Paris