2010年4月13日火曜日

OpenOffice.org Basic マクロ で 連想配列 をやってみた!( aName.Add 1, Cells(nRange, m_nStartRange).Value

過去にエクセルのマクロを使っていたツールを、OpenOfficeに改修した。

Novellが出してる派生OpenOfficeはVBA互換だが、本家オリジナルはVBAと完全な互換性はないので、めんどくせーなーと思いつつOOoBasicで書き直した。

※会社にはNovellのでいいじゃんと訴えたが、派生はダメなんだと。

OOoBasicはVBAとちがって圧倒的にサンプルが少ない。
今回は連想配列に苦労した。
VBAの連想配列も、あまりスマートではないが、エクセル版は「Collection」を使っていた。

Dim aName As New Collection
aName.Add 1, Cells(1, 1).Value

OpenOfficeでどうやろうかとググったがなかなかない。
頭をかかえていると、VBA向けのCreateObjectを使う連想配列を見つけた。

VBで連想配列

CreateObject で 外部APIを呼ぶ・・・
ということは、OpenOfficeがCreateObjectを使えればいいわけか。

で、ググったが出てこない。OpenOfficeのhelpを探したら、あった!

'UNO オブジェクトを作成します。Windows では、OLE オブジェクトも作成できます。
'このメソッドにより、パラメータとして渡されるタイプのインスタンスが作成されます。
'構文:
oObj = CreateObject( type )

で、やってみたら・・・
できました。できましたよ。ふーーつかれた。

REM  *****  BASIC  *****
Option Explicit

Sub Macro1
    ' 宣言部
    Dim oSheet As Object
    Dim oCell As Object
    Dim oObj As Object

    ' 初期化
    oSheet = ThisComponent.Sheets(0)
    oObj = CreateObject("Scripting.Dictionary")
    oCell = oSheet.getCellByPosition(1,1)

    ' もし配列キーが存在したら
    If oObj.Exists(oCell.getString) = True then
        oObj.Remove(oCell.getString)    ' 削除して
        oObj.Add(oCell.getString,5)     ' 作成
    Else
     oObj.Add(oCell.getString, 1)    ' 作成
    End If

    ' 値を入れる
    oSheet.getCellByPosition(2,1).String = oObj.Item(oCell.getString)

    MsgBox  "完了しました"
End Sub

まーこうしてすこしずつでも使えるようになれば、いつかは使いこなせるさ。

免責
この記事やプログラムによって生じた事故・損害などは一切保証致しません。ご自身の責任でご使用ください。

子育てブログ「おとう日記」はじめました。
興味ある方、是非ご覧下さい!
おとう日記

コピペプログラマの倉庫を作りました。
サンプルプログラムなど置いておきますのでお立ち寄り下さい。
コピペプログラマ倉庫


良ければ↓投票お願いします↓ m(._.)m ペコッ
人気ブログランキングへ