Microsoft Excel

Herbers Excel/VBA-Archiv

resume.xlw vermeiden | Herbers Excel-Forum


Betrifft: resume.xlw vermeiden von: Brigitte
Geschrieben am: 26.11.2009 18:43:40

Hallo zusammen,

ich habe ein kleines Problem:
Um ein konsistentes Versions-Management zu gewährleisten, soll das Workbook bei größeren Fehlern automatisiert (also mit einem vorgegebenen Namen) abgespeichert werden.

Hierzu mein Code:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
On Error Resume Next
Dim Canc As Boolean
Datenstand = Range("Datum")
Application.DisplayAlerts = False
If Datenstand <> ExportDate Or FileUser <> Application.UserName Then
    Canc = Application.Dialogs(xlDialogSaveAs).show(DateiName)
    If Canc = False Then End
Else: Application.Save
End If
Application.DisplayAlerts = True
End Sub
Leider erstellt Excel immer wieder eine resume.xlw-Datei (dachte eigentlich, das wäre mit Application.DisplayAlerts=False ausgeschaltet), wäre ja grundsätzlich egal, aber da der Nutzer gefragt wird, ob er die vorhandene ersetzen will, ziemlich lästig...

Kann mir jemand helfen?

Danke schonmal,
Brigitte

  

Betrifft: Mehrere Fehler... von: Ramses
Geschrieben am: 26.11.2009 20:52:42

Hallo

... welche die Fehersuche erschweren.

1. Schalte mal das "On error resume next" ab.
Damit bleibt EXCEL nämlich automatisch dort stehen, wo ein Fehler auftritt

2. Variablen Deklaration !!!! ist Pflicht,.. vor allem wenn "VBA Gut"
Die Variable "Dateiname" für den SaveAs-Dialog existiert nicht und hat keinen Wert

3. FileUser und Application.Username macht keinen Sinn.
In Unternehmen steht in 99.999% das Unternehmen als "Application.Username" in EXCEL.
Den aktuellen Benutzer kannst du damit sicher nicht bestimmen. Das geht nur über die Variable Environ("Username") welche den angemeldeten Benutzer am System zurückgibt

4. Und wenn schon was nicht funktionert, dann auf jeden alles abschalten welche Fehlermeldungen unterdrücken. Also auch "Application.DisplayAlerts = False"

Gruss Rainer


  

Betrifft: AW: Mehrere Fehler... von: Brigitte
Geschrieben am: 27.11.2009 08:14:55

Hallo,

die Variablen sind natürlich deklariert, wollte nur nicht den ganzen Wust außerhalb angeben, auch Dateiname ist natürlich belegt...
In beiden Unternehmen, in denen das Programm benutzt wird, ist der tatsächliche Nutzer der Application.User (wurde bereits in einigen anderen Dateien so ausgeführt)...
"Application.DisplayAlerts=False" hab ich erst nachträglich eingefügt in der Hoffnung, dadurch diese resume.xlw-Datei nicht mehr anzulegen...

Wenn es gewünscht ist, dann hier der gesamte Code, der damit zusammenspielt:

Option Explicit
Public ExportDate As Date

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
On Error Resume Next
Dim Canc As Boolean
Datenstand = Range("Datum")
Application.DisplayAlerts = False
If Datenstand <> ExportDate Or FileUser <> Application.UserName Then
    Canc = Application.Dialogs(xlDialogSaveAs).show(DateiName)
    If Canc = False Then End
Else: Application.Save
End If
Application.DisplayAlerts = True
End Sub

Private Sub Workbook_Open()
    ExportDate = Range("Datum")
End Sub
____________________________________________________________________________________

Option Explicit
Dim SheetName As String, stateStr As String
Dim ExportDatum As Date, DatenDatum As Date
Dim projekt As String

Public Property Let stateText(str As String)
    stateStr = str
End Property
Public Property Get stateText() As String
    stateText = stateStr
End Property

Public Property Let Datenstand(i As String)
    ExportDatum = i
End Property
Public Property Get Datenstand() As String
    Datenstand = ExportDatum
End Property

Public Property Get DNRS() As String
   DNRS = Left(ThisWorkbook.name, InStr(ThisWorkbook.name, ".") - 1)
   DNRS = Right(DNRS, Len(DNRS) - (InStr(DNRS, "_")))
   DNRS = Left(DNRS, InStrRev(DNRS, "_") - 1)
End Property

Public Property Get ExportTag() As String
   ExportTag = Left(Datenstand, InStr(Datenstand, ".") - 1)
End Property

Public Property Get ExportMonat() As String
   ExportMonat = Left(Right(Datenstand, InStrRev(Datenstand, ".") + 1), InStr(Right(Datenstand,  _
 _
InStrRev(Datenstand, ".") + 1), ".") - 1)
End Property

Public Property Get ExportJahr() As String
   ExportJahr = Right(Datenstand, InStr(Datenstand, ".") + 1)
End Property
Public Property Get ProjektStr() As String
If Worksheets(newSheet).Range("projekt") Like "*AU*" Then
   ProjektStr = "Projekt1"
Else: ProjektStr = "Projekt2"
End If
End Property

Public Property Get FileUser() As String
   FileUser = Right(Left(ThisWorkbook.name, InStr(ThisWorkbook.name, ".") - 1), Len(Left( _
ThisWorkbook.name, InStr(ThisWorkbook.name, ".") - 1)) - InStrRev(Left(ThisWorkbook.name, InStr( _
 _
ThisWorkbook.name, ".") - 1), "_"))
End Property

Public Property Get FileProjektStr() As String
   FileProjektStr = Right(Left(DNRS, InStrRev(DNRS, "_") - 1), Len(Left(DNRS, InStrRev(DNRS, "_" _
 _
) - 1)) - InStr(DNRS, "_"))
End Property

Public Property Get FileStarter()
   FileStarter = Left(DNRS, InStr(DNRS, "_") - 1)
End Property

Public Property Get FileVersion() As String
   FileVersion = Right(Right(DNRS, Len(DNRS) - InStr(DNRS, "_")), Len(Right(DNRS, Len(DNRS) -    _
 _
InStr(DNRS, "_"))) - InStr(Right(DNRS, Len(DNRS) - InStr(DNRS, "_")), "_"))
End Property

Public Property Get DateiName() As String
   DateiName = ExportJahr & ExportMonat & ExportTag & "_" & _
   FileStarter & "_" & ProjektStr & "_" & FileVersion & "_" & Application.UserName & ".xls"
End Property


Ich hoffe, dass ich alles gefunden habe...

Gruß, Brigitte


  

Betrifft: AW: Mehrere Fehler... von: fcs
Geschrieben am: 29.11.2009 15:06:55

Hallo Brigitte,

durch die relativ komplizierte/unübersichtliche Art den Dateinamen zu generieren war es nicht so ganz einfach den Ablauf beim Speichern zu verfolgen.

Wenn deine Prozeduren zum Generieren des beim Speichern vorgeschlagenen Dateinamens korrekt funktionieren, dann müßtest du deine Workbook_BeforeSave Prozedur etwa wie in der Datei anpassen.

Wichtig ist, dass die Ereignis-Makros vor dem Anzeigen des Speichern Dialogs deaktiviert werden, da es sonst zu einem erneuten Aufruf der Before_Save-Prozedur kommt. Zusätzlich sollte der ursprünglich gestartetet Speichervorgang dann storniert werden. Die Fehlerbehandlung ist jetzt so, dass ggf. eine Meldung angezeigt wird.


Ein paar andere Kleinigkeiten in deinen Get Property Prozeduren sind nicht ganz optimal.
- Die Property Datenstand wird von dir als String verwaltet, obwohl es sich eigentlich um ein Datum handelt.
- Die Methoden zur Ermittlung von Export-Jahr, -Monat und -Tag sind etwas umständlich.
- Bis zu 9 mal wird in einer Zeile die Property Anweisung aufgerufen.
Hier scheint mir die Zuwesiung des Werts an eine Variable sinnvoller. Prozedur wird auch schneller.
- Die Verwending der With Anweisung spart manchmal auch Platz.

Gruß
Franz
Wegen der der Länge Code als kleine Text-Datei.
https://www.herber.de/bbs/user/66256.txt