数年前ホームページで「ファイルタブボタンのクリックを禁止する(Office 2010)」という記事を公開したのですが、先日Excel 2013環境で使えない、との質問がありました。
何せOffice 2010 Public Beta版の頃に書いたものなので、製品版のOffice 2010や2013、2016で使えなくなっていてもおかしくはありません。
使えない原因を調べて、コードを手直ししても良いのですが、せっかくなのでUI Automationを使う形に書き換えてみたいと思います。
リボンXML
方法としては、上記記事と同様にbackstage要素のonShow属性を利用します。
<?xml version="1.0" encoding="utf-8"?> <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> <backstage onShow="backstage_onShow" /> </customUI>
標準モジュール
※ 下記コードはUIAutomationClient(UIAutomationCore.dll)要参照
'標準モジュール 'UIAutomationClient(UIAutomationCore.dll)要参照 Option Explicit Public Sub backstage_onShow(contextObject As Object) Dim cls As Class1 Set cls = New Class1 MsgBox "【ファイル タブ】の表示は禁止されています。", vbCritical + vbSystemModal cls.SetTimeoutProc End Sub
クラスモジュール(Class1)
backstage要素のonShow属性のコールバック(backstage_onShow)が実行されるタイミングでは、まだBackstage ビューが表示されていないため、Backstage ビューを閉じる処理を時間差で実行する必要があるのですが、こんなときに使えるApplication.OnTimeメソッドはすべてのOffice アプリケーションに用意されているわけではありません。
そこで、一手間掛かってしまうのですが、「APIを使わないタイマー(Office VBA)」で紹介しているような方法で、setTimeoutメソッドを使って処理を行っています。
'クラスモジュール(Class1) Option Explicit Private d As Object Public Sub SetTimeoutProc() Set d = CreateObject("htmlfile") Set d.parentWindow.onhelp = Me 'setTimeoutで時間差実行 d.parentWindow.setTimeout "onhelp.CloseBackStage", 100, "VBScript" End Sub Public Sub CloseBackStage() 'バックステージを閉じる Dim uiAuto As CUIAutomation Dim elmFileTab As IUIAutomationElement Dim cndFileTab As IUIAutomationCondition Dim acc As IUIAutomationLegacyIAccessiblePattern Const STATE_SYSTEM_NORMAL = 0 Set uiAuto = New CUIAutomation Set cndFileTab = uiAuto.CreatePropertyCondition( _ UIA_AutomationIdPropertyId, _ "FileTabButton" _ ) Set elmFileTab = uiAuto.GetRootElement.FindFirst( _ TreeScope_Subtree, _ cndFileTab _ ) If Not elmFileTab Is Nothing Then Select Case elmFileTab.GetCurrentPropertyValue( _ UIA_LegacyIAccessibleStatePropertyId _ ) Case STATE_SYSTEM_NORMAL Set acc = elmFileTab.GetCurrentPattern( _ UIA_LegacyIAccessiblePatternId _ ) acc.DoDefaultAction End Select End If End Sub
上記コードを設定したファイルを開き、「ファイル タブ」ボタンをクリックすると、メッセージが表示された後、一瞬だけBackstage ビューが表示され、すぐに閉じられます。
仕様上どうしても一度Backstage ビューが表示されてしまうのですが、操作できるほどの時間は無いはずなので、目的は達しているでしょう。
ただ、以前当ブログでも書いたように(「VBAで○○を禁止したい!・・・と思う前に。」参照)、こういった禁止系の処理をマクロで行う必要があるのかどうか、事前に一度検討することをお薦めします。
この記事へのコメントはありません。