並べ替え時の「ー」(音引き)の処理について †
ページ | OpenOffice.org FAQの登録ページ |
---|---|
投稿者 | tu |
分類 | |
優先順位 | |
状態 | |
カテゴリー | |
投稿日 | 2009-10-04 23:58:18 (日) |
OS | Windows XP/Mac |
依存するページ | |
バージョン |
メッセージ †
回答ページでは行末に「~」を付加する必要はありません |
Calcで並べ替えを行うと、「ー」を含む日本語が正しくソートされません。 例えば「アーカイブ、アイロン、アナウンサー、アンプ」 を昇順で並べ替えると、Excel(2007)では
アーカイブ アイロン アナウンサー アンプ
となるのですが、Calcでは
アイロン アナウンサー アンプ アーカイブ
となります(単に文字コードでソートしているだけのように見えます)。 Excelのように「読み」でソートする方法がありましたらご教示願います。
並べ替え用の行を作成する †
M.Kamataki (2009-10-05 12:24:19 (月))
Calcの並べ替えは文字コードソートです。「読み」でソートしたい場合は、並べ替え用の行を用意し、そこに読みを入力するしかありません。
今後の改善に期待します †
tu (2009-10-05 14:39:54 (月))
回答ありがとうございます。>M.Kamataki様
「ー」を1文字前の母音と置換してソートすればいいとは思うのですが、大量のデータを扱う場合、現実的ではありません。
Excel、Google Docs(Spreadsheet)では読みでソートしてくれるので、ソートの際にはこれらを使うことにします。
できれば、Calcが読みソートに対応してくれるとよいのですが。
関数で解決するというのはどうでしょう †
M.Kamataki (2009-10-06 18:07:33 (火))
ひらがな、カタカナは日本語だけでしか利用しません。ただ、OpenOffice.orgは多言語対応なので、なかなか日本語だけのための機能というのは機能改善に時間がかかります。また、日本人が対応すべき機能なんだと思います。そこで現実的なのはユーザー関数を作成し、拡張機能などで実装してしまうことだと思います。
ご質問はかなだけの並び替えを想定しているということで良いでしょうか。
>「ー」を1文字前の母音と置換して
この操作を行う関数をマクロで作成してみた例です。ソート用の列を用意してそこに「=ONTOKANA(A1)」などのように指定します。関数なので、コピー&貼り付けで大量のデータにも、ある程度現実的に対応できると思いますが、どうでしょうか。以下のマクロは、「マイマクロ」あるいはCalcファイルのStandardライブラリに登録してください。Function OnToKana( Kana As String) Dim Result As String Dim sString$(3) As String Dim sReplace$(3) As String Result = "" sString(0) = "あー" sString(1) = "アー" sString(2) = "さー" sString(3) = "サー" sReplace(0) = "ああ" sReplace(1) = "アア" sReplace(2) = "さあ" sReplace(3) = "サア" For i = 0 To 3 If InStr( Kana, sString(i) ) <> 0 Then Result = UserReplace( Kana, sString(i), sReplace(i) ) For j = 0 To 3 If InStr( Result, sString(j) ) <> 0 Then Result = UserReplace( Result, sString(j), sReplace(j) ) Else End If Next j Else End If Next i If Result = "" Then OnToKana = Kana Else OnToKana = Result End If End Function Function UserReplace(Source As String, Search As String, NewPart As String) 'http://wiki.services.openoffice.org/wiki/JA/Documentation/BASIC_Guide/Strings_%28Runtime_Library%29 Dim Result As String Dim StartPos As Long Dim CurrentPos As Long Result = "" StartPos = 1 CurrentPos = 1 If Search = "" Then Result = Source Else Do While CurrentPos <> 0 CurrentPos = InStr(StartPos, Source, Search) If CurrentPos <> 0 Then Result = Result + Mid(Source, StartPos, _ CurrentPos - StartPos) Result = Result + NewPart StartPos = CurrentPos + Len(Search) Else Result = Result + Mid(Source, StartPos, Len(Source)) End If ' Position <> 0 Loop End If UserReplace = Result End Function見ておわかりかと思いますが、音引きのかなすべてに対応していない作りかけです。このような関数が必要であれば、「あー」から「ワー」までの置換リストを作成する必要があります。
ちょっと拙いマクロかとも思います。改善案(USERREPLACE関数とまとめるなど)のある方のマクロの投稿は歓迎します。配列の勉強に良いかもしれません。
いったん完了にしますが、メッセージは追加していただいてかまいません。
無題 †
tani (2009-10-06 21:41:46 (火))
とりあえず気になったところを。
最初の関数の中で、2重ループになっていて、さらにそこから呼び出されている関数内でもループが使用されているので、3重ループになっています。このままだと計算困難になる可能性があるので、ループの入れ子状態を減らす方向で考えたほうが良いと思います。
あと、普通の配列を使うよりも、collectionオブジェクトとかを使って辞書を作ったほうがスマートじゃないかなと思いました。
http://www.moug.net/tech/exvba/0150076.htm
自分で書いてみる根性がないので、コメントだけですが。すいません。
Re: 関数で解決するというのはどうでしょう †
tu (2009-10-06 22:11:35 (火))
> M.Kamataki様
マクロのご投稿ありがとうございます。
私も前回のコメントを投稿したあと、マクロで解決するかもしれないと思っていました。ただ、マクロを書く時間がなかなかとれなかったもので……。
taniさんのコメントも参考にしつつ、時間ができたら研究してみます。
無題 †
ike@九州 (2009-10-08 09:29:11 (木))
検証不足ですが 以下ヨミ変換用ファンクションです
ひらがな、カタカナの場合、母音だけの別文字列を作成して"ー"があった場合、最後の母音を取り出しデフォルト文字に代入する手順です。
ひらがな、カタカナ、漢字、英数字混在でもOK?Function OnToKana(moji as string) Dim sText As string Dim sT As string Dim s As string Dim n As long Dim m As integer Dim i As integer sText = "" sT = "" sBoin = array("あ","あ","い","い","う","う","え","え","お","お",_ "あ","あ","い","い","う","う","え","え","お","お",_ "あ","あ","い","い","う","う","え","え","お","お",_ "あ","あ","い","い","う","う","う","え","え","お","お",_ "あ","い","う","え","お",_ "あ","あ","あ","い","い","い","う","う","う","え","え","え","お","お","お",_ "あ","い","う","え","お",_ "あ","あ","う","う","お","お",_ "あ","い","う","え","お","あ","あ","い","え","お","ん") If Len(moji) = 0 then exit function For i = 1 to len(moji) s = mid(moji,i,1) n = Asc(s) m = 0 If n > 12448 then m = 96 If ((n - m >12352) and (n - m < 12436)) or (s = "ー") then If s = "ー" then If i <> 1 then sT = sT & Right(sT,1) sText = sText & Right(sT,1) End if Else sT = sT & Chr(Asc(sBoin(n - m - 12353)) + m) sText = sText & s End if Else sT = sT & s sText = sText & s End if Next OnToKana = sText End Function
関数以外ではマクロで
画面更新停止>列非表示挿入>読み挿入>読みで並び替え>列削除>画面更新
の手順なら可能性ありますが…行数多いとパフォーマンス悪そうです とほほ
#下の Kamataki さんの検証を元に修正しました m(_ _)m
データ型の修正 †
M.Kamataki (2009-10-08 11:55:27 (木))
ike@九州さん、いつもながらありがとうございます。
4行目Dim s As integer↓
Dim s As stringに直したところ、期待した動作になったようです。
検証 †
M.Kamataki (2009-10-08 12:06:52 (木))
>ひらがな、カタカナ、漢字、英数字混在でもOK?
ひらがな、カタカナ混在状況では、
「あーサー」→「あアサア」
と変換されました。
無題 †
ike@九州 (2009-10-08 12:53:55 (木))
検証有難うございます。
宣言文はここにアップする時付けました とほほ
(いつも何処か抜けています)
不具合部分編集修正しました。
マクロでの読み並び替え †
ike@九州 (2009-10-14 16:09:10 (水))
サンプル作成(カタカナ、ひらがな、半角カタカナの長音判断並び替え)
前述の列挿入してからのシート上並び替えではなく、配列読み込みメモリ内での並び替えです
(ツールバーに読み昇順、読み降順ボタンを配置)
手順説明
・数式列を考慮する為、getDataArray にて表示されてる文字で配列取得し並び替え用の配列を別作成
・数式列も含めて getFormulaArray にてセルデータ配列を取得
・クイックソートアルゴリズムを用いて並び替え用配列を並び替える、その際セルデータ配列を数式を除いて同様に並び替える
・結果セルデータ配列が意図した並び替えになっているので、 setFormulaArray を使用して元のセルに戻す
Basic マクロを使用しているので、5000行*2列で6、7秒程度掛かります
標準並び替えは瞬時…
使えそうだと思われた方は、マクロ全てをマイマクロ内にコピーしてツールバーボタンを適当に作成してください。