Hallo,
ich speichere aus einer XLSM-Mappe mit Rechnungs-Vorlagen einzelne Sheets als XLSX, also ohne Makros ab, weil die dann weiterverarbeitet werden sollen.
Welche Parameter muss ich hinter
SaveAs ausser Name angeben, damit keine Rückfrage kommt, ob ich zulasse dass die Datei ohne Makrios als XLSX gespeichert wird. Die Warnung beim evtl. Überschreiben soll aber bleiben.
Ich habe die unerklärliche Erscheinung, dass bei wirklich gleichem Makrocoding NeueRechnung_Speichern bei einer Mappe die Rückfrage kommt, bei einer anderen nicht. Für unbedarfte Anwender, die die Rechnungen weiterbearbeiten sollen, ist das wohl irritierend.
Haben Sie einen Rat für mich ?
Danke, Rudolf Nitze
Sehr geehrter Herr Nitze,
Schaltflächen vom Typ „Formular“ erkennen Sie daran, dass der Mauszeiger die Form einer Hand annimmt, wenn Sie ihn über die Schaltfläche führen. Bei Schaltflächen vom Typ „ActiveX“ nimmt der Mauszeiger die Form eines nach links oben zeigenden Pfeils an.
Steuerelemente vom Typ „Formular“ entfernen Sie mit der folgenden Schleife:
For Each sh In wbBlatt.Worksheets(1).Shapes
If sh.Type = msoFormControl Then sh.Delete
Next sh
Bei Steuerelementen vom Typ „ActiveX“ sieht die Schleife so aus:
For Each sh In wbBlatt.Worksheets(1).Shapes
If sh.Type = msoOLEControlObject Then sh.Delete
Next sh
Nun geht aber aus Ihrer Problembeschreibung ziemlich eindeutig hervor, dass Ihre Schaltflächen vom Typ „ActiveX“ sind.
Es ist daher leider nicht damit getan, die Schaltfläche zu entfernen. Sie müssen auch die CommandButtonX_Click-Prozedur aus dem Code-Modul des jeweiligen Tabellenblattes entfernen. An diese Prozedur hatte ich leider bei meiner letzten Mail nicht gedacht.
Es gibt jetzt 2 Möglichkeiten, eine relativ einfache und eine etwas kompliziertere:
1. Die einfache Möglichkeit
Sie ersetzen die existierenden Schaltflächen durch Schaltflächen vom Typ „Formular“ (Register „Entwicklertools“ > Gruppe „Steuerelemente“ > Menü „Einfügen“ > Schaltfläche aus der oberen Gruppe verwenden). Sie ordnen der Schaltfläche folgendermaßen das auszuführende Programm zu:
Rechtsklick auf die Schaltfläche > Kontextmenüeintrag „Makro zuordnen…“).
Anschließend löschen Sie noch manuell die oben genannte CommandButtonX_Click-Prozedur aus dem Code-Modul des jeweiligen Tabellenblattes (im Projektexplorer Doppelklick auf „TabelleX(Rechnung …)“ und die Prozedur löschen.
2. Die kompliziertere Möglichkeit
Sie behalten Ihre ActiveX-Schaltflächen bei und löschen die oben genannte CommandButtonX_Click-Prozedur per Programm. Leider ist es dafür erforderlich, dass auf jedem Rechner, auf dem dieses Programm ausgeführt werden soll, bei den Makroeinstellungen (Datei > Optionen > Trust Center > Schaltfläche „Einstellungen für das Trust Center…“ > Makroeinstellungen) die CheckBox „Zugriff auf das VBA-Objektmodell vertrauen“ eingeschaltet sein muss.
Das gesamte Programm sieht dann folgendermaßen aus:
Sub Speichern()
Dim blattName As String
Dim cm As Object ´ VBIDE.CodeModule
Dim pfad As String
Dim sh As Shape
Dim vbc As Object ´ VBIDE.VBComponent
Dim wbBlatt As Workbook
Dim ws As Worksheet
pfad = ThisWorkbook.Path & „“
Set ws = ActiveSheet
blattName = ws.Name
ws.Copy
Set wbBlatt = ActiveWorkbook
Set ws = wbBlatt.Worksheets(1)
´ ActiveX-Steuerelemente aus dem Blatt ws entfernen
For Each sh In ws.Shapes
If sh.Type = msoOLEControlObject Then sh.Delete
Next sh
´ CommandButtonX_Click-Prozedur aus dem Codemodul von
´ Blatt ws entfernen
For Each vbc In wbBlatt.VBProject.VBComponents
If vbc.Type = 100 Then ´ vbext_ct_Document = 100
If vbc.Name = ws.CodeName Then
Set cm = vbc.CodeModule
cm.DeleteLines Startline:=1, _
Count:=cm.CountOfLines
Exit For
End If
End If
Next vbc
´ Arbeitsmappe mit dem einzelnen Blatt speichern
wbBlatt.SaveAs Filename:=pfad & blattName & „.xlsx“, _
FileFormat:=xlOpenXMLWorkbook
wbBlatt.Close
End Sub
Mit freundlichen Grüßen
Dieter Klemke