* VBSでcalcファイルを開きたい [#f11de91b]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|S-Osaka|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(普通,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(その他,faq03,category)|
 |~投稿日|2010-10-18 10:29:04 (月)|
 |~OS|win vista|
 |~依存するページ||
 |~バージョン|#listbox3(3.2.1,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#uc57167d]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 パソコンのタスクスケジューラを使って電源ON、必要なアプリケーション群を立ち上げる、作業、作業終了後、必要なアプリケーション群を閉じる、電源を落とす。~
 と言うことをやっています。~
 今は下記の命令文でエクセルに作業させていますが、calcのプログラムが同様の作業をできるようになったのでエクセルと交代したいと思っています。~
 VBスクリプトに関することであり、ここで、質問するのはなじまない性格の内容かもしれないので、迷ったのですがもし助言がいただければよろしくお願いします。~
 ~
 開く~
 ~
  Set oEXCEL = WScript.CreateObject("Excel.Application")
  oEXCEL.Workbooks.Open(SelfPath & "..\..\Board.xls")
  oEXCEL.Visible = True
  oEXCEL.Sheets(1).Select
 ~
 ※Visibleの部分は制御したい項目です。~
 ~
 閉じる~
 ~
  Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator")
  Set Service = Locator.ConnectServer
  
  Set eProcs = Service.ExecQuery _
   ("Select * From Win32_Process Where Description=""EXCEL.EXE""")
  For Each eProc In eProcs
  	eProc.Terminate
  Next
 ~
 また、ネットで、以下のようなものを見つけたのですが、これで開くとマクロにブロックがかかるようです。~
 このブロックを解除する方法を、この命令文側で行う方法、calc本体側で行う方法の両方知りたいのですが、~
 どうかよろしくお願いします。~
 ~
  Dim wShell
  Dim Link
  Dim Path
  Dim Document
  Set wShell=CreateObject("WScript.Shell")
  Set Link=wShell.CreateShortCut(".url")
  Set Document=WScript.GetObject("about:blank")
  Set OSM = WScript.CreateObject("com.sun.star.ServiceManager")
  Set oDesktop = OSM.createInstance("com.sun.star.frame.Desktop")
  
  Dim Result() 'As Object
  dummyArray = Result
  Set oCalcDoc = ODesktop.loadComponentFromURL(SelfPath & "../classic.ods", "_blank", 0, dummyArray)
 ----
 ***まずは はにゃ?さん のサイトを調べましょう [#z1902c85]
 >ike@九州 (2010-10-18 15:10:12 (月))~
 ~
 http://hermione.s41.xrea.com/pukiwiki/index.php?OOoBasic%2FGeneric%2Fexecute~
  〜
  Dim args(1)
  For i = 0 To UBound(args)
     Set args(i) = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
  Next
  args(0).Name = "Hidden"             '表示、非表示
  args(0).Value = False
  args(1).Name = "MacroExecutionMode" 'マクロの実行モード
  args(1).Value = 4
  
  Set oCalcDoc = oDesktop.loadComponentFromURL("file:///E:/usr/doc.ods", "_blank", 0, args)
  '以下は特定のマクロを実行する場合
  'ドキュメント内マクロ
  scriptURI = "vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=document"
  'マイマクロ内マクロ
  'scriptURI = "vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=application"
  
  Set scriptProvider = oCalcDoc.getScriptProvider()
  Set introspection = oSM.createInstance("com.sun.star.beans.Introspection")
  Set inspected = introspection.inspect(scriptProvider)
  Set m = inspected.getMethod("getScript", -1)
  Set s = m.invoke(scriptProvider, array(scriptURI ))
  Call s.invoke(array(), array(), array())
  
  '上書き保存
  'Call oCalcDoc.store
   
  '名前をつけて保存の場合
  'Call oCalcDoc.storeAsURL("file:///E:/test.ods",dummyArray)
  
  '閉じる
  'Call oCalcDoc.close(true)
  
  'OOoを終了する
  'Call oDesktop.terminate()
 
 //
 ***もう少しだけ教えてください。 [#qbd79ec7]
 >S-Osaka (2010-10-18 17:20:22 (月))~
 ~
 はにゃ?さん のサイトは何度も見ているのですがこういうことだということがさっぱりわかりませんでした。~
 申し訳ないです。~
 こうやって教えて貰って実行して成功してから書いてあることの意味がだんだ飲み込めてくると言うような感じです。~
 oCalcDocですが、~
 Set oCalcDoc = oDesktop.loadComponentFromURL("file:///E:/usr/doc.ods", "_blank", 0, args)~
 で開くようですが、開くスクリプトと閉じるスクリプトが別々の場合閉じるときはどう書けばよいのでしょうか?~
 また、その際に特定のマクロを実行するか、終了したい場合どのようにすればよいのでしょうか?~
 
 //
 ***PS [#m3461ff6]
 >S-Osaka  (2010-10-18 17:26:47 (月))~
 ~
 毎秒監視しているマクロがcalc側の終了前のマクロ実行で停止させたつもりが、タイミングのためか停止せず、エラーが出てしまいます。~
 
 //
 ***無題 [#y95d559f]
 >S-Osaka  (2010-10-19 00:32:29 (火))~
 ~
 終了の際のoCalcDocは~
 Set oCalcDoc = oDesktop.getCurrentComponent()~
 でなんとかできました。~
 あとは終了少し前にタイマーのマクロを終了したいのですが、~
 その終了用のマクロの実行がどうしても上手く行きません。~
 よろしくお願いします。~
 
 //
 ***終了用のマクロの実行 [#d159ba74]
 >ike@九州 (2010-10-19 08:22:48 (火))~
 ~
 Set scriptProvider = oDoc.getScriptProvider()~
 上記を以下に(タイプミスでした)~
 Set scriptProvider = oCalcDoc.getScriptProvider()~
 
 //
 ***原因がわかりました。 [#c1ecad16]
 >S-Osaka (2010-10-19 11:44:03 (火))~
 ~
 いつも教えていただいてとても感謝しています。~
 タイプミスのところは気付いていたのですが、どうしても教えていただいた文の最終前が引っかかって上手く行きませんでした。~
 プロシージャのパス指定が上手くいかないようなので、いろいろググっているうちに引数をわたす括弧のことが書かれているものをいくつか見させていただきました。~
 タイマー停止命令は最初のころに何もわからず(今も同様ですが)テストがてらに適当に書いたころのもので、タイトルの後に無意味な空の括弧が付いていました。~
 この括弧をとっちゃうとうまく行きました。~
 なお、マクロにブロックがかかった状態で開いたブックの本体からこのブロックを解除する方法はあるのでしょうか?~
 もしあれば教えてください。~
 
 //
 ***無題 [#qe8272ef]
 >ike@九州 (2010-10-20 09:48:36 (水))~
 ~
 プログラマではないので~
 都度調べ一緒に考えるスタンスです。~
 何処を調べるかだけは上手くなりました。 ほほほ~
 ~
 >マクロにブロックがかかった状態で開いたブックの本体からこのブロックを解除する方法~
 ~
 現状マクロセキュリティについてユーザー設定は無視されて外部から開いたドキュメント内のマクロは実行できないようになっているのはご存知だと思います。~
 解除の情報はありませんでした。~
 ~
 只、外部 vbs から scriptProvider を使用してブロックの掛かったドキュメント内のマクロの実行は可能でした。~
 Set oCalcDoc = oDesktop.getCurrentComponent() と scriptProvider を使用して vbs からマクロの実行は OK だという事ですね~
 ~
 oDesktop.getCurrentComponent() はドキュメントがアクティブでないとエラーになる事は知っておいて下さい。~
  〜
  'ドキュメントの取得の例
  Set oCalcDoc = getOooComp("file:///E:/usr/doc.ods")
  〜
  WScript.Quit()
  
  Function getOooComp(sURL)
    Set oComponents = oDesktop.getComponents
    Set oComponentsEnum = oComponents.createEnumeration()
     While oComponentsEnum.hasMoreElements()
      Set oComponent = oComponentsEnum.nextElement()
        If oComponent.getURL = sURL then
            Set getOooComp = oComponent
        End if 
     Wend
  End Function
 
 //
 ***なるほど!そういうことですか [#wd4b9ab1]
 >S-Osaka (2010-10-20 21:34:58 (水))~
 ~
 →現状マクロセキュリティについてユーザー設定は無視されて外部から開いたドキュメント内のマクロは実行できないようになっているのはご存知だと思います。~
 全く知りませんでした。~
 意味がわかりました。~
 ありがとうございます。~
 
 //
 #article