Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Code wird nicht gespeichert

Forumthread: VBA Code wird nicht gespeichert

VBA Code wird nicht gespeichert
06.08.2020 07:19:17
Sven
Moin Moin,
bräuchte mal kurz eure Hilfe, ich erstelle per VBA ein neues Workbook und speicher das als .xlsm. Dann mache ich einiges in der Mappe und erstelle einen Befehlsbutton samt VBA Code der in die neue Mappe geschrieben wird, den Code dafür habe ich auch hier aus dem Forum.
Nun zu meinem Problem, mache ich das alles und lasse das Workbook anschließend geöffnet ist alles gut, dann speicher ich manuell und alles ist wie es sein soll.
Speicher ich ich aber am ende meines Codes mit .save und nutze anschließend .close um die erstellte Arbeitsmappe zu schließen speichert er den Code der zu dem Befehlsbutton eingefügt wurde nicht. Wenn ich dann die Datei öffne ist der Befehlsbutton da, aber ohne Code.
Woran kann das leigen?
hiermit erstelle ich die Mappe:
    Set wb = Workbooks.Add
wb.Activate
Tabelle_save = UserForm2.ComboBox1.Value & "_" & UserForm2.Part_Nummer.Value & "_" &  _
UserForm2.Part_Name.Value & "_" & UserForm2.Werkzeugnummer_Housing.Value & "+" & UserForm2. _
Werkzeugnummer_Lever.Value & "_" & UserForm2.MB_Nummer_System.Value & "_" & Year(UserForm2.Date_of_measurement.Value) & "-" & Monat & "-" & Tag
Tabelle_save = InputBox("Dateiname:", "Datei speichern", Tabelle_save) 'Abfrage Dateinamen
Tabelle_save = Tabelle_save & ".xlsm"  'Tabelle_save = "Name Deiner Wahl.xlsx"
ActiveWorkbook.SaveAs Filename:=Tabelle_save, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False

dann kommt wie gesagt alles mögliche, sollte aber hierfür uninteressant sein,
hier der Code für Button und Code, natürlich erstmal nur Test (hier aus dem Forum)

Dim strCode As String
Dim myButton As OLEObject
Dim Zelle2 As Range
Set Zelle2 = Range("H6:H7")
With Zelle2
Set myButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms. _
CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=.Left, Top:=.Top, Width:=. _
Width, Height:=.Height)
End With
strCode = _
"Private Sub " & myButton.Name & "_Click()" & Chr(10) & _
" MsgBox ""test erfolgreich bestanden""" & Chr(10) & _
"End Sub"
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName). _
CodeModule
.InsertLines .CountOfLines + 1, strCode
End With

wie gesagt funktioniert alles einwandfrei, genau wie es soll solange ich die Datei geöffnet lasse, da aber mehr Dateien erzeugt werden wäre das eine nicht zielführende möglichkeit.
Gibt es eventuell noch einen Befehl der den Code nochmal extra abspeichert, abgesehen von der normalen .Save funktion?
Gruß
Sven
Anzeige

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Code wird nicht gespeichert
06.08.2020 09:42:26
Sandra
Servus Sven,
ich bin absolut kein VBA Experte, was mir aber aufgefallen ist, dass du hier:
Tabelle_save = Tabelle_save & ".xlsm" 'Tabelle_save = "Name Deiner Wahl.xlsx
am Ende mit "xlsx" anstelle von "xlsm" speicherst.
Falss ich hier was völlig falsches erzähle, dann grätscht bitte entsprechend rein :)
LG
Sandra
Anzeige
AW: VBA Code wird nicht gespeichert
06.08.2020 09:55:38
Sven
Hallo Sandra,
danke erstmal das du dir Gedanken machst, aber wenn du genauer guckst ist der Teil auskommentiert mit .xlsx.
So war es im Original wo ich mir das Beispiel rausgesucht habe. Habe es dann auf .xlsm geändert da ich ja makros speichern möchte.
Gruß Sven
AW: VBA Code wird nicht gespeichert
06.08.2020 10:03:35
MRUTOR
Hallo Sven,
versuch mal beim Schliessen der Datei an das .Close folgendes anzuhaengen:
savechanges:=True
Grus Tor
Anzeige
AW: VBA Code wird nicht gespeichert
06.08.2020 10:11:44
Sven
Hallo Tor,
danke auch dir erstmal.
funktioniert leider auch nicht.
Das muss etwas mit der .save Funktion vor der .close funktion zu tun haben.
Denn selbst wenn ich .close raus nehme und die Datei manuell schließe fragt er mich ob Änderungen speichern. Drücke ich dann auf ja bleibt der Code erhalten, klicke ich auf nein ist der Code beim wieder öffnen verschwunden.
Aber ich dachte das genau das .save macht. Somit bin ich etwas verwundert.
Also scheint alles zu funktionieren nur das speichern nicht, weswegen es beim automatischen schließen auch weg ist.
Was zusätzlich verwunderlich ist, ist das der Button ja erhalten bleibt, somit muss das speichern ja doch zum teil funktionieren, er speichert scheinbar nur den Excel Bereich, nicht den Bereich aus dem VBA Editor.
Gruß Sven
Anzeige
AW: VBA Code wird nicht gespeichert
06.08.2020 10:12:05
Sven
nicht gelöst
AW: VBA Code wird nicht gespeichert
06.08.2020 10:24:44
MRUTOR
Vielleicht solltest du doch mal den gesamten Code zeigen.
AW: VBA Code wird nicht gespeichert
06.08.2020 10:42:57
Sven
Hallo Tor,
das kann ich leider nicht komplett wegen der Arbeit.
Aber ich habe da jetzt einiges rausgelöscht und den Grob vereinfacht. Und es funktioniert auch hier nicht. Den Code kann ich komplett hier reinstellen.
Nicht wundern ich bin kein VBA Profi ;-)

Sub Arbeitsblätter_erstellen()
Dim i, h, l, d As Integer    'zählvariable For/Next i=Arbeitsbläter h=housing zähler; l=lever zä _
hler; d=Datenfeld zähler
Dim wksNeu As Worksheet 'Variable für die zu erstellenden Tabellenblätter
Dim wb As Workbook
Dim currentWorkbook As String
Dim currentWorkbookDir As String
Dim Tabelle_save As String
Dim Zelle As Range
Dim Tag, Monat As String
Dim shp As Shape
'Schalten die Bildschirmaktualisierung aus
Application.ScreenUpdating = False
'Sprungmarke zum ErrorHandler
On Error GoTo Fehler
' 1. aktuelles Workbook - merken für spätere aktionen
currentWorkbook = ActiveWorkbook.Name
currentWorkbookDir = ActiveWorkbook.Path
ChDir currentWorkbookDir
' 2. Name festlegen und Speichern
'Monat und Tag bei einstellig eine 0 vorweg setzen
Monat = Month(Date)
Tag = Day(Date)
If Len(Tag) > 1 Then
Tag = Tag
Else
Tag = "0" & Tag
End If
If Len(Monat) > 1 Then
Monat = Monat
Else
Monat = "0" & Monat
End If
'Neue Arbeitsmappe erstellen und Speichern
Set wb = Workbooks.Add
wb.Activate
Tabelle_save = "Test2"
Tabelle_save = InputBox("Dateiname:", "Datei speichern", Tabelle_save) 'Abfrage Dateinamen
Tabelle_save = Tabelle_save & ".xlsm"  'Tabelle_save = "Name Deiner Wahl.xlsm"
ActiveWorkbook.SaveAs Filename:=Tabelle_save, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False
With ActiveWorkbook
'Tabellenblätter erstellen
Set wksNeu = Sheets.Add(After:=Sheets(Sheets.Count))
wksNeu.Name = "Test"
With wksNeu
'                    'Command Button einfügen
Dim strCode As String
Dim myButton As OLEObject
Dim Zelle2 As Range
Set Zelle2 = Range("H6:H7")
With Zelle2
Set myButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms. _
CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=.Left, Top:=.Top, Width:=. _
Width, Height:=.Height)
End With
strCode = _
"Private Sub " & myButton.Name & "_Click()" & Chr(10) & _
" MsgBox ""test erfolgreich bestanden""" & Chr(10) & _
"End Sub"
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName). _
CodeModule
.InsertLines .CountOfLines + 1, strCode
End With
'Arbeitsblatt schützen ausser Bemerkungen und Werte eintragen
Dim rng As Range
Dim rng2 As Range
Set rng = .Range(Cells(16, 3), Cells(16 + m - 1, 3))
Set rng2 = .Range(Cells(11, 5), Cells(14, 8))
.Unprotect
rng.Locked = False
rng2.Locked = False
.Protect
End With
Sheets("Tabelle1").Delete
.Save
.Close savechanges:=True
End With
'    Next i
Workbooks(currentWorkbook).Sheets("Tabelle1").Activate
MsgBox "Datei wurde erstellt"
'Schaltet die Bildschirmaktualisierung wieder ein
Application.ScreenUpdating = True
Exit Sub
'ErrorHandler
Fehler:
Application.ScreenUpdating = True
MsgBox Err.Description
End Sub

Aber wenn es hier dann irgendwie klappt wird es beim komplett Code auch klappen denke ich.
Danke für die Hilfe.
Gruß
Sven
Anzeige
AW: VBA Code wird nicht gespeichert
06.08.2020 10:59:52
MRUTOR
Hallo Sven,
versuch mal die With Anweisung mit dem jeweiligen Workbook Namen anstatt ActiveWorkbook. Vielleicht ist ja das Workbook garnicht mehr das aktive. Also so:

With Workbooks(Tabelle_save)
'Tabellenblätter erstellen
Set wksNeu = Sheets.Add(After:=Sheets(Sheets.Count))
wksNeu.Name = "Test"
With wksNeu
'                    'Command Button einfügen
Dim strCode As String
Dim myButton As OLEObject
Dim Zelle2 As Range
Set Zelle2 = Range("H6:H7")
With Zelle2
Set myButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms. _
CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=.Left, Top:=.Top, Width:=. _
Width, Height:=.Height)
End With
strCode = _
"Private Sub " & myButton.Name & "_Click()" & Chr(10) & _
" MsgBox ""test erfolgreich bestanden""" & Chr(10) & _
"End Sub"
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName). _
CodeModule
.InsertLines .CountOfLines + 1, strCode
End With
'Arbeitsblatt schützen ausser Bemerkungen und Werte eintragen
Dim rng As Range
Dim rng2 As Range
Set rng = .Range(Cells(16, 3), Cells(16 + m - 1, 3))
Set rng2 = .Range(Cells(11, 5), Cells(14, 8))
.Unprotect
rng.Locked = False
rng2.Locked = False
.Protect
End With
Sheets("Tabelle1").Delete
.Close savechanges:=True
End With

Und lass das .Save weg, denn das wird ja mit der Anweisung savechanges:=True erledigt.
Gruss Tor
Anzeige
AW: VBA Code wird nicht gespeichert
06.08.2020 11:14:10
Sven
Hallo Tor,
danke, werde ich gleich mal versuchen. Aber nur von der Logik her, wenn das Workbook nciht mehr das aktive wäre, dann dürfte es ja auch nicht schließen, denn der Befehl bezieht sich ja auf das selbe With. Oder sehe ich das verkehrt? Denn das schließen funktioniert ja.
Aber ich probiere das eben aus und gebe gleich Rückmeldung.
Gruß
Sven
Anzeige
AW: VBA Code wird nicht gespeichert
06.08.2020 11:18:24
Sven
Hallo Tor,
habe es ausprobiert, hat sich nichts geändert.
Genau wie vorher.
Trotzdem danke erstmal das du dir Gedanken machst.
Gruß
Sven
AW: VBA Code wird nicht gespeichert
06.08.2020 11:27:16
Rudi
Hallo,
lass mal
Tabelle_save = Tabelle_save & ".xlsm"  'Tabelle_save = "Name Deiner Wahl.xlsm"

weg. Die Endung wird durch den FileFormat-Parameter automatisch erzeugt.
Gruß
Rudi
Anzeige
AW: VBA Code wird nicht gespeichert
06.08.2020 11:33:44
Sven
Hallo Rudi,
Danke erstmal, habe ich ausgebaut. Makro läuft genauso hattest du recht, das Problem hat es aber Leider noch nicht gelöst.
Gruß
Sven
Workaround
06.08.2020 14:27:55
Rudi
Hallo,
erst das neue Blatt mit Button und Code erstellen und dann in eine neue Mappe verschieben. Dann klappt das.
Sub Sven()
Dim wksNeu As Worksheet 'Variable für die zu erstellenden Tabellenblätter
Dim strFileName As String
Dim strCode As String
Dim myButton As OLEObject
'Schalten die Bildschirmaktualisierung aus
Application.ScreenUpdating = False
'Neue Arbeitsmappe erstellen und Speichern
strFileName = "Test2"
strFileName = InputBox("Dateiname:", "Datei speichern", strFileName) 'Abfrage Dateinamen
'Tabellenblatt erstellen
Set wksNeu = Sheets.Add(After:=Sheets(Sheets.Count))
wksNeu.Name = "Test"
'                    'Command Button einfügen
With wksNeu.Range("H6:H7")
Set myButton = .Parent.OLEObjects.Add _
(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, _
Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height)
End With
strCode = "Private Sub " & myButton.Name & "_Click()" & Chr(10) & _
" MsgBox ""test erfolgreich bestanden""" & Chr(10) & _
"End Sub"
With ThisWorkbook.VBProject.VBComponents(wksNeu.CodeName).CodeModule
.InsertLines .CountOfLines + 1, strCode
End With
wksNeu.Move 'Blatt in neues Workbook verschieben
With ActiveWorkbook
.SaveAs strFileName, 52
.Close
End With
MsgBox "Datei wurde erstellt"
End Sub

Gruß
Rudi
Anzeige
AW: Workaround
07.08.2020 12:22:02
Sven
Hallo Rudi,
danke erstmal. Funktioniert soweit mit einem Blatt.
Ich erzeuge aber über eine For Next schleife mehrere Blätter, die genau gleich aufgebaut sind nur anders heißen.
Wie würde ich das da machen müssen?
Ich habe jetzt mal nachdem meine For Next schleife alle Blätter erzeugt hat es so versucht.
    For Each blatt In ThisWorkbook
If (blatt.Name  "Tabelle1") Then
blatt.Move
End If
Next
With ActiveWorkbook
.Sheets("Tabelle1").Delete
.SaveAs Tabelle_save, 52
.Close
End With
Das Funktioniert aber noch nicht.
Gruß
Sven
Anzeige
unverständlich owT
07.08.2020 12:48:36
Rudi
AW: Workaround
07.08.2020 12:49:08
Sven
Hi Rudi,
hab das Problem mit der Schleife selber gelöst.
Vielen Dank nochmal, jetzt funktioniert es!!!
    Dim wbNeu As Workbook
Dim blatt As Worksheet
Workbooks(currentWorkbook).Sheets(erstesBlatt).Move
Set wbNeu = ActiveWorkbook
For Each blatt In Workbooks(currentWorkbook).Sheets
If (blatt.Name  "Tabelle1") And (blatt.Name  erstesBlatt) Then
blatt.Move After:=wbNeu.Sheets(wbNeu.Sheets.Count)
End If
Next
With wbNeu
.SaveAs Tabelle_save, 52
.Close
End With
hiermit werden alle Blätter so verschoben das es passt.
Vielen Danke nochmal.
Gibts dafür ne Logische erklärung das es so gespeichert wird und anders nicht? Muss ja irgend einen Grund haben.
schönes Wochenende.
Gruß
Sven
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

VBA Code in Excel richtig speichern


