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

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

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

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

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

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

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


などである。

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

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

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

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



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

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

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

では、10 と 20 の和を計算する以下のプログラムを記述してみよう。
(LibreOffice/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 から始まるが LibreOffice/OpenOffice Basic では添字は 0 から始まることにも注意しよう。

これにより LibreOffice/OpenOffice Calc のシート (表) のセル値を LibreOffice/OpenOffice Basic から利用できる。
プログラミング用語では、これを「LibreOffice/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




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

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

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

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

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

もちろん、Visual Basic を使わず、LibreOffice/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 関数のグラフになっていることがわかる。



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

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



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

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