[[20160714175956]] 『アドインでWorkbookのイベントプロシージャーを使』(mugi) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『アドインでWorkbookのイベントプロシージャーを使用する方法』(mugi)

お世話になります。

アドインでシート追加時にコードを実行したいのですがうまくいきません。
「AddinInstall」や「AddinUninstall」、「Open」イベントは問題ないですが
「NewSheet」イベントをひろってくれないのはなぜでしょうか?

恐れ入りますが、どなたかご教授よろしくお願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 アドインブックの Thisworkbookモジュールのコードをすべてアップされてはいかがですか?

 つまり、コードを見ない限り、なぜでしょう という問いに対しては、そのイベントをキャッチできないコードになっているのでは?
 という 推測しか申し上げられませんので。

(β) 2016/07/14(木) 18:56


β様
ご指摘いただきありがとうございます。コードをアップさせていただきました。

問題の箇所は「Workbook_NewSheet(ByVal Sh As Object)」の部分になります。
(ListMakeは標準モジュールにかいたサブプロシージャです。)
アドインブック上では動作するのですが
アドイン登録後、別のブックで試すとNGという状況です。

恐れ入りますがご確認をよろしくお願いいたします。

Option Explicit
Const conAddinName As String = "SheetListup.xlam"

Private Sub Workbook_NewSheet(ByVal Sh As Object)

   Call ListMake
End Sub

Private Sub Workbook_Open() 'アドインファイルが開かれた際に実行

    Call Check_Addin
    With Excel.Application
        'セルの右クリックメニューへの登録
        With .CommandBars("Cell").Controls.Add(Temporary:=True)
            .FaceId = 59 'ボタンにアイコンを表示
            .BeginGroup = True 'グループ線を引く
            .Caption = conAddinName 'アドインの名前登録
            .OnAction = "ShowListBox" '実行するマクロ
        End With
    End With
End Sub
'-------------------------------------------------------------------------------------------------------

Private Sub Check_Addin() 'コマンドを検索し、既にコマンドがあればそれを削除

    Dim objCC As CommandBarControl
    With Excel.Application.CommandBars
        With .Item("Cell")
            For Each objCC In .Controls
                If objCC.Caption = conAddinName Then .Controls.Item(conAddinName).Delete
            Next
        End With
        With .Item("Worksheet Menu Bar")
            For Each objCC In .Controls
                If objCC.Caption = conAddinName Then .Controls.Item(conAddinName).Delete
            Next
        End With
    End With
End Sub
'-------------------------------------------------------------------------------------------------------

Private Sub Workbook_AddinUninstall() 'アドインの組み込み解除時に実行

    Call Check_Addin
End Sub

(mugi) 2016/07/14(木) 19:32


 アドインブックであれ、通常ブックであれ、Thisworkbookモジュールの Private Sub Workbook_NewSheet(ByVal Sh As Object) は
 「それが記述されているブック」でのシート追加に反応します。
 つまり、アドインブックのコードであれば、「そのアドインブック」のシート追加に反応するということは理解されているんですよね?

 そうではなく、当該エクセル区画で開かれるすべてのブックのシート追加に反応させたかったのでは?
 であれば、コードは、このままではだめですね。

(β) 2016/07/14(木) 19:39


β様
すいません。初心者同然のため、よく理解はできておりません。。
いただいたヒントから WithEvents を使用すればいいのかなと思い
ネットで調べながらあれこれ試行錯誤してみましたがうまくいきません。
もう少し調べてみたいと思います。

(mugi) 2016/07/14(木) 22:09


過去ログの [[20100203082100]] を参考に、解決の糸口がつかめました。
(mugi) 2016/07/14(木) 22:15

 シート追加時の ListMake で何をしているのか、そのコードが見えないことと、その何らかの処理の対象が
 たまたまエクセル区画で開かれる、あるいは新規で作成される一般的なブックすべてを対象にしているのかどうか
 そういったこと(要件)がまったく不明ですが、コード自体は、以下にすれば反応すると思います。

 ただ(繰り返します。要件が見えないのですけど)少なくとも、このシート追加時の処理は アドインでやるべきではないような
 そんな予感がします。

 ともあれ。

 Dim WithEvents xlApp As Application

 Private Sub Workbook_Open()
    Set xlApp = Application
 End Sub

 Private Sub xlApp_WorkbookNewSheet(ByVal Wb As Workbook, ByVal Sh As Object)
    MsgBox Wb.Name & vbLf & Sh.Name '★確認用コードです
 End Sub

(β) 2016/07/14(木) 22:16


β様
ご回答いただきありがとうございます。
ご提示いただいたコードでも目的が果たせることを確認いたしました。

いまさらで恐縮ですが
作成したマクロは、アクティブなブックの「シート」一覧をユーザフォーム上に表示(リストボックス)。
ユーザフォーム上での選択に応じてシートを切り替える というものです。

Excelはシート見出しが下に表示されますが、シート数が多かったり、シート名が長いと目的のシートを開くのが手間なので作成した次第です。(ウィンドウ横に表示してくれると助かるのですが。。。)
(左下の矢印を右クリックするとシート一覧が表示されますが、それを常に表示させるイメージです。)

ユーザーフォームの呼び出しは右クリックメニューから行っています。
「ListMake」はシート一覧を取得してユーザフォームに反映させるマクロです。
シートの追加や削除にあわせて実行しています。(シート名変更はいい方法が見つかりませんでしたが)

別のブックを開いた場合も、そのブックのシート一覧に更新するようにしています。

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

(mugi) 2016/07/15(金) 09:52


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.