2011年5月2日月曜日

データの並べ替え

この項では、シートに入力されたデータを並べ替えるマクロについて考える。
  
1. 下図の通り、A1~A6に入力された文字を昇順に並べる例である。
   この例では、先頭行は列見出しではなく、データであるものとする。
  
Sub ExampleSort()
       Dim objSheet As Object
       Dim objRange As Object
       Dim objSortDesc(1) As New com.sun.star.beans.PropertyValue
       Dim objSortFields(0) As New com.sun.star.util.SortField
       objSheet = ThisComponent.CurrentController.ActiveSheet
       objRange = objSheet.getCellRangeByName("A1:A6")
       '
       'A列をキーに昇順で並べ替えを行う
       objSortFields(0).Field  = 0    '(註1)
       objSortFields(0).SortAscending  = True    '(註2)
       '
       '並べ替えキーの設定
       objSortDesc(0).Name = "SortFields"
       objSortDesc(0).Value = objSortFields()
       '
       '「列見出し」がない場合
       objSortDesc(1).Name = "ContainsHeader"
       objSortDesc(1).Value = False
       '
       '並べ替えの実行
       objRange.sort(objSortDesc())
End Sub
  
結果は下図の通り :
  
(註1) の objSortFields(0).Field で指定している値は列番号である。列番号は
0 から始まるので、並べ替えのキーがA 列である為、値に 0 を指定している。
(註2) の objSortFields(0).SortAscending では、並べ替えを昇順/降順いずれ
で行うかを指定している。昇順の場合は True、降順の場合は False を指定
する。
  
2. 次の例では、指定した範囲の先頭が列見出しである場合についてである。
   下図のように、A1 ~ A7 に入力された文字の並べ替えを行いたいが、1.
   の場合と異なり、この例では先頭行が列見出しになっている。
  
Sub ExampleSort2()
       Dim objSheet As Object
       Dim objRange As Object
       Dim objSortDesc(1) As New com.sun.star.beans.PropertyValue
       Dim objSortFields(0) As New com.sun.star.util.SortField
       objSheet = ThisComponent.CurrentController.ActiveSheet
       objRange = objSheet.getCellRangeByName("A1:A7")
       '
       'A列をキーに昇順で並べ替えを行う
       objSortFields(0).Field  = 0
       objSortFields(0).SortAscending  = True
       '
       '並べ替えキーの設定
       objSortDesc(0).Name = "SortFields"
       objSortDesc(0).Value = objSortFields()
       '
       '「列見出し」がある場合
       objSortDesc(1).Name = "ContainsHeader"
       objSortDesc(1).Value = True    '(註3)
       '
       '並べ替えの実行
       objRange.sort(objSortDesc())
End Sub
  
結果は下図の通り :
  
列見出しがある範囲の並べ替えを行う場合は、(註3) のようにプロパティ
として True を指定する。
  
3. 最後は、複数列をキーにして並べ替えを行う場合を考える。
   下図の通り、A1 ~ B14 の範囲の文字を、
      第 1 キー : A 列
      第 2 キー : B 列
   で並び替える。並び順はいずれも昇順とする。また、列見出しはないもの
   とする。
  
Sub ExampleSort3()
       Dim objSheet As Object
       Dim objRange As Object
       Dim objSortDesc(1) As New com.sun.star.beans.PropertyValue
       Dim objSortFields(0) As New com.sun.star.util.SortField
       objSheet = ThisComponent.CurrentController.ActiveSheet
       objRange = objSheet.getCellRangeByName("A1:B14")
       '
       '並べ替えの第1キーはA列。並び順は昇順
       objSortFields(0).Field  = 0
       objSortFields(0).SortAscending  = True
       '
       '並べ替えの第2キーはB列。並び順は昇順
       objSortFields(1).Field  = 1   '(註1)
       objSortFields(1).SortAscending  = True   '(註2)
       '
       '並べ替えキーの設定
       objSortDesc(0).Name = "SortFields"
       objSortDesc(0).Value = objSortFields()
       '
       '「列見出し」がない場合
       objSortDesc(1).Name = "ContainsHeader"
       objSortDesc(1).Value = False
       '
       '並べ替えの実行
       objRange.sort(objSortDesc())
End Sub
  
結果は下図の通り :
  
今回の例では、並べ替えのキーとしてB 列も指定しなければならないので、
(註1) の objSortFields(1).Field でB 列の列番号である 1 を指定し、(註2)
 objSortFields(1).SortAscending では、第 2 キーの並び順を指定している。

0 件のコメント:

コメントを投稿