Office関連

[VBA]ファイルタブ(Backstage ビュー)の表示を禁止する。

数年前ホームページで「ファイルタブボタンのクリックを禁止する(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 ビューが表示され、すぐに閉じられます。

ProhibitionBackstageView_01

仕様上どうしても一度Backstage ビューが表示されてしまうのですが、操作できるほどの時間は無いはずなので、目的は達しているでしょう。

ただ、以前当ブログでも書いたように(「VBAで○○を禁止したい!・・・と思う前に。」参照)、こういった禁止系の処理をマクロで行う必要があるのかどうか、事前に一度検討することをお薦めします。

Office 2016のコントロールIDリストが公開されました。前のページ

【まほうのルミティア】ルミティアステッキをもっと光らせてみたよ。次のページ

関連記事

  1. Office関連

    【2017年1月版】Microsoft Edgeを操作するVBAマクロ(DOM編)

    2021/10/1 追記:本記事は公開されてから大分時間が経ってお…

  2. Excel

    CDOを使ってGmail送信を行うVBAマクロ(UTF-8対応版)

    2年ほど前にCDOを使ってGmail送信を行うVBAマクロについて記事…

  3. Office関連

    Word 2013では文書にオンライン ビデオを挿入できるようになりました。

    ※ この情報はOffice 2013 カスタマー プレビュー版を元にし…

  4. Office関連

    [PowerPoint]ドキュメントを開いたときに自動的にマクロを実行する

    ドキュメントを開いたときに自動的にマクロを実行する方法として、Word…

  5. Office関連

    覚えていますか?ISHとLHA、パソコン通信の思い出

    この記事のアイキャッチ画像、文字化けしているわけではないですよ。画…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP