• 締切済み

EXCEL 「並び替え」の誤動作について

WinXP/Excel2003 です。 大変お世話になります。 いまは定年退職し依頼されたExcelのアプリケーションなど 趣味で作っています。 今回、思わず躓いたのが「並び替え」です。 次のデータを昇順ソートすると   あいざわ まさき   おかだ りょうた   おがた けいすけ 結果   あいざわ まさき   おがた けいすけ   おかだ りょうた となってしまいます。 五十音順では明らかに間違っています。 インターネットでいろいろ調べたんですが、 公式文書として以下がありました。 http://office.microsoft.com/ja-jp/word/HA102031991041.aspx だとしたら、みなさんどうやって回避してるのでしょう? これだと、全く使えないので、 なにか回避策、あるいは正しい設定方法があるのではないかと 想像してますが、ご存知の方、ご指導願えれば幸いです。

みんなの回答

回答No.6

ANo.4です。 >さてさて、では実際にどんなアルゴリズムにしようか、 >ちょっと悩みますね。 そういう仕事してませんが、私なら・・・ どれでもいいけど、基本的には楽な方。 更にはバグが出にくい方、コードが少ない方。 あとはクライアントが要望した場合、「うーん、結構難しいですねー」と言いながら、それに合わせる。 と言うスタンスが好きです。

Dor_001
質問者

お礼

コード作成は最終的に個人的な審美眼によるものだと思います。 最低条件として、 バグ、速度、コード量(メモリー)だと思いますが、 最近はメモリーが安いので、バグ、速度のウェイトが高いでしょうね。 たぶん、HEX文字列に変換するワークシート関数(sjis)を作成し、 それをsort対象のワークシートの空き列に定義し、 従来のVBAのコードのsort範囲とsortキーを変更する程度の改修を考えています。一番楽でバグが少ない方法かと思います。 fumufumu_2006 さんのコードもなかなか洗練されていて、 さすがだな・・と思いました。 こんなコードがすらすら書けるようになりたいものです。 大変ありがとうございました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.5

#03です >でも、ちょっと重たいなぁ・・・ そうですね。データが何万件もあるのであればソートを何回も繰り返しますので遅くなるでしょう。 余計とは思いましたが、興味深かったので私もマクロを書いてみました。選択した範囲に対してふりがなでソートを行います。ソートHeaderの有無は自動判定にしていますので、表によってはタイトル行もソートされるかもしれません。 Sub PhoneticSort() Dim rng As Range, keyC Dim idxR, idxC, trgC As Long Const cols As Integer = 10 '挿入する作業列の数(=フリガナ文字数)  Application.ScreenUpdating = False  On Error GoTo end0  If TypeName(Selection) = "Range" Then   Set rng = Selection   keyC = Application.InputBox("ソートキーの列名を入力して下さい", Type:=2)   If keyC = False Then GoTo end0   keyC = StrConv(keyC, vbNarrow)   rng.Cells(1, 1).Offset(0, rng.Columns.Count).Resize(1, cols).EntireColumn.Insert   For idxR = rng.Row To rng.Row + rng.Rows.Count - 1    For idxC = 0 To cols - 1     trgC = rng.Column + rng.Columns.Count + idxC     Cells(idxR, trgC).Value = Mid(Cells(idxR, keyC).Value, idxC + 1, 1)    Next idxC   Next idxR   trgC = rng.Column + rng.Columns.Count   For idxC = trgC + cols - 1 To trgC Step -1    rng.Resize(rng.Rows.Count, rng.Columns.Count + cols).Sort _     key1:=Cells(rng.Row, idxC), order1:=xlAscending, header:=xlGuess   Next idxC   rng.Cells(1, 1).Offset(0, rng.Columns.Count).Resize(1, cols).EntireColumn.Delete  End If end0:  Application.ScreenUpdating = True End Sub なおテストしたデータは以下です(「データ」→「並び替え」の順番に並んでいます) Code  Name       Phonetic 1    座 頭くじら   ざ とうくじら 2    座頭 くじら   ざとう くじら 3    佐堂 賢二    さどう けんじ 4    佐藤 浩二    さとう こうじ 5    浜崎 あゆみ   はまざき あゆみ 6    浜崎 歩      はまさき あゆむ これがマクロ実行後は Code  Name       Phonetic 4    佐藤 浩二    さとう こうじ 3    佐堂 賢二    さどう けんじ 1    座 頭くじら   ざ とうくじら 2    座頭 くじら   ざとう くじら 6    浜崎 歩      はまさき あゆむ 5    浜崎 あゆみ   はまざき あゆみ になります。

Dor_001
質問者

お礼

例の方法を見事にコード化しましたね。 しかも短時間で・・・・ まったくレベルが違いますね。 コードの使い方が洗練されてるし、バグ対策も考慮されて・・ いいものを見せていただきました。 ありがとうございました。

回答No.4

ANo.3さんのにダブりますが、漢字コード順がいいなら一時的に作業行に文字列の漢字コード(16進)を作っては? B列を作業列にして、A列を並び替えます。 Function sjis(k As String) As String Dim res As String Dim i As Integer For i = 1 To Len(k) res = res & Hex(Asc(Mid(k, i, 1))) Next sjis = res End Function Sub test1() Application.ScreenUpdating = False Dim ws As Worksheet Set ws = ActiveSheet Set ws = Sheet1 ws.Range("B1").Formula = "=sjis(A1)" ws.Range("B1").Copy Destination:=ws.Range("B1:B" & ws.Range("A" & ws.Rows.Count).End(xlUp).Row) ws.Cells.Sort Key1:=ws.Range("B1"), Order1:=xlAscending, Header:=xlNo ws.Columns("B").ClearContents Application.ScreenUpdating = True End Sub ただ、これだと小文字の「っ」とかはどうするのかと言うのがあるので、順番テーブルを用意する方法はどうでしょうか? 「ヴ」とかも処理できるように全角カタカナに変換しました。 テーブルに文字がないと文字が無かったと判断します。 256個以上は無いとして、2文字hexにしました。 個人的にはrange("?")よりcells(?,?)の方が好きなので・・・ Const kana = " 123456789" & _ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" & _ "アァイィウヴゥエェオォ" & _ "カガキギクグケゲコゴ" & _ "サザシジスズセゼソゾ" & _ "タダチヂツヅッテデトド" & _ "ナニヌネノ" & _ "ハバパヒビピフブプヘベペホボポ" & _ "マミムメモ" & _ "ヤャユュヨョ" & _ "ラリルレロ" & _ "ワヲン" & _ "ー().・" Function kanaOrder(ByVal k As String) As String Dim res As String Dim i As Integer Dim p As Integer k = UCase(StrConv(k, vbKatakana)) For i = 1 To Len(k) p = InStr(kana, Mid(k, i, 1)) If p > 0 Then res = res & Right("0" & Hex(p), 2) End If Next kanaOrder = res End Function Sub test2() Application.ScreenUpdating = False Dim ws As Worksheet Set ws = ActiveSheet ws.Cells(1, 2).Formula = "=kanaOrder(A1)" ws.Cells(1, 2).Copy Destination:=ws.Range(ws.Cells(1, 2), ws.Cells(ws.Cells(ws.Rows.Count, 1).End(xlUp).Row, 2)) ws.Cells.Sort Key1:=ws.Cells(1, 2), Order1:=xlAscending, Header:=xlNo ws.Columns(2).ClearContents Application.ScreenUpdating = True End Sub p.s. activesheetを並べ替えてますが、Set ws = sheets("??")とすれば、表示していないシートも並べ替えられます。

Dor_001
質問者

お礼

真っ向からのアルゴリズムですね。 (案1) HEX変換した文字列をSORTする (案2) コレートシーケンスを自作して、 その位置データに変換しsortする いずれも鮮やかですね。 ちなみにExcelのコレートシーケンスは 「ァアィイゥウヴェエォオ・・・」 のようですので、それはそれで、 案1で充分かと思いました。 大変勉強になりました。 貴重な時間をいただきありがとうございました。 今後ともよろしくお願いします。 さてさて、では実際にどんなアルゴリズムにしようか、 ちょっと悩みますね。 でも、最初に戻りますが、 清音=濁音=半濁音 とする、基本思想はなぜ必要になったのでしょうね? しかも、その結果「等価」の場合は、 吃音<清音<濁音<半濁音 とする こんなに複雑なコレートシーケンスはなぜ必要だったのか。 なにか深いわけがありそうですね。 (つぶやきです^^;) いずれにしても皆さんありがとうございました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

Microsoftの仕様には時々使いにくいものもありますね。Dor_001さんはマクロをお使いになるようですので、マクロを使えばこんな方法もあります(力業になります) 1)並べ替えしたいデータ範囲の右に、一時的にふりがなの最長文字列分の作業列を追加する 2)各列にふりがなを1文字分ずつ表示する 3)挿入した列の内、最後(右端)の列をキーにして並び替えする 4)またその前(左となり)の1列で並び替える(これを挿入した先頭列まで繰り返す) → ここまでで期待する並び順になるはず 5)作業列を削除する 画面描画はFalseにしておくとよいでしょう。マクロまでは書きませんが、その気があれば試してみてください。 ところでこの質問をお借りしますが  http://oshiete1.goo.ne.jp/qa3890433.html はまだ解決しませんか?  >上から順に行くのが現実的かと思いますので、 だとロジックが複雑になると思いますがいかがでしたでしょうか。

Dor_001
質問者

お礼

zap35さん、いつもお世話になっています。 昔はアセンブラー言語などでバブルソートやらクイックソートなど よく作りましたが、まさにその乗りですね。 このアルゴリズムでコード化すると正しい結果が出ますね。 でも、ちょっと重たいなぁ・・・ 「Justify」の件はやはり、最大領域の下位セル+1を起点として、 End(xlUp)を使わせてもらいました。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

第1行にタイトル(例氏名)行を入れ(本質ではないが、リストというのが基本なので。) 中間にスペース(データなし)行を入れず フリガナを使わない、にチェックをいれ 大文字と小文字を区別するにチェックを入れ 行単位 でやってみてください。 うまくいくはずです ==== 文字コードに関心を持ったり、プログラム経験がない人はそう感じるかも知れませんが、コンピュターのソートは 文字コードで考えて 最左の桁から、ビット比較的に 比較して、勝負か付く(0ビットが勝、1のビットの方が巻け)ところまで比較を続け、1回目の勝負がついたところで決定(打ち切り)です。コンピュタの原初的仕組みです。 (上記は文字列の場合で、数値の場合は人間の大小の考えと、コンピュターの内部ビット表現が一致するよう定義されています。 動かしようがありません。) ーー 最近(1985年以後、パソコンなどから)エクセルなどのソフトなどからコンピュタに入り始めた人は ソフト側で裏で(便利なように)細工をしているので、ソートといえばそんな便利なものかと思いがちですが、修正ソートキーを裏で作って、それで自分(世間)の思うようにソートするようにしてるはずです。 ーー 結論は、コンピュタの基本原理は動かしようがないので、自分の思うように、逆手にとって、原ソートキーから、修正ソートキーを作らないとなりません。 ●レディメードで「フリガナを使う」 ●関数で別列に修正ソートキーを作る ●プログラムで修正キーを作る ほとんど3番目でないと出来ないでしょうが。 -- ただそんなに修正キーを作らなければならないケースは多くない。 前株後株、カ)など入力の多様化で、困ってしまって、必要になる場合が多い。 ーー スペースの問題 昔の半角かなの濁点・半濁点 の場合の扱いで、普通にソートすると、常識、慣用と異なる結果 ガ出るので、苦労した経験があります。 ーー 質問の点で、テスト的に =CODE("か")は 9259 =CODE("が")は 9260 になったので、同じ桁位置に2つがあれば、普通のソートでは、「か」が先に来ます。 (ただし昇順指定) ただ内部文字コードや色々あって各過程で使用文字コードが変化することがあるので、詳しい知識を必要とする場合があると思うが、文字コードの設計者は「か」を先(小さいコードで)に定義するはずです。

Dor_001
質問者

補足

丁寧で、かつご親切な解説をいただきありがとうございます。 ただ、 >第1行にタイトルを入れ >中間にスペース行を入れず >フリガナを使わない、にチェックをいれ >大文字と小文字を区別するにチェックを入れ >行単位 はすでにやってますが、 うまくいきませんでした。 なにか他にチェックしておかないといけない設定とかあるんでしょうか? 内部コードで単純比較してるのだったら、 このような結果は出ずに、 素直に正しい結果が出るのと思うのですが、 ご説明のように、 なにか、小細工してるようですね。 それが何のためなのかよくわからないところです。 そして、それがむしろ足を引っ張っているような気がします。 VBAでの一連の処理の流れの中のSORTなんですが、 処理前に、姓名の「名」の方を削除して、 SORT後、処理がすべて終わった段階で「名」を付加してます。 手作業です。

  • ganko3
  • ベストアンサー率67% (118/174)
回答No.1

テストしてみたら次の順序で並びました。 おか おが おかた おかだ おがた おがだ おかたけ おかだけ おがたけ おがだけ おかたり おかだり おがたり おがだり 清音、濁音の順序より後ろの字のほうが優先されるようですから、ご希望のように並べるには、姓と名を分けてまず姓で次の優先順位が名で並び変えたらよいと思います。

Dor_001
質問者

補足

回答ありがとうございます。 ただ、このやり方だと、姓・名として2列 必要となります。 本来は1列で管理すべきデータと思いますので、 ソートの前後等で、余計な処理が必要となります。 ganko3さんの方法で逃げるしかないとしたら、 みなさん不便を感じてないのでしょうか?? Microsoftともあろうものが、どうも納得できないですね。 仕様と言われればそれまでなんですが・・・ 直す気はさらさらないのでしょうかね? その辺の理由なんか知りたいですね。

関連するQ&A

  • エクセルの関数で

    次のような表があります。 名前 国語 算数 理科 あい 90 80 80 うえ 40 70 89 おか 60 70 90 きく 60 80 80 この中で科目別の最大最小をもとめ、 その点数をだしたのは誰かを求めたいのです。 重複した場合は、最初にヒットしたものでかまいません。 LOOKUPはソートしないとだめだし、 VLOOKUPはソートしなくてもいいのですが範囲の指定が・・ MATCHでは何番目までは取得できたのですが・・ マクロを使わず、この表の並び替えもしないで 出来る方法はありますか? win2k・Excel2000です

  • Excel を使用して運用データを編集する

    目的はODCファイルを開くことですがhttp://office.microsoft.com/ja-jp/excel-help/HA001086488.aspxこのページの「Web からのデータのインポートについて」の[データ] メニューはどこにありますか?

  • Excelの集計方法について(集計KEYが2個ある場合です)

    WinxpでExcel2002を使用しています。 A列  B列   C列 日付  性別  人数 上記の表があります。 SORTで日付(降順)、性別(昇順)に並べ替えを行い、その結果を以下のように人数を集計するには、どうすれば良いでしょうか? 性別計  男 ○人  性別計  女 ×人 日付計   ○+×人 尚、合わせて、日付計で、改ページも行いたいです。 ご教示宜しくお願いします。  

  • エクセルで英数字の文字列から数字を抽出

    エクセルで英数字を含む文字列から数字を抽出く =1*MID(A1,MATCH(TRUE,ISNUMBER(1*MID(A1,ROW($1:$9),1)),0),COUNT(1*MID(A1,ROW($1:$9),1))) 小数点にも対応させるにはどうしたら良いでしょうか。 「AA0.45」→0.45 「0.65BB」→0.65 「CC0.85CC」→0.85 http://office.microsoft.com/ja-jp/excel-help/HA001154901.aspx を参照しました

  • Excel2002でX/数値軸目盛にラインを入れることができますか?

    Excel2002でX/数値軸目盛にラインを入れることができますか? Microsoft Office Excel 2002です。 Excel2002でY/数値軸目盛にラインを入れることはできます。 どうすれば Excel2002でX/数値軸目盛にラインを入れることができますか? または、いつのバージョンのExcelならX/数値軸目盛にラインを入れることができますか? http://office.microsoft.com/ja-jp/excel-help/HA001034643.aspx?CTT=1

  • ExcelVBA:列方向の並び替え Orientation

    いつも大変お世話になります。初心者です。 長文で申し訳ありませんが、私の間違いについてご指導をお願いします。(Excel2003) 並び替えについて訳が分からなくなってしまいました。現状は、 ・A2セル=1月、A3=2月、A4=3月、A5=合計 ・B1セル=札幌、C1=東京、D1=名古屋、E1=大阪 ・B2:E4 は売上金額です。 ・B5 は、SUM(B2:B4) です。C5~E5も同様です。 ※売上合計は多い順に、東京、大阪、名古屋、札幌です。 この表の合計金額を並び替えをしたいと思い、以下を書いてみました。 左から順に、売上合計の多い支社順に、並ばせようとしました。 Cells(1, 1).CurrentRegion.Sort _ key1:=Cells(5, 1), order1:=xlDescending, Orientation:=xlSortColumns, header:=xlYes 【甲】 すると全く意図した形ではない並び替えが実行されてしまいました。 (なぜか行が入れ替わり、列は変わらず。) 【乙】 しかし、上のOrientationを、xlSortRows に変えてやってみると、意図した通りに並び替えられました。 【丙】 また、Order1:=xlAscending, Orientation:=xlSortRows でやってみると、列の並び替えは実施されますが、 月の見出し列(A1~A5)が一番右に移動してしまいます。 -------------------------------------------------------------------------- その後いろいろ調べたり、試行したりしたのですが疑問が山積してしまいました。 基礎的な話かもしれませんが、上記の例で、「列方向に、合計金額を基準に、正しく降順・昇順並び替え」をしたいと思っています。 【質問1】Sortメソッドのヘルプで見ると、Orientation の説明に、xlSortRows,xlSortColumnsの説明がありますが、 行方向、列方向、どうしても実際の動きと逆な気がしてなりません。 私の勘違いでしょうか。 【質問2】マクロの自動記録時に気づいたのですが、Orientation の設定に、xlLeftToRight や、xlTopToBottom というのが使われていました。 これらと xlSortRows, xlSortColumns の違いはありますか。 【質問3】列方向への並び替えの際には、Headerの設定をするのは無意味ですか? 上記(丙)のパターンで、xlGuess でも、xlYes 、xlNo でも全く動きは変わらず、月の見出し列が最右に移動しました。 【質問4】上の(丙)のパターンで正しく動かす為には、Sort の対象となる範囲を、B列以降にする必要があるのでしょうか。 ---------------------------------------------------------------------------- 分かりにくい箇所もあったかと思いますが、ご指摘いただければ補足させていただきます。 なお、「そんな簡単な表だったら、手で作業したら?」ということではなく、後学のために知っておきたいので質問させていただきました。 なにぶん勉強中なため見当外れの質問もあるかもしれませんが、なにとぞご教示よろしくお願いいたします。

  • Excel2007のフィルタ

    職場のPCで、あるPCは可視セルのみをコピーし、あるPCは非表示セルまでコピーをしてしまうのです。(全てExcel2007です。) http://office.microsoft.com/ja-jp/excel/HA102448971041.aspx?pid=CH100648341041 上記URLによると「すべてのセルをコピーするか、可視セルのみをコピーするかを選択できます。」とあるのですが、その方法が分かりません。 ご存知の方、お教え下さい。

  • Excel2002で右と左に違う軸の数値でグラフを出すことができますか

    Excel2002で右と左に違う軸の数値でグラフを出すことができますか? Microsoft Office Excel 2002です。 Excel2002でY/数値軸目盛にラインを入れることはできます。 どうすれば 右と左に違う軸の数値でグラフを出すことができますか? 相関関係がある指標と実際の価格を出して比較するようなときに使いたいのです。 または、いつのバージョンのExcelなら右と左に違う軸の数値でグラフを出すことができますか? http://office.microsoft.com/ja-jp/excel-help/HA001034643.aspx?CTT=1

  • セル結合されていないのに結合のメッセージが出る

    エクセル2010を使っております。 ある表を五十音順に並び替えようと思っているのですが、「この操作には、 同じサイズのセル結合が必要です。」とのメッセージが出てしまいます。 しかし、結合セルをhttp://office.microsoft.com/ja-jp/excel-help/HP010342686.aspx#BMfindmergedcells に記載されたとおりに検索しても見つかりません。 (並び替えようとしている範囲内を目で探しても結合セルは見つかりません) どうすれば、並び替えができるようになるのでしょうか? よろしくお願いします。

  • mos word2007でドキュメント検査

    MOS試験 word2007の試験を受けたいのですが、ドキュメント検査の問題で、メタデータというのがはっきりと分からず、マイクロソフト社のホームページで調べたところ、二通りの解釈が出てきました。 どちらで判断したらいいのか分からず、悩んでいます。どなたか教えてください。 メタデータを情報、プロパティ、隠し文字、コメントなどを言うというホームページが http://support.microsoft.com/kb/223396/ja 情報、プロパティという解釈のホームページが http://office.microsoft.com/ja-jp/excel-help/HA010037593.aspx です。よろしくお願いします。

専門家に質問してみよう