OpenOffice.org BASIC覚え書き

著者 : きむらしのぶ
最終更新日 : 2006年1月14日
掲示板 : ご意見・ご質問等あれば、こちらへお願いします。

 ExcelにてVBAを使ってマクロを作成してきたのですが、OpenOffice.orgでも同じような事ができそうなので実験中。VBAとの差異を中心に、気のついたことをメモしていきます。これから始める人の役に立てればいいなと考えています。

 ガントチャートforOOoの作り方を解説するブログに、ここに書いてある内容を移しています。まだこちらの内容が多いですが、合わせて確認してもらうと何かの助けになるかもしれません。OpenOffice.org Basicでガントチャート

目次

[全般] vbCrは? (2005/09/26)
[Calc] シート名からシートを取得 (2005/11/05)
[Calc] 現在選択されているシートを取得 (2005/11/05)
[Calc] セルの位置、サイズ情報を取得 (2005/11/05)
[Calc] 図形オブジェクトの取得 (2005/11/05)
[全般] 文字列関係の処理 (2005/11/17)
[全般] 数値計算関係の処理 (2005/11/17)
[全般] 同じファイル内の別モジュールに同じ名称の関数を宣言した場合の区別方法 (2005/11/17)
[全般] ダイアログの表示と利用 (2005/11/19)
[Culc] マクロで図形を描画する(2005/12/01)
[Culc] マクロで多角形を描画する(2005/12/02)
[全般] 時間を計算する方法(2005/12/03)
[全般] 配列の要素数を数える(2005/12/30)
[全般] MsgBox関数の使い方(2005/12/31)
[全般] 画面更新の停止・再開(2006/01/01)

目次に戻る
[全般] vbCrは? (2005/09/26)
chr(13)にて代用
目次に戻る
[Calc] シート名からシートを取得 (2005/11/05)
Dim oSheet As Object
oSheet = ThisComponent.Sheets.getByName("シート名")
ガントチャートforOOoではシートのオブジェクトを取得しやすいように下記のFunctionを作成し、多用している。オーバーヘッドが気になる人には向かないが、生産性の向上にはとても役立つ。 (2005/11/17)
Function getSheetByName(SheetName As String) As Object
  getSheetByName = ThisComponent.Sheets.getByName(SheetName)
End Function
こうすることで、以下のような使い方ができ、楽になる。
Sub Main
  With getSheetByName("表1")
    .getCellByPosition(0, 0).String = "テスト"
  End With
End Sub
目次に戻る
[Calc] 現在選択されているシートを取得 (2005/11/05)
Dim oSheet As Object
oSheet = ThisComponent.CurrentController.ActiveSheet
ガントチャートforOOoではシートのオブジェクトを取得しやすいように下記のFunctionを作成し、多用している。オーバーヘッドが気になる人には向かないが、生産性の向上にはとても役立つ。 (2005/11/17)
Function getActiveSheet() As Object
  getActiveSheet = ThisComponent.CurrentController.ActiveSheet
End Function
目次に戻る
[Calc] セルの位置、サイズ情報を取得 (2005/11/05)
例 セルB5の情報を取得
セルを列番号と行番号で取得する場合、列はA = 0, B = 1, C = 2 ...、行は 1 = 0, 2 = 1, 3 = 2となる事に注意。
Dim oCellRange As Object
Dim Col As Integer, Row As Integer
Dim Left As Long, Top As Long, Width As Long, Height As Long
 
Row = 1
Col = 4
oCellRange = ThisComponent.Sheets.getByName("表1").getCellByPosition(Col, Row)
Left = oCellRange.Position.X
Top = oCellRange.Position.Y
Width = oCellRange.Size.Width
Height = oCellRange.Size.Height
目次に戻る
[Calc] 図形オブジェクトの取得 (2005/11/05)
例 シート上に2つの図形があるとし、始めに描画した方の図形を取得する
Dim oDrawPage As Object
Dim oDraw As Object
 
oDrawPage = ThisComponent.Sheets.getByIndex(0).DrawPage
oDraw = oDrawPage.getByIndex(0)
目次に戻る
[全般] 文字列関係の処理 (2005/11/17)
これはほとんどVBAと同じなので、VBA関連書籍を見ても役に立つ。
文字列の連結
Const A$ = "AAA"
Const B$ = "BBB"
Dim C$

C$ = "AAA" & "BBB"
MsgBox C$
文字数の取得
Const wk$ = "This is a test."
MsgBox Len(wk$)
左から数えて指定した文字数の文字列を取得
Const wk$ = "This is a test."
MsgBox Left(wk$, 3)
右から数えて指定した文字数の文字列を取得
Const wk$ = "This is a test."
MsgBox Right(wk$, 3)
左から数えて指定した位置から始めて、指定した文字数の文字列を取得
Mid(文字列, 読み込み開始位置, 読み込み文字数)
Const wk$ = "This is a test."
MsgBox Mid(wk$, 5, 5)
目次に戻る
[全般] 数値計算関係の処理 (2005/11/17)
足し算、引き算、かけ算、割り算、余りの計算
MsgBox 12 + 26
MsgBox 26 - 12
MsgBox 26 * 12
MsgBox 26 / 12
MsgBox (26 Mod 12)
目次に戻る
[全般] 同じファイル内の別モジュールに同じ名称の関数を宣言した場合の区別方法 (2005/11/17)
あまりお勧めはできないが、必要な場合もある。この場合にそれぞれの関数を区別して利用する方法を示す。 Module1~3まであるとして、以下の内容が入っている時にマクロの実行でModule3のMainを指定する場合、モジュール名.関数名となる。間に「.(ピリオド)」を入れるという事に注意。
Module1
Sub Main
  MsgBox "Module1の関数だよ"
End Sub
Module2
Sub Main
  MsgBox "Module2の関数だよ"
End Sub
Module3
Sub Main
  Module1.Main
End Sub
目次に戻る
[全般] ダイアログの表示と利用 (2005/11/19)
Dialog1という名称の自作のダイアログを作成し、ボタンを一つ配置します。このボタンにダイアログを閉じるマクロを設定します。そしてダイアログをマクロで呼び出す方法
Option Explicit
 
Private dlg As Object
 
'ダイアログを表示するマクロ
Sub Main
  DialogLibraries.LoadLibrary("Standard")
  dlg = createUnoDialog(DialogLibraries.Standard.Dialog1)
  With dlg
    .execute()
    .dispose()
  End With
End Sub
 
'ボタンに割り当てるマクロ
Private Sub CloseDialog1
  dlg.endExecute()
End Sub
目次に戻る
[Culc] マクロで図形を描画する(2005/12/01)
マクロで図形をシート上に描画する方法を各シェイプ毎にサンプルを示す。
'四角の描画
Dim oDrawPage As Object
Dim oDraw As Object
Dim aPos As New com.sun.star.awt.Point
Dim aSize As New com.sun.star.awt.Size
 
oDrawPage = ThisComponent.Sheets.getByIndex(0).DrawPage
oDraw = ThisComponent.createInstance("com.sun.star.drawing.RectangleShape")

'直線の場合
'oDraw = ThisComponent.createInstance("com.sun.star.drawing.LineShape")
'円の場合
'oDraw = ThisComponent.createInstance("com.sun.star.drawing.EllipseShape")
'曲線の場合
'oDraw = ThisComponent.createInstance("com.sun.star.drawing.OpenBezierShape")
 
aPos.X = 2000
aPos.Y = 3000
aSize.Width = 4000
aSize.Height = 5000
 
oDraw.setPosition(aPos)
oDraw.setSize(aSize)
 
oDrawPage.Add(oDraw)
注) 位置やサイズの指定に用いる数値の単位は1/100[mm]です。
目次に戻る
[Culc] マクロで多角形を描画する(2005/12/02)
多角形を描画するためには、図形オブジェクトを生成し配置した後に各点データを設定して、位置を決めるという手順になります。しかしここで注意すべきことがあり、点を登録すると最後に(0, 0)の点が勝手に追加されます。そこで、この事をよく考えた上で点の配置をする必要があります。また、多角形の位置データは図形の上端と左端を指定することになりますので、開始点の位置でないということに注意して下さい。
Dim oDrawPage As Object
Dim oDraw As Object
Dim oPos As New com.sun.star.awt.Point
Dim oPoly(3) As New com.sun.star.awt.Point
 
oDrawPage = ThisComponent.CurrentController.ActiveSheet.DrawPage
oDraw = ThisComponent.createInstance("com.sun.star.drawing.PolyLineShape")
 
oDrawPage.Add(oDraw)
 
oPoly(0).X = -2000:	oPoly(0).Y = 3000
oPoly(1).X = 4000:	oPoly(1).Y = 2000
oPoly(2).X = -4000:	oPoly(2).Y = 1000
oDraw.PolyPolygon = Array(oPoly())
 
