Top > OOoBasic > Calc > sheet

シート Edit

Calc ドキュメントのシートにアクセスします。また、シートの挿入、削除、コピー、置換、移動を行います。

シートコンテナ Edit

Calc ドキュメントにあるすべてのシートを含むシートコンテナオブジェクトを取得します。

Sub sheet_10
  oDoc = ThisComponent
  oSheets = oDoc.getSheets()
End Sub

このシートコンテナオブジェクトからインデックス、名前、または列挙によりシートへアクセスします。

シートへのアクセス Edit

シートコンテナオブジェクトから特定のシートを取得します。シートを取得するには次の三つの方法があります。

インデックスによるアクセス Edit

インデックスによるアクセスには com.sun.star.container.XIndexAccess インターフェースのメソッドを利用します。 getByIndex メソッドは "0" から始まるシートのインデックスでシートオブジェクトを取得します。Calc ドキュメントで表示されているシートは左から 0, 1, 2, ... とインデックスされています。

com.sun.star.sheet.Spreadsheet getByIndex( [in] long SheetNumber )

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 文で順にシート名を表示しました。

名前によるアクセス Edit

シート名が分かっているときは SheetName にシート名を指定すればシートオブジェクトが取得できます。 getByName メソッドはシートの名前でオブジェクトを取得します。名前はシートを切り替えるタブに表示されている名前と同じものです。

com.sun.star.sheet.Spreadsheet getByName( [in] string SheetName )

次のコードでは名前のシートがあるかどうかを調べて,あればページスタイル名を表示します。

 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

列挙によるアクセス Edit

createEnumeration はシートが順に要素として並べられたコレクションを返します。 直接にシートオブジェクトを返すのではなく,シートを順に返すオブジェクトを返します。

com.sun.star.container.XEnumerationAccess createEnumeration( void )

次のコードでは順にシート内のセルが結合しているかどうかを表示します。

 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 を用いたアクセスでは hasMoreElementsnextElement メソッドを用いて順にアクセスすることしかできません。 hasMoreElements は順にアクセスしていったときに次の要素があるかどうかを返します。nextElement は次の要素を返します。

新規挿入 Edit

まずは,新規シートの挿入です。シートの新規挿入には 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 になります。

挿入 Edit

別のドキュメントからシートを持ってきたシートを挿入する際などに使用します。同じドキュメント内でのシートは挿入を使用してもいいですが,コピーも使用することができます。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

この場合,挿入されたシートは最後のインデックスになります。

削除 Edit

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 メソッドの引数は削除するシートの名前です。

コピー Edit

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 メソッドの最初の引数は,コピー元のシート名です。二番めの引数はコピー後のシート名,三番目の引数は,コピーしたシートのインデックスです。

ドキュメント間でのシートのコピーはシートのリンクを参照してください。

置換 Edit

置換する名前のシートの内容が置換されて名前はそのままです。

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 メソッドの最初の引数は,置換するシートの名前です。二番めの引数は,置換するシートオブジェクトです。

移動 Edit

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 がエラーの送信ダイアログを表示します。

シートリンク Edit

シートを別のドキュメントシートや別のドキュメント (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 メソッドの引数は次のようになります。

  • URL: リンク先ドキュメントの URL
  • SheetName: シート名
  • フィルター名: リンク先ドキュメントを読み込むフィルタ名 (内部名)
  • フィルタオプション: フィルタのオプション指定
  • Mode: モード

シートタブの色 Edit

TabColor プロパティで設定します。3.3 から。

シートイベント Edit

3.3 から。シートオブジェクトから getEvent メソッドで設定できます。

イベント名イベントオブジェクト説明
OnFocusなしシートがアクティブになったとき
OnUnfocusなしシートがノンアクティブになったとき
OnSelect選択したオブジェクト選択オブジェクトの変更
OnDoubleClickダブルクリックされたオブジェクトダブル栗っっくしたとき
OnRightClick右クリックされたオブジェクト右クリックしたとき
OnChange変更されたセル変更時
OnCalculateなし計算時

まとめ Edit

使用したメソッドなどをまとめておきます。

返り値メソッド引数
booleanhasElements()シートの有無
anygetByName( [in] string aName )シート名からシートオブジェクトを返す
[]stringgetElementNames()シート名の配列
booleanhasByName( [in] string aName )名前のシートの有無
voidreplaceByName( [in] string aName, [in] any aElement )名前のシートを置換する
voidinsertByName( [in] string aName, [in] any aElement )シート名を指定してシートを挿入する
voidremoveByName( [in] string Name )シート名を指定してシートを削除する
voidinsertNewByName( [in] string aName, [in] short nPosition )新しいシートを挿入する
voidmoveByName( [in] string aName, [in] short nDestination )名前指定でシートを移動する
voidcopyByName( [in] string aName, [in] string aCopy, [in] short nDestination )名前指定でシートをコピーする
com.sun.star.
table.XCell
getCellByPosition( [in] long nColumn, [in] long nRow, [in] long nSheet )
com.sun.star.
table.XCellRange
getCellRangeByPosition( [in] long nLeft, [in] long nTop, [in] long nRight, [in] long nBottom, [in] long nSheet )
[]com.sun.star.
table.XCellRange
getCellRangesByName( [in] string aRange )
com.sun.star.
container.XEnumeration
createEnumeration()含むシートエレメントへのenumeration access
longgetCount()シートの数を返す
anygetByIndex( [in] long Index )表インデックスでシートオブジェクトを取得

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes