Top > OOoBasic > Calc > sort

並べ替え Edit

セル範囲の並べ替えを行います。

並べ替え Edit

セル範囲の内容の並べ替えを行うメソッドは sort です。

Sub sort_1
Dim oSheet As Object, oCellRange As Object
Dim aSortDesc(1) As New com.sun.star.beans.PropertyValue
Dim aSortFields(0) As New com.sun.star.util.SortField
Dim aData() As String
 aData() = Array( Array("z"), Array("m"), _
     Array("a"), Array("e"), Array("A") )
 oSheet = ThisComponent.Sheets( 0 )
 oCellRange = oSheet.getCellRangeByName( "A1:A5" )
 oCellRange.setDataArray( aData() )
 aSortFields(0).Field = 0
 aSortFields(0).SortAscending = True
 aSortDesc(0).Name = "SortFields"
 aSortDesc(0).Value = aSortFields()
 aSortDesc(1).Name = "ContainsHeader"
 aSortDesc(1).Value = False
 MsgBox ""
 ThisComponent.getCurrentController().select( oCellRange )
 oCellRange.sort( aSortDesc() )
End Sub

"A1:A5" に入力された 5 文字が並べ替えられます。

シートにも sort メソッドが用意されていて、oSheet.sort(aSortDesc) とすることもできます。

インターフェースは com.sun.star.util.XSortable です。

オプション Edit

上の sort メソッドを使用しただけでも並べ替えは行われます。しかし,並び方を変更したい場合にはオプションを指定する必要があります。

オプションは sort メソッドの引数として指定します。"sort_1" では aSortDesc() で指定しています (オプションは空ですが)。オプションは com.sun.star.beans.PorertyValue を使用して指定します。このプロパティーに com.sun.star.util.SortDescriptor サービスのプロパティーを指定します。

Sub sort_2
Dim oSheet As Object, oCellRange As Object
Dim aSortDesc(3) As New com.sun.star.beans.PropertyValue
Dim aSortFields(0) As New com.sun.star.util.SortField
Dim aData(0, 4) As String

  aData() = Array( Array( "z", "m", "aA", "aa", "Aa" ) )
  oSheet = ThisComponent.Sheets( 0 )
  oCellRange = oSheet.getCellRangeByPosition( 0, 0, 4, 0 ) 'A1:E1
  oCellRange.setDataArray( aData() )
  aSortFields(0).Field = 0
  aSortFields(0).SortAscending = True
  aSortDesc(0).Name = "SortFields"
  aSortDesc(0).Value = aSortFields()
  aSortDesc(1).Name = "ContainsHeader"
  aSortDesc(1).Value = False
  aSortDesc(2).Name = "IsCaseSensitive"
  aSortDesc(2).Value = True
  aSortDesc(3).Name = "IsSortColumns"
  aSortDesc(3).Value = True
  MsgBox ""
  oCellRange.sort( aSortDesc() )
End Sub

設定されているロケールによってはまったく並ぶ順番が変化しませんが,上のコードのようにソートオプションを指定します。

ContainsHeader は表に並べ替えを行わないヘッダラベルを使用するかどうかを指定します。IsCaseSensitive は大文字と小文字を区別するかどうかです。SortColumns を true にすると行ではなく列でソートします。

spreadsheet でのソートでは com.sun.star.util.SortDescriptor サービスのもの以外に,テキストテーブル用の com.sun.star.table.TableSortDescriptor サービスのもの,シート用の com.sun.star.sheet.SheetSortDescriptor サービスのものもオプションとして使用できます。

com.sun.star.util.SortDescriptor
boolean IsCaseSensitive大文字と小文字を区別する
boolean SortAscending昇順または降順でソートする (spreadsheet では無視される)
boolean IsSortColumnstrue: 列でソート,false: 行でソート (SortColumns は間違い?)
.lang.Locale CollatorLocaleソート時の言語。struct で
string CollatorAlgorithmソート時の言語オプション
com.sun.star.sheet.SheetSortDescriptor
seq<.util.SortField> SortFields個別のソートフィールドの指定。struct で
[readonly] long MaxFieldCountdescriptor に保持できるフィールド数
.table.TableOrientation Orientationソートする方向。enum で
boolean ContainsHeader最初の行または列を表のラベルとするか
com.sun.star.sheet.SheetSortDescriptor
boolean BindFormatsToContent書式を含む
boolean IsUserListEnabledユーザー定義の順序の使用
long UserListIndex使用するユーザー定義の順序のインデックス
boolean CopyOutputData並べ替え結果の貼り付け
.table.CellAddress OutputPositionソート後に貼り付けるセル位置を struct で
SortFieldプロパティーは優先的に並べるフィールドを指定します。この指定には com.sun.star.util.SortField struct を使用します。
com.sun.star.util.SortField struct
long Fieldフィールド。インデックスで
boolean SortAscending昇順または降順 (true: 昇順, false: 降順)
.util.SortFieldType CopyOutputData(spreadsheet では無視される)

ロケール Edit

並べ替えを行う際に重要なのは言語設定です。並べ替えの際の言語によって並ぶ順番が変化するときがあります。 ソートの言語は com.sun.star.util.SortDescriptor サービスの CollatorLocale プロパティーにロケールを設定します。

Dim aSortDesc(0) As New com.sun.star.beans.PropertyValue
Dim aLocale As New com.sun.star.lang.Locale
  aLocale.Language = "ja" 'Japanese
  aLocale.Country = "JP" 'JAPAN
  aSortDesc(0).Name = "CollatorLocale"
  aSortDesc(0).Value = aLocale

上記のコードでは言語を "日本語" ,国を "日本" に設定しています。 ロケールの設定は (たぶん) いつも com.sun.star.lang.Locale struct を使用して行われます。

Language element は言語を文字列で http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt の ISO-639 コードを使用して指定します。 Country element は国名を文字列で http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html の ISO-3166 コードを使用して指定します。

優先フィールド Edit

最初の列と二番めの列を順に列ごとに並べ替える場合にフィールドを指定します。 フィールドの指定には,オプションで登場した SortField プロパティーを指定します。これに使用する com.sun.star.util.SortField struct の Field と SortAscending の二つのエレメントを指定します。

次のような表 (Sheet インデックス "0", "A1:B6") でソートをかけるときに,左側の列で先に並べた後,次の列でも並べる場合には次のようにします。ともに昇順で並べます。ソートすると右の表の順に並びます。

StarSuite8
StarSuite6
StarSuite7
OpenOffice.org3
OpenOffice.org2
OpenOffice.org1
VV
OpenOffice.org1
OpenOffice.org2
OpenOffice.org3
StarSuite6
StarSuite7
StarSuite8
Sub sort_4
Dim oSheet As Object, oCellRange As Object
Dim aSortDesc(1) As New com.sun.star.beans.PropertyValue
Dim aSortFields(1) As New com.sun.star.util.SortField
  oSheet = ThisComponent.Sheets( 0 )
  oCellRange = oSheet.getCellRangeByPosition( 0, 0, 1, 5 ) 'A1:B6
  aSortFields(0).Field = 0
  aSortFields(0).SortAscending = True
  aSortFields(1).Field = 1
  aSortFields(1).SortAscending = True
  aSortDesc(0).Name = "SortFields"
  aSortDesc(0).Value = aSortFields()
  aSortDesc(1).Name = "ContainsHeader"
  aSortDesc(1).Value = False
  oCellRange.sort( aSortDesc() )
End Sub

aSortFields() の配列のインデックス順に上位の優先キーになります。始めの Field 指定は表の選択範囲に相対的に一番左側の列のインデックス "0" です。二つ目の Field はその右隣の列のインデックス "1" です。それぞれについて昇順または降順を指定します。表のヘッダラベルはないので, ContainsHeader は false にします。

貼り付け Edit

並べ替えた結果を貼り付けます。

CopyOutputData と OutputPosition プロパティーを指定します。 前述の優先フィールドで使用した例の結果を別の位置に貼り付けてみます。

Sub sort_5
Dim oSheet As Object, oCellRange As Object
Dim aSortDesc(3) As New com.sun.star.beans.PropertyValue
Dim aSortFields(1) As New com.sun.star.util.SortField
Dim oCellAddress As New com.sun.star.table.CellAddress
  oSheet = ThisComponent.Sheets( 0 )
  oCellRange = oSheet.getCellRangeByPosition( 0, 0, 1, 5 ) 'A1:B6
  With oCellAddress
    .Sheet = 0
    .Column = 0
    .Row = 7
  End With
  aSortFields(0).Field = 0
  aSortFields(0).SortAscending = True
  aSortFields(1).Field = 1
  aSortFields(1).SortAscending = True
  aSortDesc(0).Name = "SortFields"
  aSortDesc(0).Value = aSortFields()
  aSortDesc(1).Name = "ContainsHeader"
  aSortDesc(1).Value = False
  aSortDesc(2).Name = "CopyOutputData" '--
  aSortDesc(2).Value = True
  aSortDesc(3).Name = "OutputPosition" '--
  aSortDesc(3).Value = oCellAddress
  oCellRange.sort( aSortDesc() )
End Sub

ソートされた結果が "A8:B13" に出力されました。出力するセル範囲の左上のセルのアドレスを oCellAddress で OutputPosition に指定しています。やはり,元のセル範囲には影響ありません。

com.sun.star.table.CellAddress struct には 3 つのエレメントがあり,Sheet, Column, Row です。


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