昨年末よりOpenOfficeをマスターすべくいろいろやってみているEXCELユーザーです。今はCalcでデータを加工するマクロ作成に取り組んでいますが、EXCELでVBAを試したときのようにすんなりとはいっていません。最初にやり方が分からずつまずいたのは、指定範囲をSORTする方法です。EXCELのマクロでは「Range("xxx:xxx").Select」で範囲を指定して「Selection.Sort」でSORT-Key列を決めるやり方でSORTができますが、OpenOfficeではそれに相当するものはないのでしょうか?
ググってみましたがそれらしいものは見つからず検索結果を開いてみると、ループ文とIF文を組み合わせたプログラムの紹介ばかりです。EXCELのマクロのように簡単にSORTするためのコマンドのようなものは存在しないのでしょうか?
仕事がら膨大な行数のEXCELデータを扱っています。そのときどきで必要な部分のみを取り出す必要があり、一連の操作をマクロボタンにまとめられることは、TOOLとして非常に役立っています。その中でもSORTは必須の機能です。
ないのであれば、プロシージャを作るしかないと考えています。引数として、指定範囲とSORT-Key列(できれば複数)を渡せばSORTしてくれるプロシージャを作っている方、もしくは紹介されているところをご存じの方がいれば是非ともご教示下さい。自分で作ればいいのですが、今の私の知識ではかなりの時間が掛かりそうです。
【解決しました】Calcで指定範囲をSORTするマクロ
【解決しました】Calcで指定範囲をSORTするマクロ
最後に編集したユーザー moriwake [ 3月 4, 2012, 11:15 am ], 累計 1 回
OpenOffice 3.3.0 on Windows XP SP2
Re: Calcで指定範囲をSORTするマクロ
OpenOffice.org 3.3.0 Windows Xp
Re: Calcで指定範囲をSORTするマクロ
おーくぼさん
ご教示ありがとうございました。あれから他にもいくつかのサンプルプログラムがみつかり、それらを参考にプロシー
ジャを作って試していました。知識の浅い私なのでかなりの時間がかかりましたが、何とかソートキー2つでソートでき
るものができました。
しかし、いまだうまくいっていない点があります。sheetの指定をプロシージャの引数でしたいのですがうまくいかず、
sheet1がソートされます。データ型がおかしいのでしょうか? 分かる方ご教示をお願いいたします。また、他にも私の
プログラムにおかしい点があれば何でもアドバイスをお願いいたします。
サンプルプログラムの切り貼りで何とか簡単なマクロが作ってみましたが、一行一行の意味が理解できてないので、
イメージしたマクロをサクサク作れるようになれるのは気の遠くなるほどさきのように思えてきます。皆さまはOpen-
Officeのマクロの記述方法の有効な情報を何から得ているのでしょうか? いいものがあればアドバイスを待ってい
ます。
Sub test
sort_150( "B1:F10", "d", "e", 2 )' sheet3の"B1:F10"をソートキー1-d列,ソートキー2-e列でソートする
End Sub
Sub sort_150( hani As String, srtkey1 As String, srtkey2 As String, shtnm As Integer )'sortキーが2つのsortプロシージャ
' hani:ソート対象範囲 , srtkey1:ソートキー1 , srtkey2:ソートキー2 , shtnm:対象sheet番号
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
DIm sd1, sd2, sdb As String
oSheet = ThisComponent.Sheets( shtmn ) 'testからSheet3を指定してるつもりがSheet1がソートされる
oCellRange = oSheet.getCellRangeByName( hani )
sd1 = LCase( srtkey1 )
sd2 = LCase( srtkey2 )
sdb = LCase( hani )
aSortFields(0).Field = Asc( sd1 ) - Asc( Left( sdb, 1 ) ) '第1ソートキー列の指定
aSortFields(0).SortAscending = True
aSortFields(1).Field = Asc( sd2 ) - Asc( Left( sdb, 1 ) ) '第2ソートキー列の指定
aSortFields(1).SortAscending = True
aSortDesc(0).Name = "SortFields"
aSortDesc(0).Value = aSortFields()
aSortDesc(1).Name = "ContainsHeader"
aSortDesc(1).Value = False
ThisComponent.getCurrentController().select( oCellRange )
oCellRange.sort( aSortDesc() )
End Sub
ご教示ありがとうございました。あれから他にもいくつかのサンプルプログラムがみつかり、それらを参考にプロシー
ジャを作って試していました。知識の浅い私なのでかなりの時間がかかりましたが、何とかソートキー2つでソートでき
るものができました。
しかし、いまだうまくいっていない点があります。sheetの指定をプロシージャの引数でしたいのですがうまくいかず、
sheet1がソートされます。データ型がおかしいのでしょうか? 分かる方ご教示をお願いいたします。また、他にも私の
プログラムにおかしい点があれば何でもアドバイスをお願いいたします。
サンプルプログラムの切り貼りで何とか簡単なマクロが作ってみましたが、一行一行の意味が理解できてないので、
イメージしたマクロをサクサク作れるようになれるのは気の遠くなるほどさきのように思えてきます。皆さまはOpen-
Officeのマクロの記述方法の有効な情報を何から得ているのでしょうか? いいものがあればアドバイスを待ってい
ます。
Sub test
sort_150( "B1:F10", "d", "e", 2 )' sheet3の"B1:F10"をソートキー1-d列,ソートキー2-e列でソートする
End Sub
Sub sort_150( hani As String, srtkey1 As String, srtkey2 As String, shtnm As Integer )'sortキーが2つのsortプロシージャ
' hani:ソート対象範囲 , srtkey1:ソートキー1 , srtkey2:ソートキー2 , shtnm:対象sheet番号
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
DIm sd1, sd2, sdb As String
oSheet = ThisComponent.Sheets( shtmn ) 'testからSheet3を指定してるつもりがSheet1がソートされる
oCellRange = oSheet.getCellRangeByName( hani )
sd1 = LCase( srtkey1 )
sd2 = LCase( srtkey2 )
sdb = LCase( hani )
aSortFields(0).Field = Asc( sd1 ) - Asc( Left( sdb, 1 ) ) '第1ソートキー列の指定
aSortFields(0).SortAscending = True
aSortFields(1).Field = Asc( sd2 ) - Asc( Left( sdb, 1 ) ) '第2ソートキー列の指定
aSortFields(1).SortAscending = True
aSortDesc(0).Name = "SortFields"
aSortDesc(0).Value = aSortFields()
aSortDesc(1).Name = "ContainsHeader"
aSortDesc(1).Value = False
ThisComponent.getCurrentController().select( oCellRange )
oCellRange.sort( aSortDesc() )
End Sub
OpenOffice 3.3.0 on Windows XP SP2
Re: Calcで指定範囲をSORTするマクロ
元の質問者です。うまくいかないといってたことが解決しました。
sheetの指定をプロシージャの引数でするのがうまくいかないと前の投稿で書いていましたが、あとで気付きましたがマクロの内容に入力ミスがありました。お騒がせしました本当にど素人で申し訳ありません。引数でsheetを指定するのは問題なくできました。
[誤]oSheet = ThisComponent.Sheets( shtmn ) 'testからSheet3を指定してるつもりがSheet1がソートされる
[正]oSheet = ThisComponent.Sheets( shtnm ) 'testからSheet3を指定してるつもりがSheet1がソートされる
パンチミスを直して最初に作りたかった指定範囲とSORT-Key列(できれば複数)を引数で渡せばSORTしてくれるプロシージャが、かなりの時間は掛かったけれど一応完成しました。SORT-Key列とSORT対象範囲の最初の列ははAA列以降を指定できないので、文字がアルファベットかどうかを判別するプロシージャを別に作って、それに反したときのエラーメッセージの部分が大きくなってしまいましたが、中身をみて下さい。
マクロのこともプログラミングのこともあまり知らない私なので、常識的でないマクロかもしれません。何かコメントがあれば何でももらえたら本当にうれしいです。
それにしてもOpenOfficeのマクロは、Excelのマクロにに比べて素人にはかなりハードルが高いです。UNOて何?。object変数の使い方がまだよく分からない!!。という状態から現時点全く抜け出せません。分かりやすく解説しているものを探しても私のレベルに合うものはみつかっていません。
1年ほど前にExcelのマクロに出会ったときは、本屋に置いてある解説本よりもネットの検索サイトからの情報が本当に役に立ち、それらを元に欲しいマクロをサクサク組んでいたのにOpenOfficeではなかなか前に進みません。今は一つ一つ欲しい機能のプロシージャを今回のように時間が掛けて作りつつ、UNOとかobject変数に少しずつ触れていくしかないと思っています。アドバイスがあれば本当に何でも欲しいです。
sheetの指定をプロシージャの引数でするのがうまくいかないと前の投稿で書いていましたが、あとで気付きましたがマクロの内容に入力ミスがありました。お騒がせしました本当にど素人で申し訳ありません。引数でsheetを指定するのは問題なくできました。
[誤]oSheet = ThisComponent.Sheets( shtmn ) 'testからSheet3を指定してるつもりがSheet1がソートされる
[正]oSheet = ThisComponent.Sheets( shtnm ) 'testからSheet3を指定してるつもりがSheet1がソートされる
パンチミスを直して最初に作りたかった指定範囲とSORT-Key列(できれば複数)を引数で渡せばSORTしてくれるプロシージャが、かなりの時間は掛かったけれど一応完成しました。SORT-Key列とSORT対象範囲の最初の列ははAA列以降を指定できないので、文字がアルファベットかどうかを判別するプロシージャを別に作って、それに反したときのエラーメッセージの部分が大きくなってしまいましたが、中身をみて下さい。
コード: 全て選択
Sub test
sort_150( "B1:F10", "c", "d", 2 ) 'SORT対象範囲はsheet2の"B1:F10"。SORTキー列はCとD。
End Sub
'***** sortキーが2つでsortするプロシージャ *****
Sub sort_150( hani As String, srtkey1 As String, srtkey2 As String, shtnm As Integer )
' hani:SORT対象範囲 srtkey1,srtkey2:SORTキー列 shtnm:シート番号
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
Dim sd1, sd2, sdb As String
sw1 = 0 'SORT-Key列とSORT対象範囲の最初の列の指定に問題がないか最初に確認
If IsAlphabet( Left( hani ,1 ) ) = False Then
sw1 = sw1+1
End If
If IsAlphabet( srtkey1 ) = False Then
sw1 = sw1+1
End If
If IsAlphabet( srtkey2 ) = False Then
sw1 = sw1+1
End If
If IsAlphabet( Mid( hani ,2 ,1 ) ) = True Then
sw1 = sw1+1
End If
If sw1 <> 0 Then 'キー列などの指定に問題があった場合
MsgBox " << エラーメッセージです >> マクロの使用間違い [ Sub sort_150() ]" + Chr(13) + Chr(13) _
+ Chr(13) + Chr(13) + Chr(13) _
+ "Sortキー列 と Sort範囲の最初の列 はAA列以降を指定しないでください。" + Chr(13) _
+ "本マクロが対応していません。"+ Chr(13) + Chr(13) _
+ "Sortしないで[ Sub sort_150() ]は終了します。"+ Chr(13) + Chr(13) _
+ " [現状] sort_150( """ + hani + """ , """ + srtkey1 + """ , """ + srtkey2 + """ , " + shtnm + " )" _
+ Chr(13) + Chr(13)
Exit Sub
End If
'列の指定に問題がなければSort作業開始
oSheet = ThisComponent.Sheets( shtnm )
oCellRange = oSheet.getCellRangeByName( hani )
sd1 = LCase( srtkey1 )
sd2 = LCase( srtkey2 )
sdb = LCase( hani )
aSortFields(0).Field = Asc( sd1 ) - Asc( Left( sdb, 1 ) ) '第1ソートキー列の指定
aSortFields(0).SortAscending = True '昇順sort
aSortFields(1).Field = Asc( sd2 ) - Asc( Left( sdb, 1 ) ) '第2ソートキー列の指定
aSortFields(1).SortAscending = True '昇順sort
aSortDesc(0).Name = "SortFields"
aSortDesc(0).Value = aSortFields()
aSortDesc(1).Name = "ContainsHeader"
aSortDesc(1).Value = False
ThisComponent.getCurrentController().select( oCellRange )
oCellRange.sort( aSortDesc() )
End Sub
'***** 引数sdが1文字のアルファベットかどうかを確認するプロシージャ *****
Function IsAlphabet( sd As String ) As Boolean
Dim sdm As String
Dim bdm As Boolean
sdm = UCase( sd )
bdm = false
If Len( sdm ) <> 1 Then
Goto ExitLabel:
End If
If Asc( "A" ) <= Asc( sdm ) And Asc( sdm ) <= Asc( "Z" ) Then
bdm = true
End If
ExitLabel:
IsAlphabet = bdm
End Function
それにしてもOpenOfficeのマクロは、Excelのマクロにに比べて素人にはかなりハードルが高いです。UNOて何?。object変数の使い方がまだよく分からない!!。という状態から現時点全く抜け出せません。分かりやすく解説しているものを探しても私のレベルに合うものはみつかっていません。
1年ほど前にExcelのマクロに出会ったときは、本屋に置いてある解説本よりもネットの検索サイトからの情報が本当に役に立ち、それらを元に欲しいマクロをサクサク組んでいたのにOpenOfficeではなかなか前に進みません。今は一つ一つ欲しい機能のプロシージャを今回のように時間が掛けて作りつつ、UNOとかobject変数に少しずつ触れていくしかないと思っています。アドバイスがあれば本当に何でも欲しいです。
OpenOffice 3.3.0 on Windows XP SP2