oPos.X = 1000:	oPos.Y = 1000
oDraw.setPosition(oPos)
目次に戻る
[全般] 時間を計算する方法(2005/12/03)
OpenOfficeでは、1日を1とします。以下では簡単な日付に関する関数と、加減乗除による時間の取得方法を示します。CDate関数は日付表記の文字列をTimeSerialに変換します。
Dim wDate As Date
 
'日付を含めて今の時間を取得します
wDate = Now()
 
'年を取得します
MsgBox Year(wDate)
 
'月を取得します
MsgBox Month(wDate)
 
'日を取得します
MwgBox Day(wDate)
 
'曜日を取得します(日曜 = 1 〜 土曜 = 7)
MsgBox WeekDay(wDate)
 
'時間を取得します
MsgBox Hour(wDate)
 
'分を取得します
MsgBox Minute(wDate)
 
'秒を取得します
MsgBox Second(wDate)
 
'実行時間の秒数を取得
MsgBox (Now() - wDate) * 24 * 60 * 60
 
'文字列で指定した日からの経過日を取得
MsgBox wDate - CDate("2005/1/1")
おまけ : ガントチャートforOOoでは日付のデータとセルの幅から下記のようにしてチャートの位置を取得しています。
Dim oSheet As Object
Dim oColumn As Object
Dim wDate As Object
Dim X As Long
 
wDate = CDate("2005/12/3 12:00")
oSheet = ThisComponent.CurrentController.ActiveSheet
'10列目が2005/12/3の列と仮定する
oColumn = oSheet.Columns.getByIndex(10)
 
X = oColumn.Position.X + oColumn.Size.Width * (wDate - Int(wDate))
目次に戻る
[全般] 配列の要素数を数える (2005/12/30)
UBound関数を用います。ここで配列名をXとすると、ExcelではUBound(X)としますがOOoBasicでは
UBound(X())
としなくてはなりません。配列名の後ろに()を付けることをお忘れなく。
目次に戻る
[全般] MsgBox関数の使い方(2005/12/31)
VB/VBAではおなじみで、OOoBasicでも使えます。ですが、vb...という名称は定義されていないのでこれを定義する事でVBAのコードをそのまま流用する事が可能となります。
基本的なMsgBox関数の使い方は

MsgBox(メッセージ,設定,タイトル)

です。具体的には
MsgBox "テストです"
MsgBox "もう一度テストしても良いですか?",4
If MsgBox("エラーが発生しました", 5 + 48, "エラー") = 4 Then
  MsgBox "再挑戦"
Else
  MsgBox "止めます"
End If
という具合になります。ここで、設定に入れた「4」や「5+48」というのはどんなボタンやアイコンを配置するかを設定するためのものですが、数値で覚えるのは酷です。また、戻り値によりどのボタンを押したのかを判断する事もできますが、同様に数値を覚えるのは酷です。そこで、VB/VBAと同じ定数を定義する事でちょっと使いやすくしてみます。
Public Const vbOKOnly = 0
Public Const vbOkCancel = 1
Public Const vbAbortRetryIgnore = 2
Public Const vbYesNoCancel = 3
Public Const vbYesNo = 4
Public Const vbRetryCancel = 5
Public Const vbCritical = 16
Public Const vbQuestion = 32
Public Const vbExclamation = 48
Public Const vbInfomation = 64
Public Const vbDefaultButton1 = 0
Public Const vbDefaultButton2 = 256
Public Const vbDefaultButton3 = 512
 
Public Const vbOK = 1
Public Const vbCancel = 2
Public Const vbAbort = 3
Public Const vbRetry = 4
Public Const vbIgnore = 5
Public Const vbYes = 6
Public Const vbNo = 7
これを使って先ほどのテストを書き直すと
MsgBox "テストです"
MsgBox "もう一度テストしても良いですか?",vbYesNoCancel
If MsgBox("エラーが発生しました", vbRetryCancel + vbExclamation, "エラー") = vbRetry
  MsgBox "再挑戦"
Else
  MsgBox "止めます"
End If
となり、多少可読性が向上しますしVBAのコードをそのままコピー&ペーストが可能になります。
目次に戻る
[全般] 画面更新の停止・再開 (2006/01/01)
マクロでシートの内容を書き換えている時、画面の更新を一時的に停止する方法です。多数の書込みを行う場合、劇的に実行速度が改善されることがあります。
ThisComponent.LockControllers
また更新を再開する場合は、
ThisComponent.UnLockControllers
とします。
ちなみにVBAでは下記となります。
Application.ScreenUpdating = False '更新停止
Application.ScreenUpdating = True '更新再開