- ベストアンサー
VBAで文書保護の例外処理領域を削除
- Word2007(Word2003でも可)で、コマンドボタン押下後に文書保護を解除し、設定してあった例外処理の領域を削除するマクロを作成しようとしています。しかし、例外処理の領域削除が上手くいかず、困っています。
- 例外処理の領域を削除するために、テキストボックスを選択し、新しいマクロの記録を用いて以下の構文を生成しましたが、実行時エラーが発生しています。「ActiveDocument.Shapes("Text Box XXX").Select Selection.Editors.Add wdEditorEveryone Selection.Editors(wdEditorEveryone).Delete」
- このエラーメッセージ「実行時エラー5941:指定されたコレクションのメンバは存在しません。」が表示されており、マクロを実行することができません。ご指摘やアドバイスがあればお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 やっと原因が分かりました。 理由は、文字(Character)そのものに、Editors ロックが掛かっているということです。これは、Excelでも同じような現象がありますね。 Google でもヒットしないので、参考にされる可能性があるので、つたない英語の解説を入れてみました。ただし、英語フォントで見ると、全角が完全に文字化けしているでしょうけれども。(^^; わざと、二重のループをしたのは、一回で外れないことがあるようですね。 それと、文字列が一括で、編集制限されたものは、一回で済みますが、個別に入れられたものに関しては、文字でない部分に編集制限があると、外れない可能性があります。 また、 If cr.Editors.Count > 0 Else Exit For End 通常は、としても良いようです。通常の設定なら、1回きりで済むようです。 '-------------------------------------------- Sub DocumentProtect_EditorsRangeUnLockInShape() Dim txtRng As Range Dim i As Integer Dim j As Integer Dim cr As Variant 'When the Document is locked by PassWord On Error Resume Next ActiveDocument.Unprotect "PSWD" On Error GoTo 0 'Only one 'TextBox' of Shapes in ActiveDocument Set txtRng = ActiveDocument.Shapes(1).TextFrame.TextRange 'check each character with Editor(limitation of editoring) On Error Resume Next 'If the characters are locked twice, d'better go in loop two times.(maybe) For Each cr In txtRng.Characters If cr.Editors.Count > 0 Then For j = 0 To cr.Editors.Count - 1 For i = 1 To cr.Editors.Count cr.Editors(i).Delete Next i Next j End If Next cr End Sub
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 しばらく調べてみたのですが、どうしても、テキストボックス(オートシェイプ)の中の文字列に対する[例外処理]のオブジェクトが取れません。Editors オブジェクトが、特別な仕様ではなく、テキストボックス側のほうが特別な仕様だからのようです。 Shapes のTextFrameやShapeRangeのTextFrameからでは、Editors オブジェクトのEditor プロパティは取れないような気がします。 Shapes は、もともと、Collection ですから、ActiveDocument からダイレクトで、このオブジェクトを取れる方法があれば、なんとかなるような気がしたのですが分かりません。 これについては、インターネットでも書いている人がいません。私が見たすべて、ActiveDocument の[例外処理]だけで、ありえないわけではないのですが、テキストボックスを指定して、[例外処理]を掛けるというようなことは、見当たりません。 ただ、実際には、テキストを取り出して、上書きしてしまえば、その[例外処理]は外れてしまいますね。 Dim txt As String txt = ActiveDocument.Shapes(1).TextFrame.TextRange.Text ActiveDocument.Shapes(1).TextFrame.TextRange.Text = txt
お礼
ご回答ありがとうございます!! やはり、一筋縄ではいかないのですね・・・orz ただ、最後の方法だと確かに例外処理がはずれますね! なるほど!! 他に方法が見つからなければこの方法を組み込みたいと思います。 貴重なご意見ありがとうございました!
お礼
Wendy02さん 度々のご回答ありがとうございます!! なるほど、オートシェイプに例外処理がついていたわけではなく、 入力テキストに例外処理がついているということだったのですね! 今、試せる環境にないので、連休明けたら試してみたいと思います! 大変参考になりました!ありがとうございました!