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

    PhpSpreadsheetを使ってPHPからExcelファイルを出力してみる。

    一年半ほど前、「PHPWord」を使ってPHPからWordファイルを出…

  2. Office関連

    Faviconをダウンロードするマクロ

    WebサイトからFaviconを抜き出すAPIがあったので早速使ってみ…

  3. Office関連

    PHPPresentationを使ってPHPからPowerPointファイルを出力してみる。

    久しぶりにPHPOfficeを覗いてみたら「PHPPresentati…

  4. Office アドイン

    Visio JavaScript APIで遊んでみました。

    前回の記事でプレビュー版がリリースされた「Visio JavaScri…

  5. Office関連

    オフライン版のOffice 2016 VBAリファレンスが公開されました。

    「ヘルプファイル版のOffice 2013開発者用リファレンスが公開さ…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

Translate

Chinese (Simplified)Chinese (Traditional)EnglishFrenchGermanJapaneseKoreanRussianSpanish

最近の記事

アーカイブ

PAGE TOP