「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:2436
現在:5


並べ替え時の「ー」(音引き)の処理について

ページOpenOffice.org FAQの登録ページ
投稿者tu
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2009-10-04 23:58:18 (日)
OSWindows XP/Mac
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

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

に直したところ、期待した動作になったようです。 [wink]

検証

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秒程度掛かります
標準並び替えは瞬時…

使えそうだと思われた方は、マクロ全てをマイマクロ内にコピーしてツールバーボタンを適当に作成してください。

お名前:
題名:


添付ファイル: file読み並び替え.ods 1360件 [詳細]