Word (VBA)

Word VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Word 2010)
Wordのアドインについて←再質問です
投稿日時: 20/12/22 18:49:11
投稿者: ロードランナー
投稿者のウェブサイトに移動

すみません、再質問です。
 
STARTUPフォルダに登録して右クリックメニューコマンドは実装できたのですが、これではテンプレートを削除したあとにメニューが残りっぱなしになってしまいます。
 
ExcelならばAddinUninstallでメニューを消してしまうことが可能ですが、Wordでこのようなことは、どう実装すれば実現できるのでしょうか。
 
これが解決できないと、安易にテンプレートを配布して使ってもらうのもためらってしまいます。
 
お知恵拝借いたします。

回答
投稿日時: 20/12/22 19:14:15
投稿者: K.Hiwasa
投稿者のウェブサイトに移動

AutoExitでメニューを消すのでは駄目でしょうか。
Wordを開いている間は、STARTUPに入れたアドイン(テンプレート)を削除できないので、
削除する場合はメニューが必ず消えていることになると思います。

投稿日時: 20/12/22 19:40:56
投稿者: ロードランナー
投稿者のウェブサイトに移動

またまたありがとうございます。
 

引用:
Wordを開いている間は、STARTUPに入れたアドイン(テンプレート)を削除できない

 
これは理解できるのですが、AutoExitの起動条件がわかりません。
 
ここでリセットすればいいとは思うのですが、STARTUPフォルダからテンプレートを削除したときに走るようなもいのなのでしょうか??
 
ついでと言ってはなんですが、ネットでWordVBAの開発に参考となるようなサイトも教えていただけるとありがたいです。Excelに比べたら情報量が少ないので。

回答
投稿日時: 20/12/22 20:35:42
投稿者: K.Hiwasa
投稿者のウェブサイトに移動

参考リンクです。
https://docs.microsoft.com/ja-jp/office/vba/word/concepts/customizing-word/auto-macros
 
アドインを解除すると、Wordを開いていてもSTARTUPからそのファイルを削除できますね。
その場合も、解除時にAutoExitが動きます。

投稿日時: 20/12/23 09:31:34
投稿者: ロードランナー
投稿者のウェブサイトに移動

標準モジュールに下のようなマクロを組み、STARTUPフォルダにマクロ有効テンプレートを入れました。
 
Const cpt As String = "自動設定"
Sub AutoExec()
    '右クリックメニュー設定
    With Application.CommandBars("text") '文書上での右クリックメニューに追加
        With .Controls.Add(Type:=msoControlButton)
          .Caption = cpt
          .OnAction = "AStart"
        End With
    End With
End Sub
 
Sub AutoExit()
    MsgBox "メニューを削除"
    Application.CommandBars("text").Controls(cpt).Delete
End Sub
 
Wordを起動し、右クリックすると「自動設定」メニューが表示されます。
Wordと閉じると、MsgBox "メニューを削除" が表示されます。(AutoExitは動いた)
 
ところがまたWordを起動すると、「自動設定」メニューが2つになっています。
イミディエイトウィンドウで
    Application.CommandBars("text").Controls(cpt).Delete
を実行すると、メニューは消えます。
 
AutoExitプロシージャに不足しているコードがあるのでしょうか?

回答
投稿日時: 20/12/23 14:45:52
投稿者: K.Hiwasa
投稿者のウェブサイトに移動

海外のフォーラムを参考に、少し試行錯誤した上での推測です。
(誤りがあるかもしれません。)
 
・ツールバーの変更などはデフォルトではNormal.dotmに保存される。
・AutoExitでのツールバーの削除はそのままではNormal.dotmには保存されない。
 
そこで、以下のように少し方針を変更してみました。

Option Explicit
Const cpt As String = "自動設定"
Sub AutoExec()
    '右クリックメニュー設定
    Application.CustomizationContext = ThisDocument  '…@
    With Application.CommandBars("text")
        With .Controls.Add(Type:=msoControlButton)
          .Caption = cpt
          .OnAction = "AStart"
        End With
    End With
    ThisDocument.Saved = True  '…A
End Sub

@カスタマイズの保存先を自分自身に変える。
A保存先を自分自身にしたたため、閉じるときに「保存しますか」が出るのを抑制する。
 
保存しないで終了するので、AutoExitで消すという処理は不要。

回答
投稿日時: 20/12/23 18:33:07
投稿者: んなっと

赤字部分3行追加してみてください...
 
Sub AutoExec()
    '右クリックメニュー設定
    With Application.CommandBars("text") '文書上での右クリックメニューに追加
        On Error Resume Next
        .Controls(cpt).Delete
        On Error GoTo 0

        With .Controls.Add(Type:=msoControlButton)

投稿日時: 20/12/24 16:47:54
投稿者: ロードランナー
投稿者のウェブサイトに移動

K.Hiwasaさん
 
わざわざ海外のサイトまで調べていただきありがとうございました。
 
お陰様で教えていただいたコードでSTRTUPフォルダからマクロ有効テンプレートを削除しても、メニューが残ることはなくなりました。
 
ところでもうひとつ分からないことがあります。
 
 With .Controls.Add(Type:=msoControlButton,Temporary:=True)
 
とやってみたのですが、これでもダメ(残る)でした。
これもNormal.dotmとの関係なのでしょうか・・・。
 
まだまだ勉強不足を痛感しておりますです。

投稿日時: 20/12/24 16:51:18
投稿者: ロードランナー
投稿者のウェブサイトに移動

んなっとさん
コメントありがとうございます。
 
今回問題にしていたのは、STARTUPからテンプレートを削除しても、右クリックメニューが残ってしまい、これを何とかしたいということでした。
 
分かりにくい質問ですみませんでした。

回答
投稿日時: 20/12/24 18:04:36
投稿者: K.Hiwasa
投稿者のウェブサイトに移動

なぜかはわかりませんが、Temporaryが効かないんですよね。
ちなみに、過去の私は、先に紹介した方法ではなく、別の方法で対応していました。
 
AutoExitで変更内容を削除しますが、
削除の直前にNormal.dotmを開いて、直後にNormal.dotmを保存していました。
 
これは恐らくそのときの苦肉の策で、おすすめではないです。

投稿日時: 20/12/25 09:44:41
投稿者: ロードランナー
投稿者のウェブサイトに移動

一応、やりたいことが実現できましたので、これで解決とさせていただきます。
 
K.Hiwasaさん、んなっとさん、ありがとうございました。