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関連

    コマンドマクロ一覧(Word 2013 Customer Preview)

    Word 2013 CP版に組み込まれている「コマンドマクロ」のコマン…

  2. Office関連

    コントロールID 一覧(Office 2013)

    2013/03/25 追記:Office 2013のコントロールI…

  3. アイコン一覧

    Office 2013 アイコン一覧(K,L)

    ・Office 2013 アイコン一覧 NUM…

  4. Excel

    Python in Excelのパブリックプレビューがリリースされました。

    ※ 本記事の内容は、2023年8月時点ではまだパブリックプレビュー段階…

  5. Office関連

    64ビット版OfficeでURLエンコード処理ができない?

    2011/12/28 追記:関連記事として「文字コードを指定してU…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP