Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: mit VBA "Speichern unter" Dateityp vorbelegen

mit VBA "Speichern unter" Dateityp vorbelegen
06.12.2012 19:39:33
Ruder
Hallo,
mein erster Beitrag hier, da ich zur Zeit an einem Problem dran bin,dass ich nicht lösen kann, hatte es schon in einem anderen Forum probiert ( dort bin ich schon etwas länger angemeldet) aber da konnte man mir bisher nicht helfen.
Folgendes Problem: Also eine Gültigkeitsprüfung oder derartiges brauche ich eigentlich nicht, hier haben alle Office 2010...es liegt folgende SItuation vor:
Ich hab ein Berechnugnsprogramm geschrieben, dieses soll jetzt als Template/Vorlage in einen allgemein zugängigen Ordner abgelegt werden und da einige schon etwas älter sind und man nicht zu jedem hinrennen will und ihm erklären, was er wie speichern muss, damit es weiterhin funktioniert,dachten wir halten "wir sperren die anderen Formate beim speichern".
Das Template Format ist nur dabei, damit ich die Ausgangsdatei als Template speichern kann.
Also ich öffne die Template Datei ( Excel macht ja dann Automatisch daraus ein "DateiName1" arbeite dann damit und hinterlege die Berechnung unter einen anderem Dateinamen als xlsm - Datei.
Was schon alles unternommen wurde könnt hier hier nach lesen: Siehe: http://www.office-loesung.de/ftopic563542_0_0_asc.php#2388039
hab schon einige Codes ausprobiert, aber leider hat noch nichts hin gehauen, und da ich hier schhon desöfteren Lösung für Probleme gefunden habe,dachte ich mir komm ich mal hier her ;)
DANKE!

Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: mit VBA "Speichern unter" Dateityp vorbelegen
06.12.2012 20:06:05
schauan
Hallo Ruder,
nur mal als Ansatz. Dein erster code sah doch ganz gut aus. Am Anfang fehlt nur Application.EnableEvents=False.
Die Prüfung FileFormat:=IIf(Val(Application.Version) gt 11, 52, xlNormal) ist m.E. so nicht korrekt. Eventuell solltest Du das nicht erst an dieser Stelle auswerten.
Für Office 2010 benötigst Du ja eine Unterscheidung nach xlsm und xltm und entsprechend, wie schon diskutiert, die 52 oder 53.
Hier könntest Du prüfen, welche letzten 4 Zeichen des Namens hier zutreffend sind.
Wenn Du Versionsunterschiede berücksichtigen willst, solltest Du eventuell 2 Speichervarianten ausführen.
Im Prinzip
Wenn Version gt 11 dann
wenn xlsm dann varTyp = 52 sonst varTyp = 53
saves ... filetyp:=vartyp
oder
saveas ... was auch immer
Ende Wenn
Grüße, André

Anzeige
AW: mit VBA "Speichern unter" Dateityp vorbelegen
06.12.2012 20:20:39
Ruder
Hallo André,
Danke für deine Antwort!
ja der "erste Code" hat bisher auch am besten funktioniert, nur hab ich bzw. wir da nicht die Excel Vorlagen Datei integerien können.
Irgendwas prüfen muss ich auch gar nicht ( außer es geht nicht anders) kann man nicht einfach "sagen" BeforeSave, Filterindex nur mit xlsm und xltm und dann speichern Aufrufen.
Auf allen PC's ist Office 2010 drauf und die xltm - Endung brauche ich ja nur um aus der xlsm - Datei erstmal eine Vorlage zuerzeugen ( vielleicht gibt es da auch einen anderen Weg?)
Hier vielleicht nochmal der Code um den es geht:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim varWorkbookName As String
Dim xbCModus As Integer
If SaveAsUI = True Then
varWorkbookName = Application.GetSaveAsFilename( _
fileFilter:=IIf(xbCModus, "Excel Macro Enabled Template (*.xltm), *.xltm", "Excel Macro  _
Enabled Workbook (*.xlsm), *.xlsm"))
Cancel = True
If varWorkbookName  "Falsch" Then _
ActiveWorkbook.SaveAs Filename:=varWorkbookName, FileFormat:=IIf(Val(Application. _
Version) > 11, 52, xlNormal)
End If
Quit:
If Err.Number > 0 Then
If Err.Number  1004 Then
MsgBox "Error: " & Err.Number & Err.Description & vbCrLf & vbCrLf & vbCrLf & _
"Title", vbCritical
End If
End If
Application.EnableEvents = True
End Sub 

Anzeige
AW: mit VBA "Speichern unter" Dateityp vorbelegen
07.12.2012 04:54:45
schauan
Hallo Ruder,
dann der betreffende codeteil nochmal in Bunt ;-)
If varWorkbookName <> "Falsch" Then
    If Application.Version > 11 Then
        If Right(varWorkbookName) = "xlsm" Then vartyp = 52 Else vartyp = 53
           ActiveWorkbook.SaveAs Filename:=varWorkbookName, FileFormat:=vartyp
    Else
        'save fuer altes office 
    End If
End If
Grüße, André

Anzeige
AW: mit VBA "Speichern unter" Dateityp vorbelegen
07.12.2012 06:37:35
schauan
Hallöchen
statt
Right(varWorkbookName)
bitte
Right(varWorkbookName, 4)
Grüße, André

TIPP : Besser xl-Bezeichner verwenden
07.12.2012 12:05:50
NoNet
Hallo André,
ich habe Deinen Code jetzt nicht analysiert, beim Drüberlesen fiel mir jedoch auf, dass Du den numerischen Typ (52 bzw. 53) verwendest. Ich kann von der Verwendung solcher fixen Werten nur abraten und empfehle die Verwendung der xlBezeichner (bzw. xl-Konstanten) - im konkreten Fall also :
varTyp = xlOpenXMLWorkbookMacroEnabled '52
bzw.
varTyp = xlOpenXMLTemplateMacroEnabled '53

Gruß, NoNet

Anzeige
TIPP: xl-Bezeichner in der VBA-Hilfe
07.12.2012 14:36:10
NoNet
Hallo schauan,
Danke für die Links. Die Offline-Version ist allerdings nicht unbedingt notwendig, wenn die lokale VBA Onlinehilfe installiert und funktionstüchtig ist. Hier das Offline-Pendant : Hilfe zu xlFileFormat :
Hier der Screenshot (bitte ein-/ausblenden) : Einblenden  Ausblenden :

Gruß, NoNet

Anzeige
AW: TIPP: xl-Bezeichner in der VBA-Hilfe
07.12.2012 15:20:04
Ruder
Hallo NoNet und André,
ich danke euch, es klappt jetzt ohne das Excel meckert (endlich!) und die Lösung war so nahe nur ein kleiner Teil hat sich ja geändert!
Das mit dem Format (52,53) werde ich dann dementsprechend abändern, kannst du auch erklären warum du davon abräts? (Frage nur aus Neugier).
Danke!
Der Code sieht jetzt so aus:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim varWorkbookName As String
Dim xbCModus As Integer
Application.EnableEvents = False
If SaveAsUI = True Then
varWorkbookName = Application.GetSaveAsFilename( _
fileFilter:="Excel Macro Enabled Workbook (*.xlsm), *.xlsm, Excel Macro Enabled  _
Template (*.xltm), *.xltm")
Cancel = True
If varWorkbookName  "Falsch" Then
If Application.Version > 11 Then
If Right(varWorkbookName, 4) = "xlsm" Then vartyp =  _
xlOpenXMLWorkbookMacroEnabled Else vartyp = xlOpenXMLTemplateMacroEnabled '52,53
ActiveWorkbook.SaveAs Filename:=varWorkbookName, FileFormat:=vartyp
Else 'save fuer altes office
End If
End If
End If
Application.EnableEvents = True
End Sub
Falls ihr nichts mehr daran auszusetzen habt, würde ich das Thema als abgeschlossen betrachten :-)

Anzeige
AW: TIPP: xl-Bezeichner in der VBA-Hilfe
07.12.2012 15:23:51
Ruder
Hi,
eine kurze Frage noch:
Was bringt genau das "Application.EnableEvents " wofür brauch ich das in meinen Fall?

AW: TIPP: xl-Bezeichner in der VBA-Hilfe
07.12.2012 16:10:04
schauan
Hallo Ruder,
der code läuft beim Speichern sonst öfter durch - einmal, weil Du auf Speichern gedrückt hast, und dann speichert der code mit saveas ....
Vorteilhaft wäre deswegen auch eine Fehlerbehandlung. Wenn der code mal nicht durchläuft, passiert danach nämlich in Richtung Events so gut wie nix mehr :-(
Also oben irgendwo
On Error goto Errorhandler
und über App...=True
Errorhandler:
Grüße, André

Anzeige
AW: TIPP: xl-Bezeichner in der VBA-Hilfe
07.12.2012 17:01:27
Ruder
Hi André,
Danke für die Erklärung! Das mit dem Error go to werde ich noch einbauen, ich denke dann sollte es klappen :-)

Neugier-Befriedigung ;-)
07.12.2012 16:46:30
NoNet
Hallo Ruder,
Das mit dem Format (52,53) werde ich dann dementsprechend abändern, kannst du auch erklären warum du davon abräts? (Frage nur aus Neugier).
1.) weiss nach einiger Zeit kaum noch jemand, was 52 bzw. 53 bedeuten - die xl-Bezeichner sind hier selbsterklärend und daher besser lesbar.
2.) Niemand kann Dir versichern, dass auch in zukünftigen Excel-Versionen noch die gleichen numerischen Werte für diese Versionen verwendet werden - oder ob diese überhaupt noch unterstützt werden (es kam in der Vergangenheit schon mehrfach vor, dass Bezeichenr bzw. damit auch deren numerische Werte entfielen !).
Im schlimmsten Fall wird für die Werte 52 und 53 ein anderer Dateityp unterstützt - und das wäre fatal (allerdings ist mir kein konkreter Fall bekannt, in dem die numerischen Werte tatsächlich eine andere Bedeutung erhielten !)
3.) über die xl-Bezeichner ist klar, welches Argument gemeint ist, manchmal wird der Argumentenname auch weggelassen (also z.B. ActiveWorkbook.SaveAs varWorkbookName, vartyp - hier ist nicht auf den ersten Blick erkenntlich, welcher Wert für welches Argument steht. In Deinem Code hast Du sinnvollerweise die Namen der Argumente mit angegeben : ActiveWorkbook.SaveAs Filename:=varWorkbookName, FileFormat:=vartyp
Gruß, NoNet

Anzeige
AW: Neugier-Befriedigung ;-)
07.12.2012 17:04:59
Ruder
Hi Nonet,
zu 1) naja man könnte es ja in einem Kommentar erklären :D
2,3) Stimm ich dir zu, das macht Sinn und klingt einleuchtend, dachte erst das sei irgendwie Fehler anfälliger oder "unsauber" programmiert oder so.
Ich denke dann passt der Code jetzt, werde noch (André hatte mich drauf hingewiesen) ein Error - Abfang Zeile mit reinnhemen und dann sollte es ja erstmal funktionieren :-)
Danke Neugier - Befriedigt!

Anzeige
AW: Neugier-Befriedigung ;-)
07.12.2012 17:05:16
Ruder
Hi Nonet,
zu 1) naja man könnte es ja in einem Kommentar erklären :D
2,3) Stimm ich dir zu, das macht Sinn und klingt einleuchtend, dachte erst das sei irgendwie Fehler anfälliger oder "unsauber" programmiert oder so.
Ich denke dann passt der Code jetzt, werde noch (André hatte mich drauf hingewiesen) ein Error - Abfang Zeile mit reinnhemen und dann sollte es ja erstmal funktionieren :-)
Danke Neugier - Befriedigt!

Anzeige
AW: Neugier-Befriedigung ;-)
08.12.2012 09:43:56
Hajo_Zi
aus dem Beitrag konnte ich jetzt nicht lesen was offen?
Gruß Hajo
Anzeige
Anzeige

Infobox / Tutorial

Mit VBA den "Speichern unter"-Dateityp vorbelegen


Schritt-für-Schritt-Anleitung

  1. Öffne deine Excel-Datei. Stelle sicher, dass du in einer Office 2010 Umgebung arbeitest.

  2. Drücke ALT + F11, um den VBA-Editor zu öffnen.

  3. Füge den folgenden Code in das ThisWorkbook-Modul ein:

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
       Dim varWorkbookName As String
       Dim vartyp As Integer
       Application.EnableEvents = False
       If SaveAsUI = True Then
           varWorkbookName = Application.GetSaveAsFilename( _
               fileFilter:="Excel Macro Enabled Workbook (*.xlsm), *.xlsm, Excel Macro Enabled Template (*.xltm), *.xltm")
           Cancel = True
           If varWorkbookName <> "Falsch" Then
               If Application.Version > 11 Then
                   If Right(varWorkbookName, 4) = "xlsm" Then
                       vartyp = xlOpenXMLWorkbookMacroEnabled
                   Else
                       vartyp = xlOpenXMLTemplateMacroEnabled
                   End If
                   ActiveWorkbook.SaveAs Filename:=varWorkbookName, FileFormat:=vartyp
               End If
           End If
       End If
       Application.EnableEvents = True
    End Sub
  4. Speichere den VBA-Code. Schließe den VBA-Editor und teste die Funktion.


Häufige Fehler und Lösungen

  • Fehler: "Möchten Sie diese Datei wirklich speichern?"

    • Lösung: Stelle sicher, dass Application.EnableEvents = False vor dem Speichern gesetzt wird, um rekursive Aufrufe zu vermeiden.
  • Fehler: Falscher Dateityp wird gespeichert.

    • Lösung: Überprüfe die FileFormat-Zuweisung im Code. Nutze die xl-Bezeichner anstelle von festen Zahlen, um zukünftige Komplikationen zu vermeiden.

Alternative Methoden

Eine alternative Methode wäre, den Dateityp direkt im Save As Dialog anzugeben, ohne VBA zu nutzen. Du kannst die Dateitypen manuell auswählen, aber das erfordert mehr Benutzerinteraktion, was die Effizienz verringert.

Wenn du trotzdem VBA verwenden möchtest, aber ohne das Workbook_BeforeSave-Ereignis, könntest du eine separate Schaltfläche erstellen, die die Datei mit dem gewünschten Dateityp speichert.


Praktische Beispiele

Hier ist ein Beispiel für die Verwendung von FileFormat und Save As VBA:

Sub SpeichernAlsVorlage()
    Dim varWorkbookName As String
    varWorkbookName = Application.GetSaveAsFilename( _
        fileFilter:="Excel Macro Enabled Template (*.xltm), *.xltm")

    If varWorkbookName <> "Falsch" Then
        ActiveWorkbook.SaveAs Filename:=varWorkbookName, FileFormat:=xlOpenXMLTemplateMacroEnabled
    End If
End Sub

Dieses Beispiel zeigt, wie du den Excel-Dateityp gezielt auf .xltm setzen kannst, um eine Vorlage zu speichern.


Tipps für Profis

  • Verwende xl-Bezeichner anstelle von numerischen Werten, um deinen Code leserlicher und zukunftssicherer zu gestalten.

  • Integriere eine Fehlerbehandlung, um Probleme beim Speichern abzufangen. Zum Beispiel:

    On Error GoTo ErrorHandler
    ' Dein Code hier
    Exit Sub
    ErrorHandler:
    MsgBox "Fehler: " & Err.Description
  • Teste deinen Code gründlich in verschiedenen Szenarien, um sicherzustellen, dass der filterindex VBA korrekt funktioniert.


FAQ: Häufige Fragen

1. Warum sollte ich xl-Bezeichner verwenden? Die Verwendung von xl-Bezeichnern macht den Code lesbarer und schützt vor Änderungen in zukünftigen Excel-Versionen, da die numerischen Werte möglicherweise nicht mehr gültig sind.

2. Was ist der Zweck von Application.EnableEvents? Application.EnableEvents verhindert, dass dein Code in eine Endlosschleife gerät, indem es sicherstellt, dass Ereignisse nicht rekursiv ausgelöst werden, während du speicherst.

3. Wie kann ich den Dateityp ändern, den ich speichern möchte? Ändere einfach die FileFormat-Zuweisung in deinem VBA-Code entsprechend dem gewünschten Excel-Dateityp.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige