2017-11-21 15 views
1

Word 2010ファイルで名前を付けて保存を無効にしますが、保存は許可します。つまり、ユーザーは既存のファイルを更新できるが、コピーは作成できないようにしたい。これは本当に回避策を知っている人には不可能だが、一般ユーザーにとってはこれをExcelでうまくやったが、VBAという言葉にはまったく新しいものだ。名前を付けて保存は無効にしますが、Word 2010に保存しないでください

私が意図したとおりにすべての作品ブランドの新しい文書に次の行を追加します。

Sub FileSaveAs() 
MsgBox "Copies of this file cannot be created. Please save changes in the original document." & _ 
, , "Copy Cannot be Created" 
End Sub 

マイドキュメントは、さまざまなコマンドボタンの他​​のマクロを持っていますが、それらのどれも元の名前の下に(文書の保存伴わないかのように保存)。開いているマクロもありますが、それはブックマークに行く1行です。この文書で「別名で保存」しようとすると、メッセージボックスが意図どおりに取得されます。事が奇妙になっても「保存」しようとすると、対話として保存されます(問題1)。同じ名前か他の名前のどちらかで保存しようとするかどうかは、ダイアログが保存されず、対話ボックスが再び自動的に開き、キャンセル(問題2)するまで無限ループを作ります。私は断続的に "ディスクがいっぱいです"という警告ポップアップを表示しようとするとポップアップ表示を消すことができますが、ファイルが開かれている間はおそらく数分後に表示されます(おそらくオートセーブに関係しますか?)

マクロは動作するテストファイルでは、私はこの奇妙な振る舞いが私のコードのどこかにあるはずだと仮定しましたが、他のマクロを使った私の文書は、上記のコードとして保存しない限り正常に保存されるので、今私は完全に混乱します。私は長い時間がかかるコードの残りの部分を置く前に、上記の理由から影響のあるものは考えていないと思います。
1.私の他のコマンドボタンマクロ以外の場所はありますか?この現象を引き起こしているのでしょうか?
2.人々が私の究極の目標を達成するために推奨する良い方法はありますか?

アドバイスをいただきありがとうございます。

答えて

0

WordアプリケーションにはDocumentBeforeSaveというイベントがあります。アプリケーションイベントを有効にするには、クラスモジュールをThisApplicationの名前で作成し、次のコードを貼り付けることをお勧めします。

Option Explicit 

    Private WithEvents App As Application 

Private Sub Class_Initialize() 
    Set App = Word.Application 
End Sub 

Private Sub App_DocumentBeforeSave(ByVal Doc As Document, _ 
            SaveAsUI As Boolean, _ 
            Cancel As Boolean) 
    If SaveAsUI Then 
     MsgBox "Please always use the ""Save"" command" & vbCr & _ 
       "to save this file.", _ 
       vbExclamation, "SaveAs is not allowed" 
     Cancel = True 
    End If 
End Sub 

ThisDocumentモジュールに次のコードを追加してください。

Dim WdApp As ThisApplication 

Private Sub Document_Open() 
    Set WdApp = New ThisApplication 
End Sub 

あなたは、既存のDocument_Open手順にSet App = ...行を追加することができます。 WdApp変数が初期化された後、すべてのアプリケーションイベントは、クラスによって受信され、DocumentBeforeSaveイベントプロシージャはSaveAsを許可しないようにプログラムされます。

もちろん、これはすべての文書のブランケット拒否です。したがって、制限を特定の文書のみに制限するコードをプロシージャに追加することができます。 procは、Name、Path、FullName、組み込みプロパティ、カスタムプロパティなどのすべてのプロパティを持つドキュメントオブジェクト全体を受け取ります。これらのいずれかの影響を受けるファイルを特定することができます。

プログラムのクラッシュ時にWdApp変数が消去されることに注意してください。この場合、アプリケーションイベントは発生しなくなります。アプリケーションイベントがドキュメントイベントの前に発生することがわかると便利です。これは、アプリケーションのDocumentOpenイベントを、ドキュメントのDocument_Openイベントの代わりに、または代わりに使用する場合に使用します。

+0

Variatus、ありがとうございました。あなたのコードは既存のファイルでは機能しませんでしたが、ドキュメントを再作成したとき(ドキュメント内のすべてのコンテンツとコードを新しいドキュメントに貼り付ける)、作業がはるかに良くなりました。元のファイルで変更されたものが新しいファイルのある時点で再び変更される可能性があるのは少し不安ですが、それは別の問題です)。 – Patrick

+0

私はかなり問題を引き起こしたWdApp変数の初期化を確信しています。 F5キーを押すと、変数を初期化するDocument_Openプロシージャをいつでも実行できます。 ThisDocumentシートに 'Debug.Print WdApp Is Nothing'と書いてWdAppがアクティブであることをテストすることもできます。これをF5で実行します。変数が初期化されると、イミディエイトウィンドウにFalseが出力されます。一度それがあると、すべての文書に対してそのイベントが発生します。 – Variatus

関連する問題