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

    コンテンツコントロールに外部XMLのデータをマップするWordマクロ

    Word 2007で追加された機能「コンテンツコントロール」を使うと外…

  2. Office関連

    Office 2007のサポートが2017年10月10日に終了します。

    2007年1月にパッケージ版が発売されてから早10年、長らく活躍してき…

  3. Office関連

    スライドマスターのフォントを一括変更するPowerPointマクロ

    PowerPointでスライドを作成中、マスターのフォントをまとめて変…

  4. Office アドイン

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

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

  5. Office関連

    ページ番号を取得するWordマクロ

    Wordマクロで選択位置のページ番号を取得する場合、簡単なのはSele…

  6. アイコン一覧

    Office 365アイコン(imageMso)一覧(I)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP