シート
Calc ドキュメントのシートにアクセスします。また、シートの挿入、削除、コピー、置換、移動を行います。 シートコンテナ
Calc ドキュメントにあるすべてのシートを含むシートコンテナオブジェクトを取得します。 Sub sheet_10 oDoc = ThisComponent oSheets = oDoc.getSheets() End Sub このシートコンテナオブジェクトからインデックス、名前、または列挙によりシートへアクセスします。 シートへのアクセス
シートコンテナオブジェクトから特定のシートを取得します。シートを取得するには次の三つの方法があります。 インデックスによるアクセス
インデックスによるアクセスには com.sun.star.container.XIndexAccess インターフェースのメソッドを利用します。 getByIndex メソッドは "0" から始まるシートのインデックスでシートオブジェクトを取得します。Calc ドキュメントで表示されているシートは左から 0, 1, 2, ... とインデックスされています。
getByIndex を使用してみます。次のコードではシートのインデックス順にシート名を表示します。 Sub sheet_by_index() Dim oSheets As Object oSheets = ThisComponent.getSheets() For i% = 0 To oSheets.getCount() - 1 MsgBox oSheets.getByIndex(i).getName() Next i End Sub getCount メソッドでシートの数を数えて For 文で順にシート名を表示しました。 名前によるアクセス
シート名が分かっているときは SheetName にシート名を指定すればシートオブジェクトが取得できます。 getByName メソッドはシートの名前でオブジェクトを取得します。名前はシートを切り替えるタブに表示されている名前と同じものです。
次のコードでは名前のシートがあるかどうかを調べて,あればページスタイル名を表示します。 Sub sheet_by_name() Dim oSheets As Object, oSheet As Object Dim sSheetName As String sSheetName = "Table 1" oSheets = ThisComponent.getSheets() If oSheets.hasByName( sSheetName ) Then oSheet = oSheets.getByName( sSheetName ) MsgBox oSheet.getPropertyValue( "PageStyle" ) End If End Sub 列挙によるアクセス
createEnumeration はシートが順に要素として並べられたコレクションを返します。 直接にシートオブジェクトを返すのではなく,シートを順に返すオブジェクトを返します。
次のコードでは順にシート内のセルが結合しているかどうかを表示します。 Sub sheet_by_enumeration() Dim oSheetsEnumeration As Object, oSheets As Object oSheets = ThisComponent.getSheets() oSheetsEnumeration = oSheets.createEnumeration() While ( oSheetsEnumeration.hasMoreElements() ) MsgBox oSheetsEnumeration.nextElement.IsMerged() WEnd End Sub createEnumeration を用いたアクセスでは hasMoreElements と nextElement メソッドを用いて順にアクセスすることしかできません。 hasMoreElements は順にアクセスしていったときに次の要素があるかどうかを返します。nextElement は次の要素を返します。 新規挿入
まずは,新規シートの挿入です。シートの新規挿入には insertNewByName メソッドを使用します。 Sub sheet_1 Dim oDoc As Object, oSheets As Object Dim sSheetName As String sSheetName = "NewSheet" oDoc = ThisComponent 'calc doc oSheets = oDoc.getSheets() If NOT oSheets.hasByName( sSheetName ) Then oSheets.insertNewByName( sSheetName, 0 ) End If End Sub 新規に挿入する名前を持ったシートがあるかどうかを確認してから挿入します。insertNewByName メソッドの最初の引数は新規に挿入するシートの名前です。二つ目の引数はシートを挿入するインデックスです。ほかのシートのインデックスは変更されます。 シート数の上限は 256 です (OOo 2.3)。それ以上追加しようとすると RuntimeException になります。 挿入
別のドキュメントからシートを持ってきたシートを挿入する際などに使用します。同じドキュメント内でのシートは挿入を使用してもいいですが,コピーも使用することができます。insertByName メソッドを使用します。 Sub sheet_2 Dim oDoc As Object, oSheets As Object Dim sSheetName As String Dim oNewSheet As Object sSheetName = "NewSheet" oDoc = ThisComponent 'calc doc oSheets = oDoc.getSheets() oNewSheet = oDoc.createInstance( "com.sun.star.sheet.Spreadsheet" ) If NOT oSheets.hasByName( sSheetName ) Then oSheets.insertByName( sSheetName, oNewSheet ) End If End Sub この場合,挿入されたシートは最後のインデックスになります。 削除
removeByName メソッドを使用します。間違って重要なシートを削除しないようにしましょう。 Sub sheet_3 Dim oDoc As Object, oSheets As Object Dim sSheetName As String sSheetName = "NewSheet" oDoc = ThisComponent 'calc doc oSheets = oDoc.getSheets() If NOT oSheets.hasByName( sSheetName ) Then oSheets.removeByName( sSheetName ) End If End Sub removeByName メソッドの引数は削除するシートの名前です。 コピー
copyByName メソッドを使用します。 Sub sheet_4 Dim oDoc As Object, oSheets As Object Dim sSheetName As String Dim sCopyName As String sSheetName = "Sheet1" sCopyName = "Copy" oDoc = ThisComponent 'calc doc oSheets = oDoc.getSheets() If oSheets.hasByName( sSheetName ) Then If NOT oSheets.hasByName( sCopyName ) Then oSheets.copyByName( sSheetName, sCopyName, 0 ) End If End If End Sub copyByName メソッドの最初の引数は,コピー元のシート名です。二番めの引数はコピー後のシート名,三番目の引数は,コピーしたシートのインデックスです。 ドキュメント間でのシートのコピーはシートのリンクを参照してください。 置換
置換する名前のシートの内容が置換されて名前はそのままです。 Sub sheet_5 Dim oDoc As Object, oSheets As Object Dim oNewSheet As Object Dim sSheetName As String Dim sCopyName As String sSheetName = "Sheet1" oDoc = ThisComponent 'calc doc oSheets = oDoc.getSheets() oNewSheet = oDoc.createInstance( "com.sun.star.sheet.Spreadsheet" ) If oSheets.hasByName( sSheetName ) Then oSheets.replaceByName( sSheetName, oNewSheet ) End If End Sub replaceByName メソッドの最初の引数は,置換するシートの名前です。二番めの引数は,置換するシートオブジェクトです。 移動
moveByName メソッドを使用します。 Sub sheet_6 Dim oDoc As Object, oSheets As Object Dim sSheetName As String sSheetName = "Sheet1" oDoc = ThisComponent 'calc doc oSheets = oDoc.getSheets() If oSheets.hasByName( sSheetName ) Then oSheets.moveByName( sSheetName, 0 ) End If End Sub moveByName メソッドの最初の引数は,移動するシートの名前です。 2 番目の引数は,移動後のインデックスです。インデックスに負の値を指定すると OpenOffice.org がエラーの送信ダイアログを表示します。 シートリンク
シートを別のドキュメントシートや別のドキュメント (HTML 表など) の間でリンクする方法です。 この方法を利用すれば別のドキュメント間でシートのコピーもできます。 シートの link メソッドを使って別のシートへリンクします。リンク後にシートのリンクモードを NONE に設定すればコピーしたようになります。リンクを保持したままにするにはそのまま NORMAL にしておきます。 Sub sheet_link_1 oNewDoc = StarDesktop.loadComponentFromURL( _ "private:factory/scalc", "_blank", 0, Array() ) oNSheets = oNewDoc.getSheets() oNSheet = oNSheets.getByIndex(0) ' add link oNSheet.link( _ "/home/name/Desktop/LinkTest.ods", _ "Sheet1", _ "", _ "", _ com.sun.star.sheet.SheetLinkMode.NORMAL ) ' remove link oNSheet.setLinkMode( _ com.sun.star.sheet.SheetLinkMode.NONE ) End Sub link メソッドの引数は次のようになります。
シートタブの色
TabColor プロパティで設定します。3.3 から。 シートイベント
3.3 から。シートオブジェクトから getEvent メソッドで設定できます。
まとめ
使用したメソッドなどをまとめておきます。
|