セルと範囲
セル個々の表計算ドキュメントを構成するのがセルという単位で、これらは 2 次元のリストで管理されます。つまり各セルは、左上隅を原点 (0,0) とする X と Y 座標で指定できます。
次のサンプルコードは、左上隅のセルにアクセスして、文字列を挿入します。
Dim Doc As Object Dim Sheet As Object Dim Cell As Object Doc = StarDesktop.CurrentComponent Sheet = Doc.Sheets(0) Cell = Sheet.getCellByPosition(0, 0) Cell.String = "Test"
![]() |
StarDesktop.CurrentComponent は現在のコンポーネントを返します。BASIC IDE で作業している場合、マクロを実行すると、BASIC IDE が返されます。BASIC IDE には表計算ドキュメントコンポーネントがないため、RunTime エラーが生成されます。
サンプルコードを保存し、表計算ドキュメントからマクロを実行します。詳細情報については、「StarDesktop」を参照してください。 |
セルの参照は、こうした数字による座標指定だけではなく、名前による指定も可能で、たとえば表計算ドキュメントの左上隅のセル (0,0) は、A1 セルとも呼ばれます。この場合のアルファベット A は列の位置を示し、数値 1 は行の位置を示します。このようなセル位置の参照方式を使い分ける際には、名前 (name) 方式の行指定は 1 から始まり、位置 (position) 方式の値は 0 から始まるので、両者を混同しないよう注意が必要です。
Apache OpenOffice のセルには、テキスト、数値、数式のいずれかを入力でき、何も入力されていないものを空白セルと呼びます。セルの種類は、セルに入力する内容で規定されるのではなく、これらを入力する際に使用するオブジェクト属性により決まります。つまり数値を入力するには Value 属性、テキストを入力するには String 属性、数式を入力するには Formula 属性をそれぞれ使用します。
Dim Doc As Object Dim Sheet As Object Dim Cell As Object Doc = StarDesktop.CurrentComponent Sheet = Doc.Sheets(0) Cell = Sheet.getCellByPosition(0, 0) Cell.Value = 100 Cell = Sheet.getCellByPosition(0, 1) Cell.String = "Test" Cell = Sheet.getCellByPosition(0, 2) Cell.Formula = "=A1"
このサンプルコードでは、A1 から A3 のセルに、それぞれ数値、テキスト、数式を入力しています。
仮に String 属性を用いて数値を入力した場合、Apache OpenOffice はこれをテキストとして扱います。たとえば、このような方法でセルに入力された数値は、右揃えではなく左揃えに表示されます。また数式を用いてテキストや数値を表示させた場合にも、同様の注意が必要です。
Dim Doc As Object Dim Sheet As Object Dim Cell As Object Doc = StarDesktop.CurrentComponent Sheet = Doc.Sheets(0) Cell = Sheet.getCellByPosition(0, 0) Cell.Value = 100 Cell = Sheet.getCellByPosition(0, 1) Cell.String = 1000 Cell = Sheet.getCellByPosition(0, 2) Cell.Formula = "=A1+A2" MsgBox Cell.Value
このサンプルコードを実行すると、A1 セルには 100、A2 セルには 1000 と表示されますが、A1+A2 という計算式の結果は 100 となります。こうなる原因は、A2 セルの値を数値ではなくテキストとして入力したためです。
セルの内容が数値であるか文字列であるかを確認するには、Type 属性を使用します。
Dim Doc As Object Dim Sheet As Object Dim Cell As Object Doc = StarDesktop.CurrentComponent Sheet = Doc.Sheets(0) Cell = Sheet.getCellByPosition(1,1) Cell.Value = 1000 Select Case Cell.Type Case com.sun.star.table.CellContentType.EMPTY MsgBox "Content: Empty" Case com.sun.star.table.CellContentType.VALUE MsgBox "Content: Value" Case com.sun.star.table.CellContentType.TEXT MsgBox "Content: Text" Case com.sun.star.table.CellContentType.FORMULA MsgBox "Content: Formula" End Select
Cell.Type 属性を使うと、セルの内容の種類を示す com.sun.star.table.CellContentType の値を取得できます。返される値は、次のいずれかです。
- EMPTY
- 値なし
- VALUE
- 数値
- TEXT
- 文字列
- FORMULA
- 数式
セルの挿入、削除、コピー、移動
Apache OpenOffice Calc には、セルの内容を直接編集する以外にも、セルの挿入、削除、コピー、移動を行うためのインターフェースが用意されています。このインターフェース (com.sun.star.sheet.XRangeMovement) は、表計算ドキュメントオブジェクトを通じて利用するもので、セルの内容を操作するために 4 種類のメソッドを提供しています。
insertCell メソッドは、セルを表計算ドキュメントに挿入する際に使用します。
Dim Doc As Object Dim Sheet As Object Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress Doc = StarDesktop.CurrentComponent Sheet = Doc.Sheets(0) CellRangeAddress.Sheet = 0 CellRangeAddress.StartColumn = 1 CellRangeAddress.StartRow = 1 CellRangeAddress.EndColumn = 2 CellRangeAddress.EndRow = 2 Sheet.insertCells(CellRangeAddress, com.sun.star.sheet.CellInsertMode.DOWN)
このサンプルコードは、表計算ドキュメントの最初のシート (インデックス値 0) の第 2 列と第 2 行の位置 (インデックス値はともに 1) に、2 行 2 列分のセル範囲を挿入します。また挿入位置にある既存のセルは、その内容ごと下方に移動しています。
挿入するセル範囲を指定するには、com.sun.star.table.CellRangeAddress 構造体を使用します。この構造体には、次の値を設定できます。
- Sheet (short)
- シート番号 (開始値は 0)。
- StartColumn (long)
- セル範囲の先頭列 (開始値は 0)。
- StartRow (long)
- セル範囲の先頭行 (開始値は 0)。
- EndColumn (long)
- セル範囲の最終列 (開始値は 0)。
- EndRow (long)
- セル範囲の最終行 (開始値は 0)。
これらの設定の終了した CellRangeAddress 構造体は、insertCells メソッドの第 1 パラメータとして渡します。insertCells メソッドの第 2 パラメータには、セル範囲の挿入位置にある既存セルの処置を指定するため、com.sun.star.sheet.CellInsertMode の値を渡します。この CellInsertMode には、次の値が用意されています。
- NONE
- 挿入前の値を、その位置にとどめます。
- DOWN
- 挿入位置にあるセルを、下に移動します。
- RIGHT
- 挿入位置にあるセルを、右に移動します。
- ROWS
- 挿入位置にある行全体を、下に移動します。
- COLUMNS
- 挿入位置にある列全体を、右に移動します。
removeRange メソッドは、insertCells メソッドと逆の機能を担っています。このメソッドは、CellRangeAddress 構造体で指定したセル範囲を、スプレッドシートから削除します。
Dim Doc As Object Dim Sheet As Object Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress Doc = StarDesktop.CurrentComponent Sheet = Doc.Sheets(0) CellRangeAddress.Sheet = 0 CellRangeAddress.StartColumn = 1 CellRangeAddress.StartRow = 1 CellRangeAddress.EndColumn = 2 CellRangeAddress.EndRow = 2 Sheet.removeRange(CellRangeAddress, com.sun.star.sheet.CellDeleteMode.UP)
このサンプルコードでは、B2:C3 のセル範囲をシートから削除して、該当範囲の下方にあるセルを上に 2 行分移動させています。削除に伴い周囲のセルをどう処理するかは、次の com.sun.star.sheet.CellDeleteMode の値により指定します。
- NONE
- 削除前の値を、その位置にとどめます。
- UP
- 該当範囲の下側にあるセルを上に移動します。
- LEFT
- 該当範囲の右側にあるセルを左に移動します。
- ROWS
- 該当範囲の下側にある行全体を、上に移動します。
- COLUMNS
- 該当範囲の右側にある列全体を、左に移動します。
XRangeMovement インターフェースには、セル範囲の移動 (moveRange) およびコピー (copyRange) 処理用に、2 つの追加メソッドが用意されています。次のサンプルコードでは、B2:C3 のセル範囲を、A6 の位置へ移動します。
Dim Doc As Object Dim Sheet As Object Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress Dim CellAddress As New com.sun.star.table.CellAddress Doc = StarDesktop.CurrentComponent Sheet = Doc.Sheets(0) CellRangeAddress.Sheet = 0 CellRangeAddress.StartColumn = 1 CellRangeAddress.StartRow = 1 CellRangeAddress.EndColumn = 2 CellRangeAddress.EndRow = 2 CellAddress.Sheet = 0 CellAddress.Column = 0 CellAddress.Row = 5 Sheet.moveRange(CellAddress, CellRangeAddress)
moveRange メソッドを使用する場合は、CellRangeAdress 構造体の指定以外にも、com.sun.star.table.CellAddress 構造体によるセル範囲の移動先も指定する必要があります。CellAddress には、次の値を設定できます。
- Sheet (short)
- 表計算ドキュメント番号 (開始値は 0)。
- Column (long)
- 移動先の列位置 (開始値は 0)。
- Row (long)
- 移動先の行位置 (開始値は 0)。
moveRange メソッドを使用した場合、移動先のセルの内容は常に上書きされます。InsertCells メソッドの場合とは異なり、removeRange メソッドには、移動先のセルを自動的に移動させるパラメータは用意されていません。
copyRange メソッドの使用法は moveRange メソッドと同様ですが、copyRange の場合はセル範囲の移動ではなくコピーを行うという相違点があります。
Content on this page is licensed under the Public Documentation License (PDL). |