Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1272to1276
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
Inhaltsverzeichnis

Excel stürzt nach SaveAs-Dialog ab

Excel stürzt nach SaveAs-Dialog ab
Ben
Hallo zusammen!
Nach mehrfacher Empfehlung des Herber-Forums bin ich nun auch ein Teil dieser Community geworden - natürlich gleich mit der Hoffnung auf Hilfe! :-)
Ich habe beruflich ein Excel Template zu erstellen, dass sowohl unter Excel 2007 als auch unter Excel 2003 laufen muss (Wir arbeiten mit 2007, die Töchter mit 2003, aber wir bearbeiten die selbe Datei).
Zur Kompatibilität möchte ich erreichen, dass die Arbeitsmappe, die aus der Vorlage erzeugt wird (Vorlage im Dateiformat *.xltm), immer als *.xlsm gespeichert wird - auch dann, wenn sie mit Excel 2003 bearbeitet wurde. Dazu habe ich folgenden VBA-Code geschrieben:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'Vorbelegung Dateiname und Dateityp beim Speichern
Dim Komponententyp As String
Dim Kunde As String
Dim Auftragsnummer As String
Dim Revision As String
Dim Dateiname As String
'Variablen zur Benennung des Dateinamens bestimmen
If Sheets("Data-Sheet source").Range("E84").Value = " -  -  - " Then
Serialnummern = "xxxxx"
Else
Serialnummern = Sheets("Data-Sheet source").Range("E84")
End If
Komponententyp = Sheets("Data-Sheet source").Range("N84")
Kunde = Sheets("Data-Sheet source").Range("J84")
Auftragsnummer = Sheets("Data-Sheet source").Range("R84")
Revision = Application.WorksheetFunction.Max(Sheets("Data-Sheet source").Range("X3:X125"))
Dateiname = Serialnummern & "_" & Komponententyp & "_" & Auftragsnummer & "_" & Kunde _
& "_Rev. " & Revision & ".xlsm"
'Speichern-Dialog öffnen, falls Datei neu angelegt werden muss bzw. verändert wurde
If ThisWorkbook.Name  Dateiname Then
Application.Dialogs(xlDialogSaveAs).Show (Dateiname), xlOpenXMLWorkbookMacroEnabled
Exit Sub
Else
Exit Sub
End If
End Sub

Der Code prüft, ob eine Änderung der Datei erfolgt ist, indem die Dateinamen verglichen werden. Bei einer erfolgten Änderung steigt der Parameter Revision um 1 nach oben -> die Datei weiß, dass der Dialog "Speichern unter" ausgeführt werden soll. Falls keine Änderung erfolgt ist, die eine Änderung des Dateinamens notwendig macht, soll die Datei einfach nur gespeichert werden - ohne den "Speichern unter"-Dialog.
Nun zur Fehlerbeschreibung:
Ich öffne die *.xltm-Vorlage mit Ecxel 2007 und klicke auf Speichern. Da der Dateiname der Vorlage nicht dem gewünschten Dateinamen entspricht, öffnet sich der "Speichern unter"-Dialog. Der Dateiname und auch der Dateityp wird korrekt vorbelegt.
Wird der Dialog nun mit "speichern" bestätigt, speichert Excel die Datei korrekt als *.xlsm - aber stürzt direkt danach ab. Die Datei selbst aber ist richtig abgespeichert und kann auch ganz normal wieder geöffnet werden.
Dieser Fehler tritt nicht auf, wenn ich den vorbelegten Dateinamen ändere und das Dateiformat auf *.xltm ändere.
Der erzeugte Dateiname scheint mir aber nicht fehlerhaft zu sein. Hier ein Beispiel eines generierten Dateinamens:
"xxxxx_V 100 ALS SS P1 _82131254_xxxxx_Rev. 0.xlsm"
Woran kann das liegen bzw. wie bekomme ich dieses Problem beseitigt?
Herzlichen Dank für jegliche Hilfe!
Gruß, Ben
AW: Excel stürzt nach SaveAs-Dialog ab
25.07.2012 11:57:29
UweD
Hallo
durch das "Application.Dialogs(xlDialogSaveAs).Show (Dateiname), xlOpenXMLWorkbookMacroEnabled
" wird wieder das Ereignis " Workbook_BeforeSave " ausgeführt.
Du befindest dich in einem loop.
Durch diese Ergänzungen müsste es gehen.
Application.EnableEvents = False '***
Application.Dialogs(xlDialogSaveAs).Show (Dateiname), xlOpenXMLWorkbookMacroEnabled
Application.EnableEvents = True '***
Gruß UweD
AW: Excel stürzt nach SaveAs-Dialog ab
25.07.2012 12:02:18
Ben
Hallo Uwe,
herzlichen Dank erstmal für deine schnelle Antwort!
Ich habe die gepostetend Code-Zeilen bei mir eingefügt, aber leider ohne Erfolg.
Der Fehler ist noch gleich wie zuvor.
Hast du noch einen Gedanken dazu?
Gruß, Ben
Anzeige
AW: Alternativer Lösungsweg möglich?
25.07.2012 14:20:51
Ben
Hallo zusammen,
gibt es vielleicht noch einen anderen Lösungsweg, als das obige Makro?
Ziel ist es, dass diese Datei immer als *.xlsm gespeichert wird, egal welche Excelversion der User zur Verfügung hat.
Vorgaben wären:
  • Der Dateiname muss sich immer aus den oben genannten Bestandteilen zusammen setzen.

  • Wenn der zusammengesetzte Dateiname dem realen Dateinamen entspricht, dann einfach speichern.

  • Wenn der zusammengesetzte Dateiname vom realen Dateinamen abweicht, "Speichern unter"-Dialog öffnen und Dateinamen vorgeben (=zusammengesetzter Dateiname), sowie Dateityp (=xlsm) vorgeben.

  • Danke für jede Hilfe!
    Gruß, Ben
    Anzeige
    AW: Alternativer Lösungsweg möglich?
    25.07.2012 15:03:51
    Wenderhold
    Hallo Ben
    warum denn einen Dialog anzeigen ?
    Dateinamen zusammenbauen
    ist der gleich
    workbook.save(dateiname)
    else
    workbook.saveas(dateiname)
    endif
    Mfg
    wd
    AW: Alternativer Lösungsweg möglich?
    25.07.2012 15:07:44
    Ben
    Hallo Wenderhold,
    ich dachte, dass der Dialog sinnvoll ist, da der User auswählen können muss, wo er die Datei speichern möchte. Mit dem Workbook.saveas(dateiname) speichert er die Datei doch einfach im aktuellen Pfad, oder?
    Gruß, Ben
    AW: Alternativer Lösungsweg möglich?
    25.07.2012 15:32:39
    Ben
    Kernpunkt ist halt, dass der User bei jedem Speichern einer neuen Version den Speicherort auswählen können muss bzw. erkennen muss, dass er jetzt eine neue Revision der Datei anlegt.
    Gruß, Ben
    Anzeige
    AW: Alternativer Lösungsweg möglich?
    26.07.2012 08:28:08
    fcs
    Hallo Ben,
    ein Problem ist möglicherweise, wie die Vorlage geöffnet wird
    - via Datei öffnen - Dann sollte die Vorlage-Datei unbedingt schreibgeschützt sein (im Dateimanager)
    - via Datei neu
    Mit folgenden Anpassungen werden die Dialoge angezeigt, ohne das Excel abstürzt.
    Getestet unter Excel 2010, ob das unter Excel 2003 funktioniert weiss ich nicht. evtl. muss hier eine Versionsprüfung eingebaut werden, und etwas anders vorgegangen werden-
    Gruß
    Franz
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    'Vorbelegung Dateiname und Dateityp beim Speichern
    Dim Komponententyp As String
    Dim Kunde As String
    Dim Auftragsnummer As String
    Dim Revision As String
    Dim Dateiname As String
    Dim Serialnummern As String
    'Variablen zur Benennung des Dateinamens bestimmen
    If Sheets("Data-Sheet source").Range("E84").Value = " -  -  - " Then
    Serialnummern = "xxxxx"
    Else
    Serialnummern = Sheets("Data-Sheet source").Range("E84")
    End If
    Komponententyp = Sheets("Data-Sheet source").Range("N84")
    Kunde = Sheets("Data-Sheet source").Range("J84")
    Auftragsnummer = Sheets("Data-Sheet source").Range("R84")
    Revision = Application.WorksheetFunction.Max(Sheets("Data-Sheet source").Range("X3:X125")) _
    Dateiname = Serialnummern & "_" & Komponententyp & "_" & Auftragsnummer & "_" & Kunde _
    & "_Rev. " & Revision & ".xlsm"
    'Speichern-Unter-Dialog öffnen, falls Datei neu angelegt werden muss bzw. verändert wurde
    If ThisWorkbook.Name  Dateiname Then
    If SaveAsUI = True Then
    If Me.Path = "" Then
    Cancel = True
    Application.EnableEvents = False
    Application.Dialogs(xlDialogSaveAs).Show (Dateiname), xlOpenXMLWorkbookMacroEnabled
    Application.EnableEvents = True
    End If
    Else
    Cancel = True
    Application.EnableEvents = False
    Application.Dialogs(xlDialogSaveAs).Show (Dateiname), xlOpenXMLWorkbookMacroEnabled
    Application.EnableEvents = True
    End If
    End If
    End Sub
    

    Anzeige
    AW: Teilerfolg - Problem noch bei Excel 2003
    26.07.2012 09:32:10
    Ben
    Hallo Franz,
    vielen Dank für deine Antwort - für Excel 2007 funktioniert dein Code perfekt! Vielen Dank dir dafür.
    Bei Excel 2003 kommt tatsächlich eine Fehlermeldung bei folgender Zeile:
    Application.Dialogs(xlDialogSaveAs).Show (Dateiname), xlOpenXMLWorkbookMacroEnabled
    Die Fehlermeldung lautet: "Die Show-Methode des Dialog-Objekts konnte nicht ausgeführt werden."
    Das bedeutet, dass VBA von Excel 2003 mit diesem Befehl nichts anfangen kann, oder?
    Gibt es hier einen entsprechenden Code für die Versionen 97, 2000, 2002 und 2003?
    Wie ich die Versionen abfragen kann, kenne ich. Das würde ich per Select Case Application.Version machen.
    Und dann ist mir nochwas aufgefallen:
    Wenn ich ein *.xlsm in Excel 2003 abspeichere, dann wird das Kennwort des Arbeitsmappenschutzes nachfolgend immer beim Öffnen der gespeicherten Datei abgefragt - was aber ja nicht Sinn und Zweck der Geschichte ist. Öffnen sollte es ja jeder können - es soll nur die Arbeitsmappenstruktur geschützt sein.
    Vielen Dank für die Hilfe bisher - ich hoffe, dass ihr mir hier noch etwas weiterhelfen könnt.
    Liebe Grüße, Ben
    Anzeige
    Automat. WriteResPasswort setzen unterbinden
    26.07.2012 15:56:01
    Ben
    Hallo zusammen,
    ein Problem habe ich bereits lösen können, und zwar der Umgang mit dem SaveAs-Dialog unter Excel 2003.
    Jetzt gilt es noch folgende 2 Probleme in den Griff zu bekommen:
  • Wenn ich eine mit Excel 2003 erstellte Datei öffne, fragt er ein Kennwort ab (das Kennwort, das als Arbeitsmappenschutz hinterlegt ist).

  • Wenn ich unter Excel 2003 einmal den SaveAs-Dialog abbreche, und erneut auf speichern klicke, ruft er den SaveAs-Dialog nicht mehr auf, sondern speichert unter dem alten Dateinamen, obwohl der alte nicht gleich dem neuen ist und der deshalb den SaveAs-Dialog öffnen müsste!

  • Wie bekomme ich diese Fehler noch raus?
    Ich vermute, dass beim Speichern aus Excel 2003 als *.xlsm ein WriteResPassword vergeben wird. Kann man das unterbinden?
    Der Code, den ich verwende sieht inzwischen so aus:
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    'Vorbelegung Dateiname und Dateityp beim Speichern
    Dim Komponententyp As String
    Dim Kunde As String
    Dim Auftragsnummer As String
    Dim Revision As String
    Dim Dateiname As String
    Dim Serialnummern As String
    'Variablen zur Benennung des Dateinamens bestimmen
    If Sheets("Data-Sheet source").Range("E84").Value = " -  -  - " Then
    Serialnummern = "xxxxx"
    Else
    Serialnummern = Sheets("Data-Sheet source").Range("E84")
    End If
    Komponententyp = Sheets("Data-Sheet source").Range("N84")
    Kunde = Sheets("Data-Sheet source").Range("J84")
    Auftragsnummer = Sheets("Data-Sheet source").Range("R84")
    Revision = Application.WorksheetFunction.Max(Sheets("Data-Sheet source").Range("X3:X125")) _
    Dateiname = Serialnummern & "_" & Komponententyp & "_" & Auftragsnummer & "_" & Kunde _
    & "_Rev. " & Revision & ".xlsm"
    'Speichern-Unter-Dialog öffnen, falls Datei neu angelegt werden muss bzw. verändert wurde
    If ThisWorkbook.Name  Dateiname Then
    If SaveAsUI = True Then
    If Me.Path = "" Then
    Cancel = True
    Select Case Application.Version
    Case "11.0" 'Excel 2003
    Application.EnableEvents = False
    With Application.Dialogs(xlDialogSaveAs)
    If .Show(Dateiname, 52) = False Then Exit Sub
    End With
    Application.EnableEvents = True
    Case "10.0" 'Excel 2002
    Application.EnableEvents = False
    With Application.Dialogs(xlDialogSaveAs)
    If .Show(Dateiname, 52) = False Then Exit Sub
    End With
    Application.EnableEvents = True
    Case "9.0" 'Excel 2000
    Application.EnableEvents = False
    With Application.Dialogs(xlDialogSaveAs)
    If .Show(Dateiname, 52) = False Then Exit Sub
    End With
    Application.EnableEvents = True
    Case "8.0" 'Excel 97
    Application.EnableEvents = False
    With Application.Dialogs(xlDialogSaveAs)
    If .Show(Dateiname, 52) = False Then Exit Sub
    End With
    Application.EnableEvents = True
    Case Else
    Application.EnableEvents = False
    Application.Dialogs(xlDialogSaveAs).Show (Dateiname),  _
    xlOpenXMLWorkbookMacroEnabled
    Application.EnableEvents = True
    End Select
    End If
    Else
    Cancel = True
    Select Case Application.Version
    Case "11.0" 'Excel 2003
    Application.EnableEvents = False
    With Application.Dialogs(xlDialogSaveAs)
    If .Show(Dateiname, 52) = False Then Exit Sub
    End With
    Application.EnableEvents = True
    Case "10.0" 'Excel 2002
    Application.EnableEvents = False
    With Application.Dialogs(xlDialogSaveAs)
    If .Show(Dateiname, 52) = False Then Exit Sub
    End With
    Application.EnableEvents = True
    Case "9.0" 'Excel 2000
    Application.EnableEvents = False
    With Application.Dialogs(xlDialogSaveAs)
    If .Show(Dateiname, 52) = False Then Exit Sub
    End With
    Application.EnableEvents = True
    Case "8.0" 'Excel 97
    Application.EnableEvents = False
    With Application.Dialogs(xlDialogSaveAs)
    If .Show(Dateiname, 52) = False Then Exit Sub
    End With
    Application.EnableEvents = True
    Case Else
    Application.EnableEvents = False
    Application.Dialogs(xlDialogSaveAs).Show (Dateiname),  _
    xlOpenXMLWorkbookMacroEnabled
    Application.EnableEvents = True
    End Select
    End If
    End If
    End Sub
    

    Vielleicht kann man ja auch die Select Case Application.Version-Geschichte noch etwas kürzen bzw. optimieren?
    Liebe Grüße und vielen Dank für eure Hilfe,
    Ben
    Anzeige
    AW: Automat. WriteResPasswort setzen unterbinden
    26.07.2012 19:43:49
    fcs
    Hallo Ben,
    dein 2. Problem (Speichern-Unter-Dialog wird nicht angezeigt) tritt auf, weil du nach Abruch von Speichern-unter per "Exit Sub" das Makro verläßt. Dadurch werden die deaktivierten Ereignismakros nicht wieder aktiviert. Somit wird beim nächsten Speichern das Workbook_BeforeSave-Makro nicht aufgerufen.
    Die Sprunganweisung muss also auf eine entsprechende Zeile erfolgen, die die Ereignismakros wieder aktiviert.
    Zum 2. Problem (Passwortabfrage beim Öffnen von unter Excel 2003 gespeicherten Dateien kann ich nichts konkretes sagen, da die Erinnerung schon etwas gelitten hat und ich nur wenige Erfahrungen mit dem Zusatztool zum Öffnen/Speichern von Dateien im 2007er Format gesammelt habe.
    Ich hab im Code jetzt nach dem Aufruf des Speichern-Dialogs Anweisungen zum Zurücksetzen der Passwörter für Lesen/Schreiben eingefügt und erneuten Speichern eingefügt. Evtl. klappt das ja.
    Die Case-Anweisungen hab ich eingekürzt/umstrukturiert. Da für alle ältern Versionen die gleichen Anweisungen ausgeführt werden sollen, kann man die natürlich auch mit einem Case erschlagen.
    Gruß
    Franz
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    'Vorbelegung Dateiname und Dateityp beim Speichern
    Dim Komponententyp As String
    Dim Kunde As String
    Dim Auftragsnummer As String
    Dim Revision As String
    Dim Dateiname As String
    Dim Serialnummern As String
    'Variablen zur Benennung des Dateinamens bestimmen
    If Sheets("Data-Sheet source").Range("E84").Value = " -  -  - " Then
    Serialnummern = "xxxxx"
    Else
    Serialnummern = Sheets("Data-Sheet source").Range("E84")
    End If
    Komponententyp = Sheets("Data-Sheet source").Range("N84")
    Kunde = Sheets("Data-Sheet source").Range("J84")
    Auftragsnummer = Sheets("Data-Sheet source").Range("R84")
    Revision = Application.WorksheetFunction.Max(Sheets("Data-Sheet source").Range("X3:X125"))
    Dateiname = Serialnummern & "_" & Komponententyp & "_" & Auftragsnummer & "_" & Kunde _
    & "_Rev. " & Revision & ".xlsm"
    'Speichern-Unter-Dialog öffnen, falls Datei neu angelegt werden muss bzw. verändert wurde
    If ThisWorkbook.Name  Dateiname Then
    If SaveAsUI = True Then
    If Me.Path = "" Then 'xlmt-Datei wurde via Datei-->Neu als neue Datei angelegt
    Cancel = True
    Application.EnableEvents = False
    Select Case Val(Left(Application.Version, 2))
    Case Is 

    Anzeige
    Automatisches Öffnen-Passwort noch da
    27.07.2012 09:04:42
    Ben
    Hallo Franz,
    Danke für deine Mühe!
    ich hab den Code mal übernommen und getestet. Der Speichern-Dialog klappt nun einwandfrei!
    Es bleibt also nur noch die Geschichte mit der automatischen Passwort vergabe. Der Fehler taucht nämlich noch immer auf.
    Nochmals die Fehlerbeschreibung:
    Beim Speichern einer Arbeitsmappe aus Excel 2003 als *.xlsm (2007er-Format) vergibt das 2003er Excel ein Passwort zum Öffnen.
    Wie könnte man das noch entfernen?
    Vielen Dank für eure tatkräftige Hilfe!
    Gruß, Ben
    SaveAs-Dialog WriteResPasswort leeren? (Excel2003)
    30.07.2012 11:26:59
    Ben
    Hallo zusammen,
    ich suche für das angehängte Makro noch eine Möglichkeit, im aufgerufenen SaveAs-Dialog für Excel Code-Zeile: If .Show(Dateiname, 52) = False Then GoTo Weiter_1
    Bei dieser Code-Zeile setzt Excel 2003 beim speichern als *.xlsm immer das Arbeitsmappenschutzkennwort als WriteResPasswort. Das möchte ich natürlich unterbinden. Der User muss die Datei bearbeiten können, ohne zuvor ein Kennwort eingeben zu müssen.
    Meine bisherigen Versuche sehen wie folgt aus:
  • If .Show(Dateiname, 52, "", "") = False Then GoTo Weiter_1

  • If .Show(Dateiname, 52, Password = "", WriteResPassword = "") = False Then GoTo Weiter_1

  • Keiner hat den erhofften Erfolg gebracht. Beim zweiten Versuch gibt er sogar irgendein Kennwort bei WriteResPasswort an, dass weder im Code noch im Blatt irgendwo vorkommt.
    Wie sieht die richtige Code-Zeile aus, um das WriteResPassword-Feld zu leeren, bzw. ihm zu sagen, dass keines gesetzt werden soll?
    Vielen Dank!
    Gruß, Ben
    PS: Hier der ganze Code zum besseren Verständis.
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    'Vorbelegung Dateiname und Dateityp beim Speichern
    Dim Komponententyp As String
    Dim Kunde As String
    Dim Auftragsnummer As String
    Dim Revision As String
    Dim Dateiname As String
    Dim Serialnummern As String
    'Variablen zur Benennung des Dateinamens bestimmen
    If Sheets("Data-Sheet source").Range("E84").Value = "" Then
    Serialnummern = "xxxxx"
    Else
    Serialnummern = Sheets("Data-Sheet source").Range("E84")
    End If
    Komponententyp = Sheets("Data-Sheet source").Range("N84")
    Kunde = Sheets("Data-Sheet source").Range("J84")
    Auftragsnummer = Sheets("Data-Sheet source").Range("R84")
    Revision = Application.WorksheetFunction.Max(Sheets("Data-Sheet source").Range("X3:X125"))
    Dateiname = Serialnummern & "_" & Komponententyp & "_" & Auftragsnummer & "_" & Kunde _
    & "_Rev. " & Revision & ".xlsm"
    'Speichern-Unter-Dialog öffnen, falls Datei neu angelegt werden muss bzw. verändert wurde
    If ThisWorkbook.Name  Dateiname Then
    If SaveAsUI = True Then
    If Me.Path = "" Then 'xlmt-Datei wurde via Datei-->Neu als neue Datei angelegt
    Cancel = True
    Application.EnableEvents = False
    Select Case Val(Left(Application.Version, 2))
    'Excel 97 bis Excel 2003
    Case Is 

    Anzeige
    Gelöst
    30.07.2012 14:31:37
    Ben
    Hallo zusammen,
    hab das Problem in den Griff bekommen. Die Zeile sieht jetzt wie folgt aus:
    If .Show(Dateiname, 52, "") = False Then GoTo Weiter_1
    Danke für die Hilfe!
    Gruß, Ben

    95 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige