Office アドイン

JavaScriptで作成した作業ウィンドウアプリを検証してみる。

※ この情報はOffice 2013 カスタマー プレビュー版を元にしています。製品版では変更になる可能性がありますのでご注意ください。

これまでExcel 2013用作業ウィンドウのアプリをJavaScriptで作成する方法について記事を書いてきましたが(下記参照)、今回は下記記事を書くにあたって疑問に思ったことを一つずつ検証していこうと思います。

・JavaScriptでExcel 2013用作業ウィンドウのアプリを作成する。
//www.ka-net.org/blog/?p=1995
・JavaScriptでExcel 2013用作業ウィンドウのアプリを作成する。(2)
//www.ka-net.org/blog/?p=2022
・JavaScriptでExcel 2013用作業ウィンドウのアプリを作成する。(3)
//www.ka-net.org/blog/?p=2050

■ アプリは全体に反映される?ドキュメント単位?

Office用アプリを挿入すると、挿入したアプリは全体に反映される(どのドキュメントを開いてもアプリが表示される)のか、個別のドキュメント単位で反映されるのかを調べてみました。

結果は上図の通りドキュメント単位で反映されるようです。
このことはアプリを挿入したドキュメントをZip解凍するとよく分かります。

アプリを挿入したドキュメントの場合、上図のようにxlフォルダの中に「webextensions」フォルダがあり、その中に作業ウィンドウアプリを定義したXMLファイルが格納されていることが確認できます。

ちなみに、アプリを挿入したファイルをアドイン(xlam形式)として登録した場合でも全体にアプリは反映されませんでした。(といっても”Office 用アプリのリスト“からすぐにアプリを挿入できるので、全体に反映させる必要はあまり無さそうですが…)

■ アプリ名や作成者名、説明には全角文字は使える?

アプリ名や作成者名、説明(カタログ用XMLファイルのProviderName要素、DisplayName要素、Description要素)に日本語(全角文字)が使えるかどうかを試してみました。

上図の通り、問題は無さそうです。

■ アニメーションGIFは使える?

imgタグを貼り付けて実際に確認してみましたが、上図の通り(上図では分かりづらいですが…)問題無く動きました。

■ Flash ムービーは再生できる?

embedタグやiframeタグで動画を埋め込んで確認してみましたが、「この Web サイトのアドオンは実行できませんでした。[インターネット オプション] のセキュリティ設定で、競合がないことを確認してください。」との警告が表示されて再生できませんでした。
Internet Explorerのセキュリティ設定を変更すれば再生できるかもしれませんが、ユーザー環境に依存するようでは汎用性は低いだろうと思います。
ちなみに、YouTubeの場合はHTML5 動画プレーヤーが有効になっている場合には警告が表示されませんでした。

■ HTML以外のファイルも動かせる?

カタログ用XMLファイルのSourceLocation要素でアプリの実態となるファイルを指定していますが、HTMLファイル以外でも動作するのか試してみました。

結果は上図の通りで、サーバー上のPHPも問題無く実行できました。
これができるということは、JavaScript API for Office + Webシステム(DB)の組み合わせで、入出力を行うインターフェースとしてWordやExcelを利用することができるわけで、アイデア次第では相当活用できるだろうと思います。
Office 2013: Introduction to apps for Office 2013 Previewに”Apps for Office can do pretty much anything a webpage can do in a browser“とある通り、インターネットブラウザーでできることはある程度実行可能なようですね。

■ 任意のWebページを表示できる?

上記「HTML以外のファイルも動かせる?」でも確認しましたが、作業ウィンドウにはHTML以外でも表示することができます。
今度はカタログ用XMLファイルのSourceLocation要素で任意のWebページを指定して、表示できるかどうかを試してみました。

結果は上図の通り、問題なく表示できました。
ちなみに作業ウィンドウアプリからアクセスした場合のブラウザ情報は、私の環境では「Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)」となっており、Internet Explorerとして扱われていることが確認できます。

■ 結局作業ウィンドウアプリはIEなの?

上記「任意のWebページを表示できる?」で答えを書いていますが、作業ウィンドウアプリの実体はInternet Explorerです。

クラスを見ても「Internet Explorer_Server」となっており、作業ウィンドウアプリにはIEが使われていることが確認できます。
ちなみに、下記コードのようにウィンドウハンドルからHTMLDocumentオブジェクトを取得すればVBAからDOM操作を行うこともできます。

Option Explicit

Private Type UUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(0 To 7) As Byte
End Type

Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, lParam As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function ObjectFromLresult Lib "oleacc" (ByVal lResult As Long, riid As Any, ByVal wParam As Long, ppvObject As Object) As Long
Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" (ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal fuFlags As Long, ByVal uTimeout As Long, lpdwResult As Long) As Long
Private Const SMTO_ABORTIFHUNG = &H2

Private hAppWorkPane As Long
Private hIES As Long
Private Const AppName = "HelloWorld" 'アプリ名指定

Public Sub Sample()
'作業ウィンドウのIE部分をDOM操作(64ビット版Excelでは不可)
'http://www.mvps.org/emorcillo/en/code/vb6/iedom.shtml 参照
  Dim msg As Long
  Dim res As Long
  Dim d As Object
  Dim IID_IHTMLDocument As UUID
  
  EnumChildWindows Application.hWnd, AddressOf EnumChildProcWP, 0&
  If hAppWorkPane = 0& Then Exit Sub
  EnumChildWindows hAppWorkPane, AddressOf EnumChildProcIES, 0&
  If hIES = 0& Then Exit Sub
  msg = RegisterWindowMessage("WM_HTML_GETOBJECT")
  SendMessageTimeout hIES, msg, 0&, 0&, SMTO_ABORTIFHUNG, 1000&, res
  If res Then
    With IID_IHTMLDocument
      .Data1 = &H626FC520
      .Data2 = &HA41E
      .Data3 = &H11CF
      .Data4(0) = &HA7
      .Data4(1) = &H31
      .Data4(2) = &H0
      .Data4(3) = &HA0
      .Data4(4) = &HC9
      .Data4(5) = &H8
      .Data4(6) = &H26
      .Data4(7) = &H37
    End With
    If ObjectFromLresult(res, IID_IHTMLDocument, 0&, d) = 0& Then
      d.getElementById("btnHelloWorld").Click
    End If
  End If
End Sub

Private Function EnumChildProcWP(ByVal hWnd As Long, ByVal lParam As Long) As Long
  Dim buf1 As String * 255
  Dim buf2 As String * 255
  Dim ClassName As String
  Dim WindowName As String
  
  GetClassName hWnd, buf1, Len(buf1)
  ClassName = Left(buf1, InStr(buf1, vbNullChar) - 1&)
  If ClassName = "MsoWorkPane" Then
    GetWindowText hWnd, buf2, Len(buf2)
    WindowName = Left(buf2, InStr(buf2, vbNullChar) - 1&)
    If WindowName = AppName Then
      hAppWorkPane = hWnd
      EnumChildProcWP = False
      Exit Function
    End If
  End If
  EnumChildProcWP = True
End Function

Private Function EnumChildProcIES(ByVal hWnd As Long, ByVal lParam As Long) As Long
  Dim buf As String * 255
  Dim ClassName As String
  
  GetClassName hWnd, buf, Len(buf)
  ClassName = Left(buf, InStr(buf, vbNullChar) - 1&)
  If ClassName = "Internet Explorer_Server" Then
    hIES = hWnd
    EnumChildProcIES = False
    Exit Function
  End If
  EnumChildProcIES = True
End Function

※ 上記コードはエラー処理を行っていないため、そのまま実装することはお薦めできません。

関連記事

  1. Office関連

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

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

  2. Windows 10

    Microsoft Edgeを操作するVBAマクロ(DOM編)

    2017/1/31 追記:一部コードを修正した記事を公開しました。…

  3. Office関連

    Gmail APIを使ってメール送信するVBAマクロ(2)

    前回の記事でGmail APIを使ってメールを送信するVBAマクロを紹…

  4. Office関連

    指定したファイルをエクスプローラーで開いて選択するVBAマクロ

    マクロから直接ファイルを開くこともできるけどファイルの操作はユーザーに…

  5. Office関連

    UIAutomationClient参照時にDLL読み込みエラーが発生した時の対処法

    マクロでダイアログやボタンの操作を行う時に便利なUI Automati…

  6. Office関連

    [リボン・カスタマイズ]dropDown要素の初期項目を指定する。

    MSDN フォーラムに「リボン:ドロップダウンリストにlabel初期値…

コメント

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP