当然ながら、マクロでデータの入っているセルの範囲を指定することは多い。
そこで、以下はデータの入っているセルの範囲を得るマクロ。
1 2 3 4 5 6 7 8 9 10 |
Sub GetLastCellPosition() Dim objSheet As Object Dim objRange As Object Dim objCursor As Object objSheet = ThisComponent.CurrentController.Activesheet objRange = objSheet.getCellRangeByName("A1") objCursor = objSheet.createCursorByRange(objRange) objCursor.gotoEndOfUsedArea(True) Msgbox(objCursor.Rows.Count & " : " & objcursor.Columns.Count, 0, "データのある最終の行:列") End Sub |
実行すると、以下のように、現在のシート上でデータの入っている一番右下のセルの番地を表示する窓が開く。
これを、データを並び替えるマクロに組み込んでみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Sub subSortRange Dim aSortFields(2) as New com.sun.star.util.SortField Dim aSortDesc(0) as New com.sun.star.beans.PropertyValue Dim objSheet As Object Dim objRange As Object Dim objCursor As Object objSheet = ThisComponent.CurrentController.Activesheet objRange = objSheet.getCellRangeByName("A1") objCursor = objSheet.createCursorByRange(objRange) objCursor.gotoEndOfUsedArea(True) oDocument = ThisComponent oSheets = oDocument.Sheets oSheet = oSheets.getByIndex(0) oRange = oSheet.getCellRangeByPosition(0,0,objCursor.Columns.Count-1,objCursor.Rows.Count-1) 'range aSortFields(0).Field = 3 aSortFields(0).SortAscending = True 'sort ascending by column D aSortFields(1).Field = 6 aSortFields(1).SortAscending = False 'then sort descenting by column G aSortFields(2).Field = 2 aSortFields(2).SortAscending = True 'then sort ascending by column C aSortDesc(0).Name = "SortFields" aSortDesc(0).Value = aSortFields() oRange.Sort(aSortDesc()) End Su |
これで、データの件数を変更しても、マクロを書き直さなくて済むようになった。