【解決しました】Calcで指定範囲をSORTするマクロ

マクロの作成、スクリプトの作成、APIの使い方
返信する
moriwake
記事: 8
登録日時: 12月 17, 2011, 7:15 pm

【解決しました】Calcで指定範囲をSORTするマクロ

投稿記事 by moriwake »

 昨年末より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してくれるプロシージャを作っている方、もしくは紹介されているところをご存じの方がいれば是非ともご教示下さい。自分で作ればいいのですが、今の私の知識ではかなりの時間が掛かりそうです。
最後に編集したユーザー moriwake [ 3月 4, 2012, 11:15 am ], 累計 1 回
OpenOffice 3.3.0 on Windows XP SP2
アバター
おーくぼ
記事: 4
登録日時: 7月 15, 2011, 10:28 pm
お住まい: 福井県
連絡する:

Re: Calcで指定範囲をSORTするマクロ

投稿記事 by おーくぼ »

こんにちは、
↓ではないの?
http://www.oooforum.org/forum/viewtopic.phtml?t=67309
OpenOffice.org 3.3.0 Windows Xp
moriwake
記事: 8
登録日時: 12月 17, 2011, 7:15 pm

Re: Calcで指定範囲をSORTするマクロ

投稿記事 by moriwake »

おーくぼさん
 ご教示ありがとうございました。あれから他にもいくつかのサンプルプログラムがみつかり、それらを参考にプロシー
ジャを作って試していました。知識の浅い私なのでかなりの時間がかかりましたが、何とかソートキー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
moriwake
記事: 8
登録日時: 12月 17, 2011, 7:15 pm

Re: Calcで指定範囲をSORTするマクロ

投稿記事 by moriwake »

 元の質問者です。うまくいかないといってたことが解決しました。
 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
返信する

“マクロと UNO API”に戻る