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」を使っていた。

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

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

VBで連想配列

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

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

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

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

  1. REM  *****  BASIC  *****  
  2. Option Explicit  
  3.   
  4. Sub Macro1  
  5.     ' 宣言部  
  6.     Dim oSheet As Object  
  7.     Dim oCell As Object  
  8.     Dim oObj As Object  
  9.   
  10.     ' 初期化  
  11.     oSheet = ThisComponent.Sheets(0)  
  12.     oObj = CreateObject("Scripting.Dictionary")  
  13.     oCell = oSheet.getCellByPosition(1,1)  
  14.   
  15.     ' もし配列キーが存在したら  
  16.     If oObj.Exists(oCell.getString) = True then  
  17.         oObj.Remove(oCell.getString)    ' 削除して  
  18.         oObj.Add(oCell.getString,5)     ' 作成  
  19.     Else  
  20.      oObj.Add(oCell.getString, 1)    ' 作成  
  21.     End If  
  22.   
  23.     ' 値を入れる  
  24.     oSheet.getCellByPosition(2,1).String = oObj.Item(oCell.getString)  
  25.   
  26.     MsgBox  "完了しました"  
  27. End Sub  

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

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

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

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


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