「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:3
総数:4080
現在:6


ファイルに埋め込まれたマクロを外部から実行するには?

ページOpenOffice.org FAQの登録ページ
投稿者
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-03-03 17:42:25 (水)
OSXP
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

MS-OfficeではC#などの言語を使用し、Officeドキュメントに埋め込まれた マクロを実行する事が出来ました。 OpenOfficeでも同じように、外部からドキュメント内のマクロを実行する事は 可能なのでしょうか?

現状、OpenOfficeの起動は出来ているのですがマクロの実行する部分が 分からなくて困っています。 どなたか、ドキュメント等の場所でも構わないのでご存知であれば 教えてください。


コマンドでマクロを起動します

M.Kamataki (2010-03-03 18:09:53 (水))

faq/5/103「クイック起動時 スプラッシュを出す方法」の回答「マクロの可能性」で、登録されたOpenOffice.orgのマクロを実行する方法を紹介しています。

また、外部サイトですが、以下でも説明があります。

外部からマクロを起動する
http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoBasic%2FGeneric%2Fexecute

無題

tani (2010-03-03 18:50:21 (水))

sofficeコマンドをシステムに投げて、マクロを実行するというのはシンプルで良いと思いますが、
要件によっては、やりかたが大雑把すぎるかもしれません。

http://user.services.openoffice.org/ja/forum/viewtopic.php?f=10&t=322#p1173
例えば↑はVBからOOoをcreateObjectしてファイルの中のマクロを実行するコードです。
(開くファイルはxlsになってますが、odsとかでも同様にいけるはずです。)
こっちのほうが制御がVB側に残っているので色々都合が良いかもしれません。

無題

(2010-03-04 09:39:26 (木))

M.Kamatakiさん、taniさん
回答ありがとうございます。
提示していただいた情報で実現可能みたいです。
有難うございました!

パラメータを渡す事が出来ません

(2010-03-04 14:46:50 (木))

VB.netで動くようになりました。
そこで追加で質問させてください。

現状のコードですとマクロ自体の起動を行うことは出来るのですが
パラメータを渡す事が出来ません。
おそらく oURL.Complete = "macro://aaa/Standard.Module1.test" 付近に
パラメータを埋め込めば良いと思うのですがやり方がわかりません。
申し訳ないのですが教えていただけないでしょうか?


◆動くコード(パラメータなし)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim objServiceManager As Object
       Dim objDesktop As Object
       Dim oDoc As Object
       Dim oURL As Object
       Dim oTrans As Object
       Dim oDisp As Object
       objServiceManager = CreateObject("com.sun.star.ServiceManager")
       objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
       oDoc = objDesktop.loadComponentFromURL("file:///C:/aaa.ods", "_blank", 0, New unoidl.com.sun.star.beans.PropertyValue(0 - 1) {})
       'Macro設定
       oURL = objServiceManager.Bridge_getStruct("com.sun.star.util.URL")
       oURL.Complete = "macro://aaa/Standard.Module1.test"
       'MacroRun
       oTrans = objServiceManager.createInstance("com.sun.star.util.URLTransformer")
       Call oTrans.parseStrict(oURL)
       oDisp = objDesktop.queryDispatch(oURL, "_self", 0)
       Call oDisp.Dispatch(oURL, New unoidl.com.sun.star.beans.PropertyValue(0 - 1)
       MessageBox.Show("End")
   End Sub

無題

tani (2010-03-04 16:47:12 (木))

http://www.oooforum.org/forum/viewtopic.phtml?t=991
ググると↑の一番下のコード(htmlに埋め込まれたVBScript)が出てきました。

引数を渡すには、"macro://aaa/Standard.Module1.test"の文字列に追加すれば良いみたいです。
"macro://aaa/Standard.Module1.test?hogehoge Arg1,fugafuga Arg2"
みたいな感じだそうです。(日本語通るのか?)
戻り値もとれるみたいです。

# 私は試してませんので、この方法が今でもちゃんと動くかどうかは不明です。

# ホントはScriptProviderのinvokeメソッドとかを使うのがすっきりするのでしょうが、

# http://api.openoffice.org/docs/common/ref/com/sun/star/script/provider/XScript.html

# 前にVBから試したときは何故か動かなかったのでまずは上記を試してみてください。

無題

(2010-03-04 17:10:13 (木))

やってみましたが駄目でした。

oURL.Complete = "macro://aaa/Standard.Module1.test?hogehoge Arg1"

を実行した所、表示されるはずのMsgBoxが表示せずに終わってしまいました。

提示していただいたHPの情報が2003年なのでもしかしたら変更されているのかも知れませんね。

ちなみに、マクロ自体は実験なので渡された値を表示するだけです

Sub test( byVal test As String)
   MsgBox test
End Sub

# ホントはScriptProviderのinvokeメソッドとかを使うのがすっきりするのでしょうが、
後で確認してみます。

無題

tani (2010-03-04 20:58:55 (木))

ダメでしたか。。。
明日手があいていたら私もちょっと試してみます。

無題

ike@九州 (2010-03-05 11:34:34 (金))

VBA からは以下で普通にOKでした(戻り値については不明)

oURL.Complete = "macro://aaa/Standard.Module1.test(成功)"

無題

tani (2010-03-05 18:47:10 (金))

私のところでも以下のようなVBScriptが通りました。

# 普通にカッコの中に「hogehoge」という文字列の引数を入れてます。

# 誤解させるような記述をしてしまってごめんなさい。(私自身が元のコードを誤解してました。)

Call Main

Sub Main()
  Dim oSM, oDesktop, oDoc, oURL, oTrans, oDisp
  Dim aProps(0)
  Dim aOutParam()
  
  Set oSM = CreateObject("com.sun.star.ServiceManager")
  Set oDesktop = oSM.createInstance("com.sun.star.frame.Desktop")
  
  Set aProps(0) = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
  aProps(0).Name = "MacroExecutionMode"
  aProps(0).Value = 4
  Set oDoc = oDesktop.loadComponentFromURL("file:///C:/aaaa.ods", "_blank", 0, aProps)
  
  Set oURL = oSM.Bridge_getStruct("com.sun.star.util.URL")
  oURL.Complete = "macro://aaaa/Standard.Module1.test(""hogehoge"")"
  
  Set oTrans = oSM.createInstance("com.sun.star.util.URLTransformer")
  Call oTrans.parseStrict(oURL)
  
  Set oDisp = oDesktop.queryDispatch(oURL, "_self", 0)
  Call oDisp.Dispatch(oURL, aOutParam)
  
  Call oDoc.close(False)
  Set oSM = Nothing
End Sub

無題

(2010-03-08 10:14:24 (月))

返信が遅くなりました。
提示していただいた内容で実行してみましたがまだ動きません。

tani さんが提示してくれたコードを移植してみましたが
相変わらずパラメータの内容が表示されません。

もともとのコードでは
対象ファイルを開く際にプロパティでNullを設定しましたが
提示されたコードでは「MacroExecutionMode」を使用されていたので試してみましたが
状況変わらずです。
マクロ自体は起動しているので、何かがまだ足りないのでしょうか?

       objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
       oProps(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue") '追加
       oProps(0).Name = "MacroExecutionMode"
       oProps(0).Value = 4

       'oDoc = objDesktop.loadComponentFromURL("file:///C:/aaa.ods", "_blank", 0, New unoidl.com.sun.star.beans.PropertyValue(0 - 1) {})
       oDoc = objDesktop.loadComponentFromURL("file:///C:/aaa.ods", "_blank", 0, oProps)


       'Macro設定
       oURL = objServiceManager.Bridge_getStruct("com.sun.star.util.URL")
       oURL.Complete = "macro://aaa/Standard.Module1.test(""hogehoge"")"
       oURL.Complete = "macro://aaa/Standard.Module1.test("hogehoge")"  '両方値が表示されない

無題

(2010-03-08 11:46:23 (月))

ScriptProviderのinvokeメソッドで実行してみました。

以前にtani さんが確認されたときは「getScript」が動かなかったとの事ですが確認した所、コンパイルは通りました。
なお、使用している環境は
VB.Net2005 SP2
OpenOffice3.2.0(Build9483) です。

ただ、以前マクロ側にパラメータが渡っていません。
invokeメソッドのパラメータが正しく設定できていないと思うのですが
oSub.invoke("test", oArray(0), oArray(0) ではダメなのでしょうか?

言語は違いますが
http://blog.good-day.net/~tani/diary/?date=200902
によると、第一パラメータに引数を渡しています。

    objServiceManager = CreateObject("com.sun.star.ServiceManager")
       objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
       oProps(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
       oProps(0).Name = "MacroExecutionMode"
       oProps(0).Value = 4 'ALWAYS_EXECUTE_NO_WARN
       'oDoc = objDesktop.loadComponentFromURL("file:///C:/aaa.ods", "_blank", 0, New unoidl.com.sun.star.beans.PropertyValue(0 - 1) {})
       oDoc = objDesktop.loadComponentFromURL("file:///C:/aaa.ods", "_blank", 0, oProps)
       'Macro設定
       oSP = oDoc.getScriptProvider
       oSub = oSP.getScript("vnd.sun.star.script:Standard.Module1.test?language=Basic&location=document")
       'Macro実行
       oSub.invoke("test", oArray(0), oArray(0))

無題

ike@九州 (2010-03-08 12:35:43 (月))

Calc 上の macro 名と変数名が同じなのが問題ではありませんか

Sub test( byVal test As String)
  MsgBox test
End Sub

無題

(2010-03-08 13:06:16 (月))

Bridge_getStruct及びInvokeの両方のパラメータ部分の文字列を
変更してみましたが変わらず、メッセージボックス上に指定した変数が表示されません。

再確認

ike@九州 (2010-03-08 13:36:37 (月))

Visual Vasic 2008 Express Edition 、Bridge_getStruct 記述で無問題です
(Invoke では getscript でエラー)

Calc上マクロを以下に修正してください

Sub test( byVal s As String)
 MsgBox s
End Sub

無題

(2010-03-08 13:38:02 (月))

申し訳ありません。
invokeの方ですが、間違ったメソッドを変更していた為、実際には使用使用されていませんでした。
確認した所、taniさんが提示してくれた
http://user.services.openoffice.org/ja/forum/viewtopic.php?f=10&t=322#p1173
の内容と同じく「getScript」が見つかりませんでした。
ですので、Bridge_GetStructを使用するしか無い模様です。

解決

(2010-03-08 13:41:36 (月))

ike@九州 さん 有難うございます。
ご指摘の通り、マクロ側のコードを変更した所、期待通りの動きをしました。
しかし、マクロ側の問題だったとは・・・(^^;

本当に有難うございました!

完了にしました

M.Kamataki (2010-03-08 14:29:17 (月))

解決したようなので、状態を完了に変更します。

なお、ページが長くなったのでコンテンツをつけたのですが、無題ばかりであまりわかりやすくなりません。そこで、ご質問された方にお願いがあります。

「サマリ」という題名で、今回のご質問について、つまづいたところなど、ポイントとなる点をまとめていただいたものをとうこうしていただけますでしょうか。もちろん強制ではありませんが、ご協力いただけますと助かります。

サマリ

(2010-03-08 14:50:42 (月))

M.Kamatakiさん

質問の内容をまとめてみました。

VB.netからXLS(ODT)ファイル内に埋め込まれたマクロを実行するには下記のコードを実行する。

理由は不明だが
osub = oSP.getScript("vnd.sun.star.script:Standard.Module1.Macro1?language=Basic&location=document") 
を使用した場合「「公開メンバ 'getScript' は型 '_ComObject' に見つかりませんでした。」 というエラーです。」になり
使用することが出来ない。
ただ、「Bridge_GetStruct」を使用すれば実現可能です。

VB.net側のコード

Form上のボタンイベント(Button1_Click)に下記のコードを記載する。

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim objServiceManager As Object
       Dim objDesktop As Object
       Dim oProps(0) As Object
       Dim oDoc As Object
       Dim oURL As Object
       Dim oTrans As Object
       Dim oDisp As Object
       objServiceManager = CreateObject("com.sun.star.ServiceManager")
       objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
       oProps(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
       oProps(0).Name = "MacroExecutionMode"
       oProps(0).Value = 4 'ALWAYS_EXECUTE_NO_WARN
       oDoc = objDesktop.loadComponentFromURL("file:///C:/aaa.xls", "_blank", 0, oProps)
       'Macro設定
       oURL = objServiceManager.Bridge_getStruct("com.sun.star.util.URL")
       oURL.Complete = "macro://aaa/Standard.Module1.test(読み込む文字列)"
       oTrans = objServiceManager.createInstance("com.sun.star.util.URLTransformer")
       Call oTrans.parseStrict(oURL)
       'Dispatchにてマクロ起動
       oDisp = objDesktop.queryDispatch(oURL, "_self", 0)
       Call oDisp.Dispatch(oURL, New unoidl.com.sun.star.beans.PropertyValue(0 - 1) {})
       MessageBox.Show("End")
       Me.Close()
   End Sub

Excel/Calcのマクロのコード

Sub test( byVal s As String) 'パラメータ名は関数名と異なる物にする。
   MsgBox s
End Sub
お名前:
題名: