保存するたびに、Excelにファイルを一意の名前で保存しようとしています。
これは主にExcel 2003で使用されますが、2010年にも使用されます。Workbook_BeforeSaveのファイル名を更新します。
ユーザーはテンプレートファイルを開き、[保存] template_2など
彼らは「保存」をクリックする場合、これは正常に動作しますが、彼らは、ファイルを閉じた場合、それはあなたが元のファイルに変更を保存したい場合は、新しい名前で保存します聞いてきますし、その後どうか尋ねますユーザーは変更を保存する必要があります...ユーザーが変更を保存するかどうかなどを保存して尋ねます。明らかに、私はそれを一度保存して閉じてしまうだけですが、そうではありません。
Saved
プロパティをTRUEに設定しようとしました。保存後にCancel = True
を試しましたが、Excelがクラッシュする原因となります。Excelに問題が発生しました。タイプのメッセージが表示されます。コードで
私はSaved=TRUE
とCancel=TRUE
を削除しようとしたの下に、私は周りにそれらを移動しようとした - 、保存する前にキャンセル保存した後にキャンセルが、If...End If
ブロック内で、EnableEvents
コードの前と後:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim NewFileName As String
On Error GoTo ERROR_HANDLER
NewFileName = GenerateUniqueName(ThisWorkbook.FullName)
If NewFileName <> "" Then
Application.EnableEvents = False
ThisWorkbook.SaveAs NewFileName, ThisWorkbook.FileFormat
ThisWorkbook.Saved = True
Application.EnableEvents = True
End If
FastExit:
Cancel = True
On Error GoTo 0
Exit Sub
ERROR_HANDLER:
MsgBox "Error " & Err.Number & vbCr & _
" (" & Err.Description & ") in procedure ThisWorkbook.Workbook_BeforeSave." & vbCr & vbCr & _
"DOCUMENT NOT SAVED.", vbCritical + vbOKOnly
Application.EnableEvents = True
Resume FastExit
End Sub
GenerateUniqueName
コードは以下の通りです - これは、アンダースコア文字を含まないファイル名を想定し、など_1、_2、などのファイル名に番号が追加されます。
'----------------------------------------------------------------------
' GenerateUniqueName
'
' Generates a file name that doesn't exist by appending a number
' inbetween the base name and the extension.
' Example: GenerateUniqueName("c:\folder\file.ext") = "c:\folder\file_4.ext"
'----------------------------------------------------------------------
Function GenerateUniqueName(FullFileName As String, Optional fAlwaysAddNumber As Boolean) As String
Dim oFSO As Object
Set oFSO = CreateObject("Scripting.FileSystemObject")
If Not oFSO.FileExists(FullFileName) And Not fAlwaysAddNumber Then
GenerateUniqueName = FullFileName
Else
Dim strExt As String
Dim strNonExt As String
Dim strBaseName As String
Dim strNewName As String
Dim i As Integer
strExt = oFSO.GetExtensionName(FullFileName)
If strExt <> "" Then
strBaseName = oFSO.GetBaseName(FullFileName)
If InStrRev(strBaseName, "_") > 0 Then
i = Val(Mid(strBaseName, InStrRev(strBaseName, "_") + 1, Len(strBaseName)))
strBaseName = Left(strBaseName, InStrRev(strBaseName, "_") - 1)
End If
strNonExt = oFSO.buildpath(oFSO.GetParentFolderName(FullFileName), strBaseName)
Do
i = i + 1
strNewName = strNonExt & "_" & i & "." & strExt
Loop While oFSO.FileExists(strNewName)
GenerateUniqueName = strNewName
Else
MsgBox "File name must contain a file extension." & vbCr & _
"e.g. .xls or .xlsx", vbCritical + vbOKOnly
GenerateUniqueName = ""
End If
End If
Set oFSO = Nothing
End Function
あなたのコードが本を保存した後で、 "activeworkbook.save false"を追加することはどうですか? – Absinthe
あなたのユーザーが最初に 'Save'を行い、直後に' Close'がある場合は、** 2 **ファイルの別個のコピーを保存しますか? –
@Absinthe - '.Save False'はVBAコマンドではありません(https://msdn.microsoft.com/en-us/library/office/ff197585.aspx)。 @ゲイリーの生徒 - 私はそれが前回の保存がきれいなようにエクセルズ "汚れた旗"をマークするので、そのインスタンスで閉じたときには保存しないことを期待しています。 –