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

    マクロに割り当てたショートカットキーをCSVファイルとして出力するWordマクロ

    Word MVPの新田さんが書かれた以下の記事を見て思いついたマクロで…

  2. Microsoft Teams

    Microsoft Teamsでタブの構築を試してみました。

    下記記事の通り、Office 365に新たなコラボレーションツール「M…

  3. Office関連

    Office 2016でACROBATタブが表示されない!?(Acrobat DC)

    2015/10/16 追記:先日公開されたアップデート「15.00…

  4. Office アドイン

    [Office用アプリ]第三回 Apps for Office 勉強会で登壇しました。

    10月4日(土)に開催されたOffice 用アプリの勉強会「第3回 A…

  5. Office関連

    Locationヘッダの情報を取得するVBAマクロ

    通常、下記のようなリダイレクトされるWebページを開いたとき、…

  6. Office関連

    [Excel VBA]PrintPreview後に印刷するとCtrl+;の日付形式が変わる?

    MSDNフォーラムで面白い質問がありました。・Excel …

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP