アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (7件)

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

    • good
    • 0

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
    • good
    • 0

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

並べ替えに振り仮名を使っています。
振り仮名は機械的に取得されたものです。
正しいかどうか確認を要します。
特に人名・地名は独特な読み方がされるので難しいです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

実行時エラー1004

となってしまいます。

お礼日時:2010/04/07 23:08

こんばんは!


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
「エクセル 複数列選択して一列にソートでき」の回答画像4
    • good
    • 0

こんばんは!


参考になるかどうか判りませんが・・・
無理矢理って感じの方法です。

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
「エクセル 複数列選択して一列にソートでき」の回答画像3
    • good
    • 0
この回答へのお礼

ありがとうございます。

A1~G10セルには名前が入っていますが
名前は値ではなくてリンク先のセル番号が入っています。


Sheet1のI1セルに
=PHONETIC(A1)
として列方向と行方向にデータと同じ列・行数ほどオートフィルでコピーします。

名前のふりがなは出ませんでした。出す方法はありますか?

お礼日時:2010/04/06 00:22

数字のみなら


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

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

お礼日時:2010/04/05 20:57

できません!



最初にソートしたいデータを1列にしなければなりません。

>A1~G10
7列程度なら「手作業」でも実用的な範囲だと思います。
ご質問の内容は「例」で、実際には「列数が多い」「行数が変わる」というならば、マクロ(VBA)をお勧めします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/05 20:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!