マクロを実行するマクロ

スプレッドシート (Calc) について
返信する
cis05
記事: 4
登録日時: 5月 13, 2009, 7:08 pm

マクロを実行するマクロ

投稿記事 by cis05 »

マクロを実行するコードを調べています。おそらく、↓のものだろうと思うのですが・・・
dispatcher.executeDispatch(document, ".uno:RunMacro", "", 0, Array())
こちらの命令の引数など、使い方を教えてください。
※すいませんが、的外れでしたらご指摘ください。

最終的な目的は
「VB.NetからExcelで記録したマクロ(互換性などのコードエラーのないことを確認したもの)をCalcから実行する」
です。起動したり、簡単な操作まではできるようになりました。
参考にさせていただいたURL:http://yorozuya.exeexe.net/vbdotnet_ooo/

やってみた作業は以下の通りです。
Calcでマクロの記録をしてみて、コードを見ています。
マクロを実行するコードを調べるために、以下のような作業を行いました。

①CalcからセルA1に”test”と代入するマクロ「test」を記録します。
(場所はファイルのStandard→Module1です)
②もう一度マクロの記録を開始して、①で記録したマクロ「test」を実行する。

マクロを実行しているのは、以下の部分だと思うのですが
dispatcher.executeDispatch(document, ".uno:RunMacro", "", 0, Array())
実行しているはずのマクロ名がみあたらなく、実行してみると実行するマクロの選択画面になります。

実行しているはずのマクロ名がみあたらないので、RunMacroのあとの""にマクロ名をいれるという意味で"test"としてみました。
すると、何事もおきなません。

以下のようなキーワードで検索などもしてみたのですが、情報を見つけられませんでした。
dispatcher.executeDispatch
OOo ".uno:RunMacro",
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

Re: マクロを実行するマクロ

投稿記事 by tani »

コード: 全て選択

Sub Main

  oDoc = StarDesktop.loadComponentFromURL( "file:///C:/tmp/aaaa.xls", "_blank", 0, Array() ) 
  oSP = oDoc.getScriptProvider
  oSub = oSP.getScript("vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=document")
  oSub.invoke( array(),array(),array())

End Sub
こんな感じでどうでしょうか。
VBA入りのxlsファイルは「C:\tmp\aaaa.xls」、「Module1」に「Main」というサブルーチンがあって、OOoの設定は当然VBASupportが有効になるようになっているという前提です。
cis05
記事: 4
登録日時: 5月 13, 2009, 7:08 pm

Re: マクロを実行するマクロ

投稿記事 by cis05 »

taniさん、返信ありがとうございます。

以下のようにやってみたのですが、エラーになってしまいます。
osub = oSP.getScript("vnd.sun.star.script:Standard.Module1.Macro1?language=Basic&location=document") の部分で
「公開メンバ 'getScript' は型 '_ComObject' に見つかりませんでした。」 というエラーです。

コード: 全て選択

    Private Sub Ole_OOo_Test_2()
        Dim objServiceManager, objDesktop '

        ' OpenOffice.orgに接続し、C:\tmp\test.calcを開く
        objServiceManager = CreateObject("com.sun.star.ServiceManager")
        objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")

        Dim odoc, oSP, osub

        odoc = objDesktop.loadComponentFromURL("file:///C:/macro_TEST.xls", "_blank", 0, dummyArray())
        oSP = odoc.getScriptProvider()
        osub = oSP.getScript("vnd.sun.star.script:Standard.Module1.Macro1?language=Basic&location=document")

        osub.invoke(dummyArray(), dummyArray(), dummyArray())
    End Sub
>OOoの設定は当然VBASupportが有効になるようになっている
ツール→オプション の 読込と保存→VBA属性 の実行可能コードにチェックがはいっていることを確認しました。(初期設定のままのはずです)
VBASupport 1というコードがOOoでコードを開くと確認できます。

バージョンなど書いてなかったので、書いておきます。
Windows XP Pro(SP3)
Open.Office.org 3.0
Visual Basic 2005(.Net)
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

Re: マクロを実行するマクロ

投稿記事 by tani »

目的のファイル(macro_TEST.xls)はloadComponentFromURLの行で正しく開かれていますでしょうか。

また以下の、
"vnd.sun.star.script:Standard.Module1.Macro1?language=Basic&location=document"
の文字列は正しく設定してやる必要があります。
目的のファイル(macro_TEST.xls)の中身がどんなものか分かりませんが、上記設定だとOOoで開いたときにそのドキュメントのStandardライブラリの中のModule1モジュールの Macro1サブルーチンとかを呼び出すことになりますが、あっていますでしょうか?

あと上が通ってないのでまだ関係ないですが、invoke(dummyArray(), dummyArray(), dummyArray())の中の配列は実行させたいサブルーチンやら関数やらに渡す引数とか戻り値なんかを定義します。この辺の用法はぐぐったら出てくると思います。

ちなみコードを見て気付いたのですが、.Net VBからOOoをOle経由で操作させようとしておられるのでしょうか?
私が最初に書いたコードはOOoのマクロ(OOo Basic)上で動かすことを前提としていて、OOo Basicでは動作を確認していました。VBからの操作となるとVB→OOo→xls内のVBAの実行というよく分からない多段構造になっちゃうので、もうちょっと別の方法とか仕様とかを考えたほうが良いかもしれません。
cis05
記事: 4
登録日時: 5月 13, 2009, 7:08 pm

Re: マクロを実行するマクロ

投稿記事 by cis05 »

taniさん、返信ありがとうございます。
tani さんが書きました:目的のファイル(macro_TEST.xls)はloadComponentFromURLの行で正しく開かれていますでしょうか。
はい。開かれます。
tani さんが書きました:目的のファイル(macro_TEST.xls)の中身がどんなものか分かりませんが、上記設定だとOOoで開いたときにそのドキュメントのStandardライブラリの中のModule1モジュールの Macro1サブルーチンとかを呼び出すことになりますが、あっていますでしょうか?
はい、あっています。
マクロの選択画面ではmacro_TEST.xls→Standard→Module1と階層になっていて、右側のマクロ名の欄に、Macro1となっています。
tani さんが書きました:あと上が通ってないのでまだ関係ないですが、invoke(dummyArray(), dummyArray(), dummyArray())の~
わかりました。調べてみます。
tani さんが書きました:ちなみコードを見て気付いたのですが、.Net VBからOOoをOle経由で操作させようとしておられるのでしょうか?
私が最初に書いたコードはOOoのマクロ(OOo Basic)上で動かすことを前提としていて、OOo Basicでは動作を確認していました。VBからの操作となるとVB→OOo→xls内のVBAの実行というよく分からない多段構造になっちゃうので、もうちょっと別の方法とか仕様とかを考えたほうが良いかもしれません。
おっしゃるとおりです。
すでにExcel出力するもので動いているものがあるのですが、OOoをいれた場合におなじように動くように。と考えて現在右往左往しています。

.Net VBでとりあえず、ある程度の理解をして、ほぼ同じコードでできそうなLotus Notes R5のスクリプトも同じことをする予定でいます。
(ファイルを開いたり、操作したりすることがそうだったので)
こちらのほうが前途多難な気がしますが・・・
他の手順なども含めて、いろいろと検討してみます。
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

Re: マクロを実行するマクロ

投稿記事 by tani »

こっちでももうちょっとしつこく調べてみました。
oDoc.getScriptProvider() で帰ってくるScriptProviderオブジェクトが、VB上では何故かgetScriptメソッドを備えてないのでエラーの原因みたいです。
なんとか回避できないかとアレコレ試してみたのですが、いまいちうまくいかないので、ScriptProvider使うのはすっぱり諦めて以下のような感じでどうでしょうか。

コード: 全て選択

Sub Main()

  Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
  Set objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
  Dim dummy()
  Set oDoc = objDesktop.loadComponentFromURL("file:///C:/tmp/aaaa.xls", "_blank", 0, dummy())

  Set oURL = objServiceManager.Bridge_getStruct("com.sun.star.util.URL")
  oURL.Complete = "macro://aaaa/Standard.Module1.Main"
  
  Set oTrans = objServiceManager.createInstance("com.sun.star.util.URLTransformer")
  Call oTrans.parseStrict(oURL)
  
  Set oDisp = objDesktop.queryDispatch(oURL, "_self", 0)
  Call oDisp.Dispatch(oURL, dummy())
  
End Sub
.NETはよくわかんないので、Excel VBAで試しました。
(コード中のaaaaとかStanderdとかModule1とかMainとかは例によって読み替えてください。)
cis05
記事: 4
登録日時: 5月 13, 2009, 7:08 pm

Re: マクロを実行するマクロ

投稿記事 by cis05 »

taniさん、お手数おかけしました。ファイル名などを読み変えただけで、無事動きました。

あとはコードをぐぐってみるなりして、内容を確認したいとおもいます。
わざわざ、ありがとうございました!
返信する

“Calc”に戻る