Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Hallo Sepp, Speichern verhindern bei Konflikt | Herbers Excel-Forum


Betrifft: Hallo Sepp, Speichern verhindern bei Konflikt von: Dietmar aus Aachen
Geschrieben am: 02.02.2010 23:01:12

Hallo Sepp,

ich habe Deinen Code mal mit meiner Idee angepasst, aber es funktioniert so noch nicht.

Was ist suche ist folgendes:
- User öffnet die Datei1
- Es erfolgt dann auch immer eine Zwangsspeicherung unter C:\OrdnerXY\Datei 1 (damit Updates die Datei finden können).
- Nun geht ein User hin und speichert die Datei, sagen wir unter "Datei2" irgendwo ab, denkt sich nichts dabei und schließt die Datei2 dann wieder
- Einige Zeit später arbeitet er (so wie es sein soll) mit Datei 1 weiter, die dadurch ja hinsichtlich des Änderungsdatums aktueller wird; dann schließt er die Datei wieder usw.
- Eines Tages kommt er auf die Idee seine unter "Datei2" gespeicherte Version zu öffnen, wo ja aufgrund des Makros die Zwangsspeicherung abläuft). NUN soll die Warnung erscheinen

Könntest Du den Code nochmals in diese Denkrichtung checken ?
Herzlichen Dank!

Viele Grüße
Dietmar aus Aachen

Danke für Deine Hilfe

Option Explicit

Const cstrSaveAsName As String = "C:\OrdnerXY\datei1.xls"

Private Sub Workbook_Open()

If Dir("C:\OrdnerXY\datei1.xls", vbDirectory) = "" Then
MsgBox "Ihr Abrechnungsprogramm wird wie folgt gespeichert: C:\OrdnerXY\datei1.xls",  _
vbInformation, "Hinweis"
Else

End If

Application.DisplayAlerts = False   'Nachfrage ausschalten
ActiveWorkbook.SaveAs Filename:="C:\OrdnerXY\datei1.xls"
Application.DisplayAlerts = True    'Nachfrage einschalten



  Dim bSave As Boolean
  bSave = True
  If Dir(cstrSaveAsName) = "C:\OrdnerXY\datei1.xls" Then
    If checkFileTime(cstrSaveAsName, Me.FullName) Then
      bSave = MsgBox("Die Datei die Sie speichern wollen, ist älter" & vbLf & _
        "als die bereits vorhandene Datei!" & vbLf & vbLf & "Wollen Sie" & _
        " trotzdem fortsetzen?", vbInformation + vbYesNo + vbDefaultButton2, _
        "Hinweis") = vbYes
    End If
  End If
  If bSave Then
    Application.DisplayAlerts = False
    Me.SaveAs cstrSaveAsName
    Application.DisplayAlerts = True
  End If
End Sub

Private Function checkFileTime(ByVal strOldFile As String, ByVal strNewFile As String) As  _
Boolean
  Dim objFSO As Object, objFile As Object
  Dim dblOldFTime As Double, dblNewFTime As Double
  
  If Dir(strOldFile) = "" Then Exit Function
  If Dir(strNewFile) = "" Then Exit Function
  
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  
  Set objFile = objFSO.GetFile(strOldFile)
  dblOldFTime = objFile.DateLastModified
  
  Set objFile = objFSO.GetFile(strNewFile)
  dblNewFTime = objFile.DateLastModified
  
  checkFileTime = dblOldFTime > dblNewFTime
  
  Set objFile = Nothing
  Set objFSO = Nothing
End Function

  

Betrifft: AW: Hallo Sepp, Speichern verhindern bei Konflikt von: Josef Ehrensberger
Geschrieben am: 03.02.2010 08:08:51

Hallo Dietmar,


na dann ein neuer Versuch.


' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Const cstrSaveAsName As String = "C:\OrdnerXY\datei1.xls"

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Dim strFile As String
  If SaveAsUI Then
    Application.EnableEvents = False
    If Dir(cstrSaveAsName) <> "" Then
      Cancel = True
      strFile = _
        Application.GetSaveAsFilename(FileFilter:="Excel Dateien (*.xls; *.xlsx; *.xlsm)," _
        & "*.xls; *.xlsx; *.xlsm")
      
      If strFile = CStr(False) Then GoTo ErrExit
      If strFile = cstrSaveAsName Then
        If checkFileTime(Me.FullName, strFile) Then
          If MsgBox("Die Datei die Sie speichern wollen, ist älter" & vbLf & _
            "als die bereits vorhandene Datei!" & vbLf & vbLf & _
            "Wollen Sie trotzdem fortsetzen?", vbInformation + vbYesNo + _
            vbDefaultButton2, "Hinweis") = vbYes Then
            Me.SaveAs strFile
          End If
        Else
          Me.SaveAs strFile
        End If
      Else
        Me.SaveAs strFile
      End If
    End If
  End If
  ErrExit:
  Application.EnableEvents = True
End Sub

Private Sub Workbook_Open()
  If Dir(cstrSaveAsName, vbDirectory) = "" Then
    MsgBox "Ihr Abrechnungsprogramm wird wie folgt gespeichert: " & _
      cstrSaveAsName, vbInformation, "Hinweis"
    Me.SaveAs cstrSaveAsName
  End If
End Sub


Private Function checkFileTime(ByVal strOldFile As String, ByVal strNewFile As String) As _
    Boolean

  Dim objFSO As Object, objFile As Object
  Dim dblOldFTime As Double, dblNewFTime As Double
  
  If Dir(strOldFile) = "" Then Exit Function
  If Dir(strNewFile) = "" Then Exit Function
  
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  
  Set objFile = objFSO.GetFile(strOldFile)
  dblOldFTime = objFile.DateLastModified
  
  Set objFile = objFSO.GetFile(strNewFile)
  dblNewFTime = objFile.DateLastModified
  
  checkFileTime = dblOldFTime < dblNewFTime
  
  Set objFile = Nothing
  Set objFSO = Nothing
End Function


Gruß Sepp



  

Betrifft: Hallo Sepp, ja fast perfekt von: Dietmar aus Aachen
Geschrieben am: 03.02.2010 09:30:15

Guten Morgen Sepp,


das ist schon super!

Damit könnte ich auch gut klarkommen. Was jetzt gut funktioniert ist, dass die Datei 2 (wenn sie die ältere ist) die Datei 1 nicht überschreibt. Sie wird stattdessen als Datei 2 geöffnet.

Was noch nicht funktioniert ist, dass die Warnmeldung mit der anschließenden Auswahlmöglichkeit, die Speicherung als Datei1 dennoch zu zu lassen.

Aber wie gesagt, wenns zu aufwändig wäre: ich käme auch damit gut klar; nur dass dann die ganze Prozedur in Richtung Warnmeldung überflüssig wäre.

Danke für die tolle Hilfe!

Viele Grüße aus Aachen
Dietmar


  

Betrifft: AW: Hallo Sepp, ja fast perfekt von: Josef Ehrensberger
Geschrieben am: 03.02.2010 11:06:40

Hallo Dietmar,


ein anderer Ansatz, immer wenn eine Datei die nicht den festgelegten Namen hat unter dem hinterlegten Namen gespeichert werden soll, wird der Dialog, ob überschrieben werden soll oder nicht, eingeblendet, das scheint mir der sicherste Weg zu sein.



' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Const cstrSaveAsName As String = "C:\OrdnerXY\datei1.xls"

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Dim strFile As String, dblT() As Double
  If SaveAsUI Then
    Application.EnableEvents = False
    Application.DisplayAlerts = False
    If Dir(cstrSaveAsName) <> "" Then
      Cancel = True
      strFile = _
        Application.GetSaveAsFilename(FileFilter:="Excel Dateien (*.xls; *.xlsx; *.xlsm)," _
        & "*.xls; *.xlsx; *.xlsm")
      
      If strFile = CStr(False) Then GoTo ErrExit
      If strFile = cstrSaveAsName And Me.FullName <> cstrSaveAsName Then
        dblT = checkFileTime(Me.FullName, strFile)
        If MsgBox("Soll die Datei" & "'" & vbLf & strFile & CDate(dblT(0)) & "'" & vbLf & _
          vbLf & "durch" & vbLf & "'" & Me.FullName & CDate(dblT(1)) & "'" & vbLf & vbLf & _
          "Ersetzt werden?", vbQuestion + vbYesNo, "Hinweis") = vbYes Then
          Me.SaveAs strFile
        End If
      Else
        Me.SaveAs strFile
      End If
    End If
  End If
  ErrExit:
  Application.EnableEvents = True
  Application.DisplayAlerts = True
End Sub

Private Sub Workbook_Open()
  If Dir(cstrSaveAsName, vbDirectory) = "" Then
    MsgBox "Ihr Abrechnungsprogramm wird wie folgt gespeichert: " & _
      cstrSaveAsName, vbInformation, "Hinweis"
    Me.SaveAs cstrSaveAsName
  End If
End Sub


Private Function checkFileTime(ByVal strOldFile As String, ByVal strNewFile As String) As _
    Variant

  Dim objFSO As Object, objFile As Object
  Dim dblOldFTime As Double, dblNewFTime As Double
  Dim dblTime(1) As Double
  
  If Dir(strOldFile) = "" Then Exit Function
  If Dir(strNewFile) = "" Then Exit Function
  
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  
  Set objFile = objFSO.GetFile(strOldFile)
  dblOldFTime = objFile.DateLastModified
  
  Set objFile = objFSO.GetFile(strNewFile)
  dblNewFTime = objFile.DateLastModified
  
  dblTime(0) = dblOldFTime
  dblTime(1) = dblNewFTime
  checkFileTime = dblTime
  
  Set objFile = Nothing
  Set objFSO = Nothing
End Function


Gruß Sepp



  

Betrifft: Danke Sepp > Perfektissimo! von: Dietmar aus Aachen
Geschrieben am: 03.02.2010 11:41:26

Hallo Sepp,

das ist absolut spitze!

Mein Respekt vor Deinen Kenntnissen wächst mit jeder Nachfrage :-)
Und dann muss ich einfach mal wieder sagen: Danke für Deine scheinbar grenzenlose Geldud!

Viele Grüße
Dietmar aus Aachen


Beiträge aus den Excel-Beispielen zum Thema "Hallo Sepp, Speichern verhindern bei Konflikt"