Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1440to1444
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
Datei als xlsx speichern
22.08.2015 13:54:18
P-Quest:-)
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

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datei als xlsx speichern
22.08.2015 14:21:27
Daniel
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

AW: Datei als xlsx speichern
22.08.2015 14:44:09
P-Quest:-)
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?

Anzeige
AW: Datei als xlsx speichern
22.08.2015 14:59:05
Daniel
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

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

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

AW: Daniel, dachte nur deswegen....
22.08.2015 17:39:26
P-Quest:-)
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

AW: Daniel, dachte nur deswegen....
22.08.2015 17:51:32
Daniel
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

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

AW: 1 mal auf JA drücken zu viel Aufwand? owT
22.08.2015 15:38:49
Daniel
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

Anzeige
AW: 1 mal auf JA drücken zu viel Aufwand? owT
22.08.2015 15:53:21
P-Quest:-)
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.

AW: 1 mal auf JA drücken zu viel Aufwand? owT
22.08.2015 16:04:55
Sepp
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

Anzeige
AW: 1 mal auf JA drücken zu viel Aufwand? owT
22.08.2015 17:37:27
P-Quest:-)
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

AW: 1 mal auf JA drücken zu viel Aufwand? owT
22.08.2015 22:39:54
Sepp
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

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

AW: 1 mal auf JA drücken zu viel Aufwand? owT
23.08.2015 11:38:35
P-Quest:-)
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

Anzeige
AW: 1 mal auf JA drücken zu viel Aufwand? owT
23.08.2015 11:53:03
mumpel
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.

AW: 1 mal auf JA drücken zu viel Aufwand? owT
23.08.2015 12:05:45
P-Quest:-)
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

AW: 1 mal auf JA drücken zu viel Aufwand? owT
23.08.2015 12:24:28
Sepp
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

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

AW: 1 mal auf JA drücken zu viel Aufwand? owT
23.08.2015 11:46:58
mumpel
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é

Anzeige
AW: 1 mal auf JA drücken zu viel Aufwand? owT
23.08.2015 11:59:15
P-Quest:-)
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

AW: 1 mal auf JA drücken zu viel Aufwand? owT
23.08.2015 13:45:28
mumpel
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.

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

Anzeige
AW: 1 mal auf JA drücken zu viel Aufwand? owT
23.08.2015 15:12:13
mumpel
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. ;-)

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

316 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige