• ベストアンサー

エクセル 複数列選択して一列にソートできますか?

エクセル 複数列選択して一列にソートできますか? sheet1 A1~G10 のセルに文字列(名前)がランダムに入力されているとします。空白もあります。このデータは他ファイルからコピーしたものとします。これをsheet2のA列にソートすることはできますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.7

Sheet1のA1:G10に数式が入っているのなら、回答番号:No.6のコードで試してください。

その他の回答 (6)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.6

Sheet1のA1:G10に、セル参照式ということなら下記で試してください。 Sheet2で、値に置換しています。 Dim rng1 As Range Dim rng2 As Range Dim c As Range Dim i As Long Dim j As Long Set rng1 = Sheets("Sheet1").Range("A1:G10") Set rng2 = Sheets("Sheet2").Range("A1") For i = 1 To rng1.Columns.Count With rng1.Columns(i) rng2.Offset(j).Resize(.Cells.Count).Value = .Value j = j + .Cells.Count End With Next i Set rng2 = rng2.Resize(j) For Each c In rng2 If c.Value <> "" Then c.Offset(, 1).Value = Application.GetPhonetic(c.Value) End If Next Set rng2 = rng2.Resize(, 2) rng2.Sort _ Key1:=rng2(1, 2), Order1:=xlAscending, Header:=xlNo, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.5

VBAの例です。 試してみてください。 Dim rng As Range Dim c As Range Dim i As Long Dim j As Long Set rng = Sheets("Sheet1").Range("A1:G10") For i = 1 To rng.Columns.Count With rng.Columns(i).SpecialCells(xlCellTypeConstants) .Copy Sheets("Sheet2").Range("A1").Offset(j) j = j + .Cells.Count End With Next i Set rng = Sheets("Sheet2").Range("A1", Range("A1").End(xlDown)) For Each c In rng c.Offset(, 1).Value = Application.GetPhonetic(c.Value) Next Set rng = Sheets("Sheet2").Range("A1", Range("A1").End(xlDown)).Resize(, 2) rng.Sort _ Key1:=rng(1, 2), Order1:=xlAscending, Header:=xlNo, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal 並べ替えに振り仮名を使っています。 振り仮名は機械的に取得されたものです。 正しいかどうか確認を要します。 特に人名・地名は独特な読み方がされるので難しいです。

noname#150307
質問者

お礼

ありがとうございます。 実行時エラー1004 となってしまいます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんばんは! No.3です! 再びお邪魔します。 A1~G10セルは直接入力ではなく、外部データということになるわけですね? その場合はふりがな情報は欠落しているはずですので、 PHONETIC関数を使っても何も表示されないと思います。 やはりVBAで対応するしかないようですね! 簡単なVBAを載せておきますので、VBEの標準モジュールにコピー&ペーストして マクロを実行してみてください。 そうすると↓の画像のようにヨミが表示されると思います。 尚、この場合は空白セルには数式が入っていませんので、 Q1セルの数式は =IF(I1="","",COUNTIF($I$1:$O$10,"<"&I1)+COUNTIF($I$1:I1,I1)) でOKかと思います。 (画像のA1~G10セルはSheet3から引っぱって来ています) A1~G10セルを範囲指定し、以下のマクロを実行してみてください。 Sub test() Dim c As Range For Each c In Selection If c = "" Then c.Offset(, 8) = "" Else c.Offset(, 8).Value = Application.GetPhonetic(c) End If Next c End Sub 今度はお役に立てば良いのですが・・・m(__)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! 参考になるかどうか判りませんが・・・ 無理矢理って感じの方法です。 A1~G10セルには名前が入っているということですので、 単純に昇順にしてしまうと音読みの順になるのではないでしょうか? (間違っていたらごめんなさい。) そこで↓の画像のように作業用の列(表)を使ってヨミを表示させています。 (画像が小さくて見にくいかもしれません) Sheet1のI1セルに =PHONETIC(A1) として列方向と行方向にデータと同じ列・行数ほどオートフィルでコピーします。 そして、もう一つの作業用の表のQ1セルに =IF(I1="","",COUNTIF($I$1:$O$10,"<"&I1)+COUNTIF($I$1:I1,I1)-COUNTIF($I$1:$O$10,"<>"&"?*")) という数式を入れこれも列方向と行方向にコピーします。 これで元データの昇順の順位が表示されます。 この数値を元にSheet2に表示させるようにします。 Sheet2のA1セルに =IF(COUNT(Sheet1!$Q$1:$W$10)<ROW(A1),"",INDEX(Sheet1!$A$1:$G$10,MAX(INDEX((Sheet1!$Q$1:$W$10=ROW(A1))*ROW($A$1:$A$10),)),MAX(INDEX((Sheet1!$Q$1:$W$10=ROW(A1))*COLUMN(Sheet1!$A$1:$G$1),)))) という数式を入れ、オートフィルで下へずぃ~~~!っとコピーすると 画像のような感じになります。 以上、かなり手間がかかりますが 参考になれば幸いです。 他に良い方法があれば読み流してくださいね。m(__)m

noname#150307
質問者

お礼

ありがとうございます。 A1~G10セルには名前が入っていますが 名前は値ではなくてリンク先のセル番号が入っています。 で Sheet1のI1セルに =PHONETIC(A1) として列方向と行方向にデータと同じ列・行数ほどオートフィルでコピーします。 名前のふりがなは出ませんでした。出す方法はありますか?

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.2

数字のみなら Sheet2!A1=IF(ISERROR(SMALL(Sheet1!$A$1:$G$10,ROW())),"",SMALL(Sheet1!$A$1:$G$10,ROW())) をA70までコピーで出来ます。 文字を含む場合はVBAを利用すれば可能ですが、数式ではむずかしいですね。

noname#150307
質問者

お礼

ありがとうございます。 文字なんです…。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.1

できません! 最初にソートしたいデータを1列にしなければなりません。 >A1~G10 7列程度なら「手作業」でも実用的な範囲だと思います。 ご質問の内容は「例」で、実際には「列数が多い」「行数が変わる」というならば、マクロ(VBA)をお勧めします。

noname#150307
質問者

お礼

ありがとうございます。 実際の範囲は、はるかに大きく手作業では無理です。

関連するQ&A

専門家に質問してみよう