ページ 1 / 1
VBからOpenOffice.orgを操作する
Posted: 12月 25, 2008, 1:02 pm
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
Re: VBからOpenOffice.orgを操作する
Posted: 2月 16, 2009, 2:56 pm
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
Re: VBからOpenOffice.orgを操作する
Posted: 2月 25, 2009, 6:15 pm
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
Re: VBからOpenOffice.orgを操作する
Posted: 2月 27, 2009, 6:48 pm
by oki
tani様
投稿ありがとうございます。
無事動作いたしました。
Re: VBからOpenOffice.orgを操作する
Posted: 12月 20, 2010, 2:22 pm
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
Re: VBからOpenOffice.orgを操作する
Posted: 12月 21, 2010, 12:05 pm
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
Re: VBからOpenOffice.orgを操作する
Posted: 12月 21, 2010, 4:26 pm
by htmMaMs
tani様
早速投稿してくださりありがとうございました。
罫線を設定することができました。
Re: VBからOpenOffice.orgを操作する
Posted: 2月 4, 2011, 4:37 pm
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
Re: VBからOpenOffice.orgを操作する
Posted: 2月 5, 2011, 10:48 am
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
Re: VBからOpenOffice.orgを操作する
Posted: 2月 5, 2011, 12:47 pm
by htmMaMs
tani様
早速投稿してくださりありがとうございました。
エラーが出ず、コピー・ペーストすることができました。
Re: VBからOpenOffice.orgを操作する
Posted: 2月 7, 2011, 10:16 am
by tani
htmMaMs さん
回答されたのはMoIshiharaさんですので、お礼と報告もMoIshiharaさんにお願いします。
(一瞬、無意識のうちに私が回答したのかな、と思いました
)
あと、この手のフォーラムは1質問につき1スレッドが基本だと思いますので、今度何か質問ができた際は別のスレッドを立てたほうがよいと思います。
Re: VBからOpenOffice.orgを操作する
Posted: 2月 7, 2011, 2:52 pm
by htmMaMs
tani様
きちんと確認をせず、大変失礼をいたしました。
質問の仕方もきちんと理解しておらず、
申し訳ございませんでした。
Re: VBからOpenOffice.orgを操作する
Posted: 2月 7, 2011, 2:58 pm
by htmMaMs
MoIshihara 様
さっそく投稿していただきありがとうございました。
質問の仕方等、当フォーラムの規則が分かっておらず、
申し訳ございませんでした。
Re: VBからOpenOffice.orgを操作する
Posted: 2月 7, 2011, 11:33 pm
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 のフォーラムがあった方が良い様な気もしますが、今よりさらに閑散としてしまうのでしょうね。
Re: VBからOpenOffice.orgを操作する
Posted: 2月 8, 2011, 7:17 am
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
Re: VBからOpenOffice.orgを操作する
Posted: 2月 8, 2011, 11:20 pm
by MoIshihara
khirano さん こんにちは
>OLE、COM のフォーラムと、Bridge のフォーラムをつくりたいと思います。
・ご対応ありがとうございます、過疎化が心配です...
1. タイトル:UNO ブリッジ
説明:UNO Bridge を使って外部から OpenOffice を操作する
2. タイトル:オートメーション(COM) Windows専用
説明:オートメーションを使って外部から OpenOffice を操作する
・こんな感じでいかがでしょう?
・親フォーラムでもプログラム言語の指定が無いので省略してみました。
Re: VBからOpenOffice.orgを操作する
Posted: 2月 9, 2011, 7:22 am
by khirano
MoIshihara さん
サブフォーラムのタイトルと説明にアドバイスをいただきありがとうございます。
助かります。
みなさん
こちら「マクロとUNO API」フォーラムにサブフォーラム「UNOブリッジ」と「オートメーション (COM) Windows専用」をつくりました。
ご活用ください。