[OpenOffice Basic] シートへのアクセス

本ページは「Excel 2003 で学ぶ Visual Basic for Applications (VBA)」内のページ「シートへのアクセス」を
OpenOffice Basic に対応させたものである。

ここでは、OpenOffice Basic を用いて OpenOffice Calc のシート (表) にアクセスする方法を学ぼう。

シートの読み込みと書き出し

プログラムには入力と出力があることが多い。

プログラムに数字や文字列を入力する方法としては今まで2通りの方法を学んだ。 利用例は

(1)
	x = 5
(2)
	x = InputBox("数字を入力してください")


などである。

一方、出力方法として今まで多く取り扱ったのは する方法である。これについては問題ないであろう。

ここで、本ページでは入力と出力に対して新たな手法を学ぶ。 それは 方法である。

これにより、「OpenOffice Calc の表からデータを取得し (入力)、OpenOffice Calc の表にデータを書き出す (出力)」などの処理が可能になる。

まず、準備として OpenOffice Calc の表のセル A1 と A2 に、それぞれ整数を入力しよう。



上の例では 10 と 20 を入力したが、この 10 と 20 の和を OpenOffice Basic で計算させて求めることを考えよう。

もちろん、OpenOffice Basic を使わず OpenOffice Calc のみでも 二つのセルの和は計算できる。

しかし、ここではそれをあえて OpenOffice Basic 側で行うのが目的である。

では、10 と 20 の和を計算する以下のプログラムを記述してみよう。
(OpenOffice Basic 用 Editor の起動方法は「第一回:プログラムを書き始めるまでの準備」参照)

Option Explicit

Sub Main()
Dim x As Integer, y As Integer
  x = ThisComponent.Sheets(0).getCellByPosition(0, 0).Value
  MsgBox "A1 (0, 0) の値は " & x
  y = ThisComponent.Sheets(0).getCellByPosition(0, 1).Value
  MsgBox "A2 (0, 1) の値は " & y

  ThisComponent.Sheets(0).getCellByPosition(1, 0).Value = x + y
End Sub


ここで、ポイントは という部分であり、これは の意味を表す。 なお、座標 (i, j) の i は横方向、j は縦方向を表し、これは Excel + VBA と逆であることに注意。
さらに、Excel + VBA では添字は 1 から始まるが OpenOffice Basic では添字は 0 から始まることにも注意しよう。

これにより OpenOffice Calc のシート (表) のセル値を OpenOffice Basic から利用できる。
プログラミング用語では、これを「OpenOffice Calc のシートのセルの値にアクセスする」という言い方をする。

これを左辺に持って来れば、値をシートのセルに書き込むこともできる。
上のプログラムでは足し算の結果 (30) をセル (1,2) に書き込んでいる。

プログラム実行後、シートを見てみると、確かにセル (1,2) 、即ちセル B1 に結果が書き込まれていることがわかる。



つまり、上のプログラムは、シートから値を入力として受け取り、シートに値を出力した、というわけである。

なお、シートへのアクセスでは、Sheet1.Cells(i,j) のような記述が多くなり、若干記述量が多い。
記述量を多少減らすため、以下のような「With 〜 End With 文」が用意されている。

Option Explicit

Sub Main()
Dim x As Integer, y As Integer

  With ThisComponent.Sheets(0)
    x = .getCellByPosition(0, 0).Value
    MsgBox "A1 (0, 0) の値は " & x
    y = .getCellByPosition(0, 1).Value
    MsgBox "A2 (0, 1) の値は " & y

    .getCellByPosition(1, 0).Value = x + y
  End With
End Sub




シートに対するデータの作成

次に、OpenOffice Calc のシートに沢山のデータを一気に出力する例を見よう。

特にここで新しい知識を学ぶわけではないが、 これまで学んだ知識の多くを活用するので、若干難しく見えるかもしれない。

以下のプログラムは、 「OpenOffice Calc のシートに sin 関数のデータを生成するプログラム」である。

入力は取らず、出力先が OpenOffice Calc のシートとなっているわけである。

もちろん、Visual Basic を使わず、OpenOffice Calc のみで sin 関数のデータを出力することは可能であるが、
それを敢えて Visual Basic を用いて実行するのがここでの目的である。

では、以下のプログラムを記述して実行してみよう。

Option Explicit

Sub Main()
Dim x1 As Double, x2 As Double 
Dim n As Integer, nd As Integer
Dim x As Double, y As Double, dx As Double

  x1 = -3.14
  x2 = 3.14
  nd = 60
  dx = (x2 - x1) / nd

  ThisComponent.addActionLock()   ' 書き終るまで描画をロック
	
  For n = 0 To nd
    x = x1 + dx * n
    y = Sin(x)
    ThisComponent.Sheets(0).getCellByPosition(0, n).Value = x
    ThisComponent.Sheets(0).getCellByPosition(1, n).Value = y
  Next n

  ThisComponent.removeActionLock()   ' 書き終えたので描画ロックを解除

End Sub


このプログラムを理解するためのポイントは以下である。 上記プログラムを実行すると、シートに以下のようなデータが出力されている。



上のデータが実際に sin のデータになっていることを確かめるため、グラフを描いてみよう。
作成された表をマウスでドラッグし、 「挿入」→「グラフ」から散布図を選択するのだった。



以下の図はグラフ作成の途中であるが、確かに sin 関数のグラフになっていることがわかる。



このように、OpenOffice Basic を用いてデータを生成し (シミュレーション)、
その結果を OpenOffice Calc でグラフ表示することができることがわかった。

もちろん、OpenOffice Calc のみでもある程度簡単なデータなら生成することはできるのだが、
OpenOffice Calc Basic を用いると、If 文などを用いてより複雑なデータを作成することができる。



[OpenOffice Basic] シートへの高速なアクセス→

Excel / OpenOffice で学ぶ Visual Basic for Applications (VBA)に戻る