2010年09月28日

OpenOffice.orgのマクロについて

 先日から日記に書いている通り、OpenOffice.orgを使っているが、これのマクロに挑戦してみた。

 最初は、私も一応Excelのマクロは組めるし、同じVisual Basicだから大丈夫でしょと思って挑戦していたのだが…、これが全然違う。
 ネットで色々検索しながら、しかもExcelほど資料の多いものではなかったのでかなり苦労しつつ、見つけたサイトで一から勉強して、ようやくそこそこ組めるようになった。

 そんなわけで、自分が今持ってる知識の範囲内で、OpenOfficeのマクロについて書いてみようと思う。

 試しに、表計算ソフトで列のカット&ペースト。具体的には、
「A〜C列を切り取って、F列に貼り付ける」

 という動作をマクロで書いてみる。
 まずExcelの場合はこんな感じ。
' 列の移動(Excel)
Sub Main()
Columns("A:C").Cut
Columns("F").Select
ActiveSheet.Paste
End Sub
 これだけ、メインとしては3行で済む

 これをOpenOffice.org CalcのExcel互換マクロを使えば、ほぼ同じ構文が可能。
' 列の移動( OpenOffice Calc Excel互換命令)
Option VBASupport 1
Sub Main()
Columns("A:C").Cut
Columns("F").PasteSpecial
End Sub
 先頭の「Option VBASupport 1」の命令が互換機能を呼び出すものらしい。
 でもこれは、カット&ペーストだけなのでほぼ同じだけど、他の命令を含めたマクロは様々な制限がある。だから、ある程度はできるという事で。

 これを、OpenOfficeのマクロを使えばこうなる。
' 列の移動(OpenOffice.org Calc)
Sub Main()
Dim oDoc As Object , oSheet As Object
' ドキュメント・シート指定
oDoc = ThisComponent
oSheet = oDoc.CurrentController.ActiveSheet
' 列の移動
Columns_Move(0 , 2 , 5 , oSheet)
End Sub
'
' 列移動サブルーチン
' Cut_St:移動元・開始列番号
' Cut_Ed:移動元・終了列番号
' Pas_St:移動先列番号
Sub Columns_Move(Cut_St , Cut_Ed , Pas_St, oSheet)
Dim Col_Cell As New com.sun.star.table.CellRangeAddress
Dim Pas_Cell As New com.sun.star.table.CellAddress
With Col_Cell
.Sheet = 0
.StartColumn = Cut_St
.EndColumn = Cut_Ed
.StartRow = 0
.EndRow = 100
End With
With Pas_Cell
.Sheet = 0
.Column = Pas_St
.Row = 0
End With
oSheet.moveRange( Pas_Cell , Col_Cell )
End Sub
 分かりやすいように、列を移動する部分をサブルーチンにしてみた。

 OpenOfficeの場合、初期としてドキュメント・シートの指定を行うが、その後のメインは列を移動する一命令のみだけど、それにはこれだけ長いサブルーチンが必要になる。
 ちなみにこのマクロ、実は行全部を指定をしようと思ったら更に長くなるため(OpenOfficeのマクロには、行・列のコピー・移動の命令はない)。列の0〜100行目までを移動するようにした。

 OpenOfficeのマクロって、Excelのように一命令で何でもできるものではなく(Excel互換命令という手もあるが)、サブルーチン化しなければならない場合が多い。
 でもその分、全部自分で考えて作らないといけないので、Visual Basicの勉強になる。
 最初はかなり敷居が高くて難しいけど、勉強のためならExcelマクロはもとより、OpenOfficeのマクロに挑戦してみると面白いと思う。




posted by 司隆 at 21:10 | Comment(0) | TrackBack(0) | Computer
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]


この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。