並べ替え
セル範囲の並べ替えを行います。 並べ替え
セル範囲の内容の並べ替えを行うメソッドは 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 です。 オプション
上の 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 サービスの 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 優先フィールド
最初の列と二番めの列を順に列ごとに並べ替える場合にフィールドを指定します。 フィールドの指定には,オプションで登場した SortField プロパティーを指定します。これに使用する com.sun.star.util.SortField struct の Field と SortAscending の二つのエレメントを指定します。 次のような表 (Sheet インデックス "0", "A1:B6") でソートをかけるときに,左側の列で先に並べた後,次の列でも並べる場合には次のようにします。ともに昇順で並べます。ソートすると右の表の順に並びます。
VV
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 にします。 貼り付け
並べ替えた結果を貼り付けます。 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 です。 |