※ この情報は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
※ 上記コードはエラー処理を行っていないため、そのまま実装することはお薦めできません。




























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