VBからOpenOffice.orgを操作する

マクロの作成、スクリプトの作成、APIの使い方
返信する
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

VBからOpenOffice.orgを操作する

投稿記事 by tani »

Visual BasicにてCOM(ActiveX, OLE)経由でOOoを操作するサンプルコードを投稿してみます。

WindowsマシンにOOoがインストールされていることが前提です。
なおマシンに複数バージョンのOOoだったりStarSuiteがインストールされている場合、どの
バージョンが反応するかは、レジストリに登録されている値次第で変わるようです。

サンプルコード:

コード: 全て選択

    Dim objServiceManager, objDesktop, objDocument, objSheets, objSheet1, objCell, objNewDocument
    
    ' OpenOffice.orgに接続し、C:\tmp\test.calcを非表示で開く
    Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")

    Dim args(0)
    Set args(0) = objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
    args(0).Name = "Hidden"
    args(0).Value = True
    Set objDocument = objDesktop.loadComponentFromURL("file:///C:/tmp/test.ods", "_blank", 0, args)

    ' Sheet1を取得
    Set objSheets = objDocument.getSheets()
    Set objSheet1 = objSheets.getByIndex(0)
    
    ' Cell A1を取得
    Set objCell = objSheet1.getCellByPosition(0, 0)
    
    ' Cell A1 に文字列を設定
    Call objCell.setString("テストだよーん。")
    
    ' ドキュメントの保存と終了
    Call objDocument.store
    Call objDocument.dispose
    
    ' ドキュメントを開きなおす
    Dim dummy()
    Set objNewDocument = objDesktop.loadComponentFromURL("file:///C:/tmp/test.ods", "_blank", 0, dummy())
とりあえずこんなふうに動くよってことだけを示すサンプルなので内容につっこまれても困ります。
(ドキュメント保存終了して、また開きなおしてたりとか。エラー処理してなかったりとか。)

コード: 全て選択

Set objFrame = objDocument.getCurrentController().getFrame()
Set dispatcher = objServiceManager.createInstance("com.sun.star.frame.DispatchHelper")
こんな感じでFrameとDispatcherを呼び出せばマクロ記録で取ったコマンドも使用することができます。


ちなみにCOM(ActiveX, OLE)がサポートされている言語ならどれでも似たようなコードでOOoを
操作することができます。PHPとかRubyとか。残念ながらWindows環境限定の方法ですが。

参考: http://www.oooforum.org/forum/viewtopic.phtml?t=9815

またUNIX系環境だと元から用意されているUNOブリッジ(C++, Java, Python)を使ったり、それぞれの
言語環境で開発されているUNOブリッジを利用することになります。例えばPHPだとPUNO, Perlだと
PerlUNOとかが開発されているようです。このあたりもボチボチ調べたりしているので、そのうち投稿
するカモです。

参考:
http://www.wstech2.net/index.php?do=puno
http://search.cpan.org/~mbarbon/OpenOff ... .05/UNO.pm
oki
記事: 2
登録日時: 2月 16, 2009, 2:22 pm

Re: VBからOpenOffice.orgを操作する

投稿記事 by oki »

tani様 有用な記事ありがとうございます。

さて、Visual Basic6にてCalcの文書を操作するマクロのテストを
行っていますが、ページ書式の設定がうまくいきません。
もし何か原因が分かるようでしたらお教えいただけないでしょうか?

・・・objDocumentを作成するところまではtani様のサンプルを参考にしました
それ以下はStatSuite8 Basicプログラミングガイドのサンプルコードを参考にしました
(上記のプログラミングガイドを参考にしたのも試験的にですが)

StyleFamilies = objDocument.StyleFamilies <-ここでStyleFamiliesが認識できないようです
PageStyles = StyleFamilies.getByName("PageStyles")
DefPage = PageStyles.getByName("Default")
DefPage.IsLandscape = True
DefPage.Width = 21000
DefPage.Height = 14800
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by tani »

#ここしばらくチェックしていなかったので亀レスですが。。。

コード: 全て選択

StyleFamilies = objDocument.StyleFamilies
↑のStyleFamiliesというプロパティはOOo Basic上だけで有効な見せ掛けのプロパティっぽいので、

コード: 全て選択

Set StyleFamilies = objDocument.getStyleFamilies()
というように真のメソッドを使うように変更したらどうでしょうか?
ためしに以下のようなコードをExcel VBA上で実行してみたらきちんと動作しました。

コード: 全て選択

    ' OpenOffice.orgに接続し、C:\tmp\test.calcを開く
    Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
    Set objDocument = objDesktop.loadComponentFromURL("file:///C:/tmp/test.ods", "_blank", 0, Array())
    
    ' ページスタイルを設定
    Set StyleFamilies = objDocument.getStyleFamilies()
    Set PageStyles = StyleFamilies.getByName("PageStyles")
    Set DefPage = PageStyles.getByName("Default")

    DefPage.IsLandscape = True
    DefPage.Width = 21000
    DefPage.Height = 14800
oki
記事: 2
登録日時: 2月 16, 2009, 2:22 pm

Re: VBからOpenOffice.orgを操作する

投稿記事 by oki »

tani様

投稿ありがとうございます。
無事動作いたしました。
htmMaMs
記事: 9
登録日時: 12月 20, 2010, 11:51 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by htmMaMs »

VB(できればVBA)からCALCドキュメントを開き、罫線(枠線)を設定する方法を教えてください。
windowsXP、ACCESS2000のVBAで作業しています。

次のコードでは変数の宣言の部分で「ユーザー定義型は定義されていません。」というコンパイルエラーが
表示されます。

Dim l As New com.sun.star.Table.BorderLine
Set l = objSheet1.Table.BorderLine
l.OuterLineWidth = 35
objCell.LeftBorder = l
OpenOffice 3.2 on Windows XP
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by tani »

別スレッドを立てるべき話題のような気がしますが、とりいそぎ私の手元のAccessでは以下のようなコードが動きました。

コード: 全て選択

Option Compare Database

Sub hoge()

  Set oDB = Application.CurrentDb
  Set oRS = oDB.OpenRecordset("SELECT * FROM test")
  
  Dim tmp_arr(2, 2)
  i = 0
  Do Until oRS.EOF
    Set dbCols = oRS.Fields
    tmp_arr(0, i) = dbCols.Item(0).Value
    tmp_arr(1, i) = dbCols.Item(1).Value
    tmp_arr(2, i) = dbCols.Item(2).Value
    oRS.MoveNext
    i = i + 1
  Loop

  Set OOo = CreateObject("com.sun.star.ServiceManager")
  Set oDesktop = OOo.createInstance("com.sun.star.frame.Desktop")
  Dim dummy()
  Set oDoc = oDesktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, dummy)
  Set oSheets = oDoc.getSheets()
  Set oSheet = oSheets.getByIndex(0)
  Set oRange = oSheet.getCellRangeByName("B2:D4")
  Set oBorder = OOo.Bridge_GetStruct("com.sun.star.table.BorderLine")
  oBorder.OuterLineWidth = 35
  
  oRange.LeftBorder = oBorder
  oRange.setDataArray (tmp_arr)
End Sub
htmMaMs
記事: 9
登録日時: 12月 20, 2010, 11:51 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by htmMaMs »

tani様

早速投稿してくださりありがとうございました。
罫線を設定することができました。
OpenOffice 3.2 on Windows XP
htmMaMs
記事: 9
登録日時: 12月 20, 2010, 11:51 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by htmMaMs »

VBAからCALCドキュメントを開き、コピー・ペーストする方法を教えてください。
windowsXP、ACCESS2000のVBAで作業しています。

次のコードでは5行目のSet aCellAddress・・・・の部分でオートメーションエラーが
表示されます。

Dim aCellAddress As Object
Dim aCellRangeAddress As Object

oDoc = ThisComponent
oSheet = oDoc.Sheets(0)
Set aCellAddress = objServiceManager.Bridge_GetStruct("com.sun.star.Table.CellAddress")
Set aCellRangeAddress = objServiceManager.Bridge_GetStruct("com.sun.star.Table.CellAddress")
With aCellAddress
.Sheet = 0
.Column = 0
.Row = intRow
End With
With aCellRangeAddress
.Sheet = 0
.StartColumn = 0
.EndColumn = 7
.StartRow = 3
.EndRow = 18
End With
oSheet.copyRange aCellAddress, aCellRangeAddress
OpenOffice 3.2 on Windows XP
MoIshihara
記事: 337
登録日時: 6月 21, 2010, 6:52 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by MoIshihara »

htmMaMs さん こんにちは

・VBA は持っていないので、VBS でエラーが出ない様に直してみました。

コード: 全て選択

	intRow = 20
	Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
	Set oDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
	Set oDoc = oDesktop.CurrentComponent
	Set oSheet = oDoc.Sheets.getByIndex(0)
	Set aCellAddress = objServiceManager.Bridge_GetStruct("com.sun.star.table.CellAddress")
	Set aCellRangeAddress = objServiceManager.Bridge_GetStruct("com.sun.star.table.CellRangeAddress")
	With aCellAddress
		.Sheet = 0
		.Column = 0
		.Row = intRow
	End With
	With aCellRangeAddress
		.Sheet = 0
		.StartColumn = 0
		.EndColumn = 7
		.StartRow = 3
		.EndRow = 18
	End With
	oSheet.copyRange aCellAddress, aCellRangeAddress
htmMaMs
記事: 9
登録日時: 12月 20, 2010, 11:51 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by htmMaMs »

tani様

早速投稿してくださりありがとうございました。
エラーが出ず、コピー・ペーストすることができました。
OpenOffice 3.2 on Windows XP
tani
記事: 60
登録日時: 6月 13, 2008, 10:12 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by tani »

htmMaMs さん
回答されたのはMoIshiharaさんですので、お礼と報告もMoIshiharaさんにお願いします。
(一瞬、無意識のうちに私が回答したのかな、と思いました :D
あと、この手のフォーラムは1質問につき1スレッドが基本だと思いますので、今度何か質問ができた際は別のスレッドを立てたほうがよいと思います。
htmMaMs
記事: 9
登録日時: 12月 20, 2010, 11:51 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by htmMaMs »

tani様

きちんと確認をせず、大変失礼をいたしました。
質問の仕方もきちんと理解しておらず、
申し訳ございませんでした。
OpenOffice 3.2 on Windows XP
htmMaMs
記事: 9
登録日時: 12月 20, 2010, 11:51 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by htmMaMs »

MoIshihara 様

さっそく投稿していただきありがとうございました。
質問の仕方等、当フォーラムの規則が分かっておらず、
申し訳ございませんでした。
OpenOffice 3.2 on Windows XP
MoIshihara
記事: 337
登録日時: 6月 21, 2010, 6:52 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by MoIshihara »

htmMaMs さん tani さん こんにちは

・こちらのトピックが参考になるかもしれません。
http://user.services.openoffice.org/ja/ ... p?f=25&t=2

・とはいえ、こんなトピックもあったりします。
http://user.services.openoffice.org/ja/ ... ?f=36&t=36

・個人的には、OLE、COM のフォーラムと、Bridge のフォーラムがあった方が良い様な気もしますが、今よりさらに閑散としてしまうのでしょうね。
アバター
khirano
記事: 691
登録日時: 5月 25, 2008, 12:15 pm
お住まい: Doya-cho, Ichinoseki-shi, Iwate-ken, Japan
連絡する:

Re: VBからOpenOffice.orgを操作する

投稿記事 by khirano »

Hi MoIshihara san and all,

OLE、COM のフォーラムと、Bridge のフォーラムをつくりたいと思います。
:)
タイトルと説明についてアドバイスお願いします。

英語のフォーラムの例を見てみましょう。
http://user.services.openoffice.org/en/ ... m.php?f=20
「マクロとUNO API 」のフォーラムの下に次のようなサブフォーラムがあります。

1. タイトル:OOo Basic, Python, BeanShell, JavaScript
説明:キーボード・マクロ, カスタム・スクリプト

2. タイトル:外部プログラム
説明:Java, C++, C#, Delphiなど - UNOブリッジの使い方

3. タイトル:UNO API と ODF
説明:アプリケーション・プログラム・インターフェースとODF

この日本語フォーラムで「マクロと UNO API 」の下にサブフォーラムをつくるとすればどんなタイトルと説明がいいでしょうか。

たとえば

1. タイトル:OLE, COM
説明:OLE(オブジェクトのリンクと埋め込み), COM(コンポーネント・オブジェクト・モデル)

2. タイトル:UNO ブリッジ
説明:C++, Java, Python などから OpenOffice.org を操作するインターフェース

とか。

ご意見いただければさいわいです。

Thanks,
khirano
Apache OpenOffice 4.0 on Windows Vista
MoIshihara
記事: 337
登録日時: 6月 21, 2010, 6:52 am

Re: VBからOpenOffice.orgを操作する

投稿記事 by MoIshihara »

khirano さん こんにちは

>OLE、COM のフォーラムと、Bridge のフォーラムをつくりたいと思います。

・ご対応ありがとうございます、過疎化が心配です...

1. タイトル:UNO ブリッジ
説明:UNO Bridge を使って外部から OpenOffice を操作する

2. タイトル:オートメーション(COM) Windows専用
説明:オートメーションを使って外部から OpenOffice を操作する

・こんな感じでいかがでしょう?
・親フォーラムでもプログラム言語の指定が無いので省略してみました。
アバター
khirano
記事: 691
登録日時: 5月 25, 2008, 12:15 pm
お住まい: Doya-cho, Ichinoseki-shi, Iwate-ken, Japan
連絡する:

Re: VBからOpenOffice.orgを操作する

投稿記事 by khirano »

MoIshihara さん

サブフォーラムのタイトルと説明にアドバイスをいただきありがとうございます。
助かります。

みなさん

こちら「マクロとUNO API」フォーラムにサブフォーラム「UNOブリッジ」と「オートメーション (COM) Windows専用」をつくりました。
ご活用ください。
:)
Apache OpenOffice 4.0 on Windows Vista
返信する

“マクロと UNO API”に戻る