2016-04-19 7 views
0

私が作業しているファイルを保存する小さなスクリプトを作成しようとしていますが、その際にバージョン番号を増やしてください。私は普通のSubから呼び出すとうまくいくスクリプトを持っていますが、BeforeSaveイベントに入れたら、アプリケーション全体がクラッシュします。バージョンExcelファイルを保存する

私はこれをThisWorkbookバージョンのワークブックのオブジェクトに配置しました。 [保存開始したユーザーの前に(あなたの現在の設定で無限ループを入力するつもりだ

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Dim fso 
    Dim nme As String, rootDir As String 
    Dim ver As Integer 

    Set fso = CreateObject("Scripting.FileSystemObject") 

    With ThisWorkbook 
     nme = fso.GetBaseName(.Name) 
     rootDir = fso.getfolder(.Path) 
     On Error Resume Next 
     ver = CInt(Trim(Right(nme, Len(nme) - InStr(1, nme, " v", vbTextCompare) - 1))) + 1 
     On Error GoTo 0 
     nme = "GNOC into CPT DE" ' Trim(Left(nme, InStr(1, nme, " v", vbTextCompare))) 

     .SaveAs Filename:=rootDir & "\" & nme & " v" & Format(ver, "000"), FileFormat:=xlOpenXMLWorkbookMacroEnabled 
    End With 
End Sub 
+0

がありますか?あなたはなぜサブファイルに 'wb.saveas filename:= blah blah'を実行できませんか? – findwindow

答えて

0

は、マクロは、バージョンを更新するために、名前を付けて保存を引き起こし、それは再びBeforeSaveイベント、マクロを再起動起動します、 等々)。

これを回避するには、ブロック変数が必要です。 ThisWorkbookオブジェクトでは、変数を作成します。便宜上、Blockをブール値と呼びます。 Openイベントを[偽に設定]に設定します。あなたSet &あなたの宣言の間で次の行を追加します。

If Not Block Then 
    Block = True 

インデントEnd Sub除くコードの全体。 End Sub & End Withの間に挿入:それでなければなりません

Block = False 
End If 'No Else case needed as nothing special should happen if block is true 

+0

あなたはグローバル変数を使ってそれをオンまたはオフに切り替えていますか?イベントをトリガーする初期セーブを中断する方法はありませんか? – Tom

+0

結構ですが、シンプルで効果的です。私がユーザーが保存を開始するのを中断するために私が知っている唯一の方法は、 'BeforeSave'イベントです。 – JMichael

+0

あなたが再帰について言及した後、私はそれについてもう少し考えて、解決策を思いつきました。保存をキャンセルしてから、イベントを無効にして保存できるようにしました。このようにして、グローバル変数の使用を避け、同じコードを何度も繰り返し使用することができます。あなたの入力をありがとう – Tom

0

私は少し長く、このことについて考え、私はそれがユーザーによって開始され、その後、これを再起動せずに、私は保存することができ、イベントを無効にしてされている保存キャンセルCancel = Trueを使用して完全に

を働き、次のを思い付きましたイベント。あなたは二度保存しているので、その後、私は私のExcelのdevの作業のためのバージョン管理

おそらく
Option Explicit 
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Dim fso 
    Dim nme As String, rootDir As String 
    Dim ver As Integer 

    Cancel = True 

    Set fso = CreateObject("Scripting.FileSystemObject") 

    With ThisWorkbook 
     nme = fso.GetBaseName(.Name) 
     rootDir = fso.getfolder(.Path) 
     On Error Resume Next 
     ver = CInt(Trim(Right(nme, Len(nme) - InStr(1, nme, " v", vbTextCompare) - 1))) + 1 
     On Error GoTo 0 
     nme = Trim(Left(nme, InStr(1, nme, " v", vbTextCompare))) 
     Application.EnableEvents = False 
     .SaveAs Filename:=rootDir & "\" & nme & " v" & Format(ver, "000"), FileFormat:=xlOpenXMLWorkbookMacroEnabled 
     Application.EnableEvents = True 
    End With 
End Sub 
関連する問題