Schritt-für-Schritt-Anleitung

  1. Neues Workbook erstellen: Verwende den folgenden VBA-Code, um eine neue Arbeitsmappe zu erstellen und sie als .xlsm-Datei zu speichern:

    Set wb = Workbooks.Add
    wb.Activate
    Tabelle_save = InputBox("Dateiname:", "Datei speichern", "Test2") 'Abfrage Dateinamen
    Tabelle_save = Tabelle_save & ".xlsm" 
    ActiveWorkbook.SaveAs Filename:=Tabelle_save, _
    FileFormat:=xlOpenXMLWorkbookMacroEnabled
  2. Befehlsbutton einfügen: Füge einen Befehlsbutton ein und schreibe den entsprechenden VBA-Code in das Modul:

    Dim strCode As String
    Dim myButton As OLEObject
    Set myButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1")
    strCode = "Private Sub " & myButton.Name & "_Click()" & Chr(10) & _
              " MsgBox ""test erfolgreich bestanden""" & Chr(10) & "End Sub"
    With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
        .InsertLines .CountOfLines + 1, strCode
    End With
  3. Speichern und Schließen: Stelle sicher, dass du beim Schließen des Workbooks den Befehl savechanges:=True hinzufügst:

    ActiveWorkbook.Close savechanges:=True
  4. Testen: Führe das Makro aus und teste, ob der Code des Buttons beim Öffnen der Datei erhalten bleibt.


Häufige Fehler und Lösungen

  • Fehler: Änderungen werden nicht gespeichert: Wenn die Excel-Datei nicht gespeichert wird, überprüfe, ob du die .Close-Methode mit savechanges:=True verwendest.

  • Fehler: Code nach dem Schließen verloren: Stelle sicher, dass die Datei im .xlsm-Format gespeichert wird. Wenn du versuchst, im .xlsx-Format zu speichern, werden die VBA-Änderungen nicht gespeichert.

  • Aktives Workbook: Manchmal könnte das aktive Workbook nicht das sein, das du speicherst. Verwende konkrete Workbook-Referenzen, um Verwirrung zu vermeiden.


Alternative Methoden

  • Code in eine neue Mappe verschieben: Eine alternative Methode besteht darin, das neue Blatt mit dem Button und Code zuerst zu erstellen und anschließend in eine neue Mappe zu verschieben. Dies kann helfen, das Problem der Speicherung zu umgehen:

    wksNeu.Move
    With ActiveWorkbook
        .SaveAs strFileName, 52
        .Close
    End With

Praktische Beispiele

Ein Beispiel zur Erstellung mehrerer Blätter könnte so aussehen:

Dim wbNeu As Workbook
Dim blatt As Worksheet
For i = 1 To 5
    Set blatt = Sheets.Add(After:=Sheets(Sheets.Count))
    blatt.Name = "Blatt" & i
    ' Button und Code einfügen
Next i
Set wbNeu = ActiveWorkbook
wbNeu.SaveAs "MeinWorkbook.xlsm", 52
wbNeu.Close

Tipps für Profis

  • Achte darauf, dass deine Arbeitsmappe niemals im .xlsx-Format gespeichert wird, wenn sie VBA-Code enthält. Dies führt dazu, dass der Code verloren geht.

  • Nutze die With-Anweisung, um den Code übersichtlicher zu gestalten und die Leistung zu verbessern.

  • Teste den Code in einer isolierten Umgebung, um zu sehen, ob er das erwünschte Verhalten zeigt, bevor du ihn in dein Hauptprojekt integrierst.


FAQ: Häufige Fragen

1. Warum wird mein VBA-Code nicht gespeichert?
Die häufigste Ursache ist, dass die Datei im falschen Format (z.B. .xlsx) gespeichert wird. Stelle sicher, dass du das Format .xlsm verwendest.

2. Wie kann ich sicherstellen, dass Änderungen gespeichert werden?
Verwende die Methode .Close savechanges:=True, um sicherzustellen, dass alle Änderungen, einschließlich des VBA-Codes, gespeichert werden.

3. Was ist der Unterschied zwischen .Save und .Close savechanges:=True?
.Save speichert die Datei, während .Close savechanges:=True die Datei schließt und gleichzeitig speichert. Es ist wichtig, die richtige Methode zur richtigen Zeit zu verwenden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige