Datei als xlsx speichern

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Datei als xlsx speichern
von: P-Quest:-)
Geschrieben am: 22.08.2015 13:54:18

Hallo,
nachdem eine Arbeitsmappe per Makro bearbeitet wurde, möchte ich diese Arbeitsmappe als XLSX speichern um alle Formulare, Module etc. daraus zu entfernen.
Dies soll ohne Nachfrage seitens Excel geschehen.

Public Sub Bereinigen()
'überflüssige Tabellen entfernen
'Arbeitsmappe als xlsx speichern
Dim ws As Worksheet
Dim strName As String
Dim curWb As String
Dim curWbDir As String
Dim NewName As String
    
strName = "weinkeller_jahresabschluss_"
    For Each ws In ThisWorkbook.Sheets
        If Not (LCase(ws.Name) Like strName & "*") Then ws.Delete
    Next
    
    ActiveSheet.Range("A1").Select
    
    curWb = ActiveWorkbook.Name
    curWbDir = ActiveWorkbook.Path
    ChDir curWbDir
    'Namen festlegen und Speichern
    Windows(curWb).Activate
    NewName = "Jahresabschluss_" & vJahr
    ActiveWorkbook.SaveAs Filename:=curWbDir & "\" & NewName, FileFormat:=51, Password:="", _
    WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
'    Fileformat:=51 = xlOpenXMLWorkbook (Endung "xlsx")
End Sub
Wenn ich den Code ausgeführt habe und die Mappe schliesse, erscheint aber immer noch die Frage, ob die Datei ohne Module gespeichert werden soll.
Funktioniert das, was ich vorhabe überhaupt? Von der Logik würde ich tatsächlich sagen "Nein", da ich ja einen Code ausführe und ihn sozusagen zur Selbsteliminierung zwinge.
Kann mir jemand etwas dazu sagen?
Gruß,
Peter

Bild

Betrifft: AW: Datei als xlsx speichern
von: Daniel
Geschrieben am: 22.08.2015 14:21:27
Hi
die Rückfragen von Excel kann man unterdrücken, in dem man vor der aktion (hier das SaveAs) den Befehl:

Application.DisplayAlerts = False

ausführen lässt.
zum Einschalten der Rückfragen dann
Application.DisplayAlerts = True
Excel verwendet dann die Option, welche bei der normalen Rückfrage schon voreingestellt ist und ausgeführt würde, wenn du im normalen Ablauf einfach ENTER drücken würdest ohne einen Button zu klicken.
Gruss Daniel

Bild

Betrifft: AW: Datei als xlsx speichern
von: P-Quest:-)
Geschrieben am: 22.08.2015 14:44:09
Hallo Daniel,

Public Sub JAb()
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Call Abfrage
    Call Jahr
    Call SIK(vJahr)
    Call BuchNachStichtagSik(vJahr)
    Call AktBestSik(vJahr)
    Call NeuerJA(vJahr)
    Call Restbestand(vJahr)
    Call BuchNachStichtagZurueck
    Call Formeln
    Call Bereinigen
    
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.CutCopyMode = False
End Sub
Wie Du an dem Code sehen kannst, aus dem die Sub Bereinigen aufgerufen wird, ist die entsprechende Einstellung schon gewählt.
Weitere Ideen und Vorschläge?

Bild

Betrifft: AW: Datei als xlsx speichern
von: Daniel
Geschrieben am: 22.08.2015 14:59:05
Es gibt auch Systemmeldungen, die sich nicht unterdrücken lassen, dann gehört diese wohl dazu.
du hast jetzt zwei möglichkeiten:
1. eine neue leere Datei anlegen und die benötigten Inhalte rüber kopieren
2. alle Makros selber löschen. Dazu gibts hier eine Anleitung
http://www.office-loesung.de/ftopic229695_0_0_asc.php
bei deinem Kenntnisstand würde ich dir aber zu Variante 1 raten.
Gruss Daniel

Bild

Betrifft: Daniel, dachte nur deswegen....
von: robert
Geschrieben am: 22.08.2015 16:37:18
"bei deinem Kenntnisstand würde ich dir aber zu Variante 1 raten."
Gruß
robert

Bild

Betrifft: AW: Daniel, dachte nur deswegen....
von: Daniel
Geschrieben am: 22.08.2015 16:43:51
hI robert
was möchtest du mir mit deinem Beitrag mitteilen?
Gruss Daniel

Bild

Betrifft: AW: Daniel, dachte nur deswegen....
von: P-Quest:-)
Geschrieben am: 22.08.2015 17:39:26
Er möchte dir wohl mitteilen, dass mein Kenntnisstand so gering ist, dass ein klicken auf "Nein" sicher die einfachste Variante wäre :-)
Ohne Groll,
Peter

Bild

Betrifft: AW: Daniel, dachte nur deswegen....
von: Daniel
Geschrieben am: 22.08.2015 17:51:32
die einfachste variante zum Programmeiren ist, nichts zu programmieren und alles von Hand zu machen.
ob das jetzt sinnvoll ist, sei mal dahingestellt.
wenn du aber die Daten einfach in eine neue, leere Datei kopierst, hast du die wenigsten Probleme.
Gruss Daniel

Bild

Betrifft: 1 mal auf JA drücken zu viel Aufwand? owT
von: robert
Geschrieben am: 22.08.2015 15:30:46


Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: Daniel
Geschrieben am: 22.08.2015 15:38:49
Hi
wenns unnötig ist, meiner Ansicht nach JA.
ausserdem hat der Anwender dann ja auch die möglichkeit eben nicht JA zu drücken sondern auch eine andere Auswahl zu tätigen, und wenn du das sauber in der Programmierung abfangen willst, wirds aufwendig.
gruss Daniel

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: P-Quest:-)
Geschrieben am: 22.08.2015 15:53:21
Sicher nicht für mich, aber es gibt Anwender, die durch solch eine Meldung schon komplett aus der Bahn geworfen werden bzw. absolut verunsichert sind und nicht wissen, was sie tun sollen.
Was noch erschwerend hinzukommt: Bei dem Programm handelt es sich um einen Jahresabschluss. Weiss der User dieses Jahr noch was er tun soll, so muss das nächstes Jahr nicht mehr der Fall sein. Vielleicht ist es dann auch schon ein anderer User mit ähnlichen Kenntnissen und schon fangen die Probleme an.

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: Sepp
Geschrieben am: 22.08.2015 16:04:55
Hallo Peter,

' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Sub Bereinigen()
'überflüssige Tabellen entfernen
'Arbeitsmappe als xlsx speichern
Dim ws As Worksheet
Dim strName As String, curWb As String, curWbDir As String, NewName As String, vJahr As String

On Error GoTo ErrExit

With Application
  .ScreenUpdating = False
  .EnableEvents = False
  .Calculation = xlManual
  .DisplayAlerts = False
End With

strName = "weinkeller_jahresabschluss_"

For Each ws In ThisWorkbook.Sheets
  If Not (LCase(ws.Name) Like strName & "*") Then ws.Delete
Next

ActiveSheet.Range("A1").Select

curWb = ActiveWorkbook.Name
curWbDir = ActiveWorkbook.Path
vJahr = CStr(Year(Date))

'Namen festlegen und Speichern
NewName = "Jahresabschluss_" & vJahr & ".xlsx"
ThisWorkbook.SaveAs curWbDir & "\" & NewName, 51
deleteAllCodeAndModules ThisWorkbook

ErrExit:

With Err
  If .Number <> 0 Then
    MsgBox "Fehler in Prozedur:" & vbTab & "'Bereinigen'" & vbLf & String(60, "_") & _
      vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
      "Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
      .Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
      "VBA - Fehler in Prozedur - Bereinigen"
    .Clear
  End If
End With

On Error GoTo 0

With Application
  .ScreenUpdating = True
  .EnableEvents = True
  .Calculation = xlAutomatic
  .DisplayAlerts = True
  .StatusBar = False
End With

End Sub


Private Sub deleteAllCodeAndModules(ByVal WBook As Workbook)
Dim objVBComp As Object
With WBook.VBProject
  For Each objVBComp In .vbComponents
    If objVBComp.Type = 100 Then
      With .vbComponents(objVBComp.Name).CodeModule
        .DeleteLines 1, .CountOfLines
      End With
    Else
      .vbComponents.Remove objVBComp
    End If
  Next
End With
End Sub


Gruß Sepp


Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: P-Quest:-)
Geschrieben am: 22.08.2015 17:37:27
Hallo Sepp,
vielen lieben Dank.
Allerdings schmeisst mich das System mit dem Fehlercode 1004 und der Meldung "Die Methode delete für das Objekt Worksheet ist fehlgeschlagen" raus.
Kann es daran liegen, dass das System versucht den Code zu löschen, den es gerade ausführt?
Irgendwie ist es mir immer noch suspekt, dass ich einen Code ausführen kann, der sich selbst während der Laufzeit löscht...oder habe ich bei meiner Fragestellung unvollständige Angaben gemacht?
Gruß,
Peter

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: Sepp
Geschrieben am: 22.08.2015 22:39:54
Hallo Peter,
hatte vergessen zu erwähnen, du musst unter Optionen > Sicherheitscenter > Einstellungen für das Sicherheits... > Einstellungen für Makros, den Zugriff auf das VBA-Projektmodel zulassen.

Gruß Sepp


Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: P-Quest:-)
Geschrieben am: 23.08.2015 11:28:03
Guten morgen Sepp,
habe es angehakt, aber die Fehlermeldung erscheint immer noch.
Gruß,
Peter

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: P-Quest:-)
Geschrieben am: 23.08.2015 11:38:35
Hier nochmal der Code. Vielleicht habe ich einen Fehler übersehen?

Public Sub Bereinigen()
'überflüssige Tabellen entfernen
'Arbeitsmappe als xlsx speichern
Dim ws As Worksheet
Dim strName As String
Dim curWb As String
Dim curWbDir As String
Dim NewName As String
On Error GoTo ErrExit
strName = "weinkeller_jahresabschluss_"
   
    For Each ws In ActiveWorkbook.Sheets
        If Not (ws.Name Like LCase(strName) & "*") Then ws.Delete
    Next
    
    curWb = ActiveWorkbook.Name
    curWbDir = ActiveWorkbook.Path
    ChDir curWbDir
    ActiveSheet.Range("A1").Select
      
    'Namen festlegen und Speichern
    NewName = "Jahresabschluss_" & vJahr & ".xlsx"
    ThisWorkbook.SaveAs curWbDir & "\" & NewName, 51
    deleteAllCodeAndModules ThisWorkbook
    'Fileformat:=51 = xlOpenXMLWorkbook (Endung "xlsx")
    
ErrExit:
    With Err
        If .Number <> 0 Then
            MsgBox "Fehler in Prozedur:" & vbTab & "'Bereinigen'" & vbLf & String(60, "_") & _
              vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
              "Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
              .Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
              "VBA - Fehler in Prozedur - Bereinigen"
            .Clear
        End If
    End With
    
On Error GoTo 0
End Sub

Private Sub deleteAllCodeAndModules(ByVal WBook As Workbook)
Dim objVBComp As Object
    With WBook.VBProject
        For Each objVBComp In .vbComponents
            If objVBComp.Type = 100 Then
                With .vbComponents(objVBComp.Name).CodeModule
                    .DeleteLines 1, .CountOfLines
                End With
            Else
                .vbComponents.Remove objVBComp
            End If
        Next
    End With
    
End Sub


Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: mumpel
Geschrieben am: 23.08.2015 11:53:03
Das ist m.E. ganz normal und logisch. Wenn sich der Code in der Datei befindet in der Du den Code löschen möchtest, dann ist nach dem Speichern als XLSX kein Code mehr da der ausgeführt werden kann.

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: P-Quest:-)
Geschrieben am: 23.08.2015 12:05:45
Hallo Rene,
genau das war ganz am Anfang mal eine meiner Fragen, ob es überhaupt möglich ist, den Code, der gerade ausgeführt wird, während der Laufzeit zu löschen. Erscheint mir grundsätzlich auch unlogisch, aber ich bin da noch nicht so erfahren. Vielleicht, so dachte ich, gibt es ja Mittel und Wege :-).
Gruß,
Peter

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: Sepp
Geschrieben am: 23.08.2015 12:24:28
Hallo Peter,
also ich habe den Code getestet und bei mir funktioniert er! Wenn du an meinem Code herumbastelst, ist das nicht mein Problem!

Gruß Sepp


Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: P-Quest:-)
Geschrieben am: 23.08.2015 13:10:57
Hallo Sepp,
ich habe den Fehler gefunden und alles funktioniert wie gewünscht.
Vielen Dank für deine Hilfe.
Peter

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: mumpel
Geschrieben am: 23.08.2015 11:46:58
Hallo!
Wenn Du die Datei als XLSX speicherst musst Du keinen VBA-Code mehr löschen, weil dies automatisch geschieht.

Sub test()
  Application.DisplayAlerts = False
  ActiveWorkbook.SaveAs FilenName:="C:\Test", FileFormat:=xlOpenXMLWorkbook
  Application.DisplayAlerts = True
End Sub

VBA/HTML - CodeConverter für Office-Foren, AddIn für Office 2002-2013 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:mumpel

Code erstellt und getestet in Office 15 - mit VBAHTML 12.6.0

Gruß, René

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: P-Quest:-)
Geschrieben am: 23.08.2015 11:59:15
Hallo Mumpel,
das ist schon klar, aber es erscheint die Abfrage, ob die Datei ohne Makros gespeichert werden soll. Diese Abfrage soll verhindert werden, was aber über das obligatorische Application.DisplayAlerts = False NICHT zu erreichen ist.
Gruß,
Peter

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: mumpel
Geschrieben am: 23.08.2015 13:45:28
Du solltest den Code besser in ein Add-In oder in die personal.xlsb packen und von dort auf die aktive Arbeitsmappe referenzieren. Dann kann die Arbeitsmappe immer als XLSX gespeichert werden, und Du musst keine Codes mehr löschen.

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: P-Quest:-)
Geschrieben am: 23.08.2015 13:48:08
Danke für den Hinweis, aber dafür bin ich definitiv noch nicht weit genug :-)

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: mumpel
Geschrieben am: 23.08.2015 15:12:13
Also dafür bist Du weit genug. "ThisWorkbook" ersetzen durch "ActiveWorkbook", "ActiveSheet" ersetzen durch "ActiveWorkbook.Sheets("Tabellenname")". Als Add-In (xlam) speichern und Add-In über den Add-In-Manager einbinden. Mehr Wissen braucht es nicht. ;-)

Bild

Betrifft: AW: 1 mal auf JA drücken zu viel Aufwand? owT
von: P-Quest:-)
Geschrieben am: 23.08.2015 15:17:11
:-) Danke, ich werde es mal versuchen :-)

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Datei als xlsx speichern"