[佐藤] | [A1] | [×]
[佐藤] | [B2] | [×]
[佐藤] | [C3] | [×]
[佐藤] | [D4] | [×]
[山田] | [E5] | [○]
[山田] | [F6] | [×]
[田中] | [G7] | [○]
[田中] | [H8] | [○]
[田中] | [I9] | [○]
[田中] | [J0] | [○]
[田中] | [K1] | [×]
[木村] | [L2] | [×]
[木村] | [M3] | [×]
[鈴木] | [N4] | [○]
[鈴木] | [O5] | [×]
[鈴木] | [P6] | [×]
のようになっているファイル(実際のデータ数10000件以上)で、
条件に1件でも該当する名前を上部に、
[山田] | [E5] | [○]
[山田] | [F6] | [×]
[田中] | [G7] | [○]
[田中] | [H8] | [○]
[田中] | [I9] | [○]
[田中] | [J0] | [○]
[田中] | [K1] | [×]
[鈴木] | [N4] | [○]
[鈴木] | [O5] | [×]
[鈴木] | [P6] | [×]
[佐藤] | [A1] | [×]
[佐藤] | [B2] | [×]
[佐藤] | [C3] | [×]
[佐藤] | [D4] | [×]
[木村] | [L2] | [×]
[木村] | [M3] | [×]
のように並べかえたいのですが、
良いやり方がありましたらご教授ください。よろしくお願いします。
D列、E列が自由に使えるという前提でC列には○または×だけで
余分なスペースが入っていない条件で答えます。
D列 =IF(C1="○",1,0)
E列 =SUMIF(A:A,A2,D:D)
これを1行目に入れて下までコピーします。
あとはA列からE列までE列を基準に降順に並べ替えをすれば
とりあえず可能です。
(D列には○なら1、×なら0を入力し、E列でA列の名前の○の数を
数えています。)
VBAでやればできますが。名前のセルの【】の中をmid関数で
文字を抽出します。 文字がそろっているものの中で、右端の【】の中身をmid 関数で読み込みます。 一つでも○のあるものを選択して、並べて行けばいいですよね。
VBA とか mid 関数はお分かりですか。
マクロを使った例です。
処理シートのシートタブを右クリック、コードの表示を選択し、
表示されたウィンドウに下記のコードをコピーしてから、
EXCEL で Alt+F8を押して、MySort を実行してみてください。
Sub MySort() '// アクティブシートを処理 Dim srcWS As Worksheet Set srcWS = ActiveSheet '// 作業シートを作成 Dim dstWS As Worksheet srcWS.Copy before:=srcWS Set dstWS = Worksheets(srcWS.Index - 1) Dim lastRow As Long lastRow = Range("A" & Rows.Count).End(xlUp).Row '// 名前順でソート dstWS.Columns("A:C").Sort Key1:=dstWS.Range("A1"), Order1:=xlDescending, Header:=xlGuess '// 同じ名前に一つでも丸があれば、全てに1を設定 Dim ar ar = Range("A1:D" & lastRow + 1) Dim nn As String Dim flg As Boolean Dim ns As Long Dim i As Long ns = 1 For i = 1 To lastRow + 1 If nn <> ar(i, 1) Then If flg = True Then For j = ns To i - 1 ar(j, 4) = 1 Next Else For j = ns To i - 1 ar(j, 4) = 0 Next End If flg = False nn = ar(i, 1) ns = i End If If ar(i, 3) = "○" Then flg = True End If Next '// 作業シートで作業列でソート dstWS.Range("A1:D" & lastRow) = ar dstWS.Columns("A:D").Sort _ Key1:=dstWS.Range("D1"), Order1:=xlDescending, _ Key2:=dstWS.Range("A1"), Order2:=xlAscending, _ Header:=xlGuess '// 作業列を削除 dstWS.Columns("D").Delete End Sub
・左から、列A,B,Cだとします。
・データ数が10000だとします。
(1).セルD1に以下のような式を入力してください。
=A1&C1
(2).セルE1に以下のような式を入力してください。
=IF(COUNTIF(D$1:D$10000,A1&"○")=0,0,1)
(3).D1とE1をすべてのデータ行にコピーしてください。
(4).列E(降順),列Aの優先順位で並べ替えてください。
※データの件数に応じて(2)の式を変えてください。
D列、E列が自由に使えるという前提でC列には○または×だけで
余分なスペースが入っていない条件で答えます。
D列 =IF(C1="○",1,0)
E列 =SUMIF(A:A,A2,D:D)
これを1行目に入れて下までコピーします。
あとはA列からE列までE列を基準に降順に並べ替えをすれば
とりあえず可能です。
(D列には○なら1、×なら0を入力し、E列でA列の名前の○の数を
数えています。)
回答ありがとうございます。
すみません、VBA・mid 関数・マクロ等まったくわかりません。
よろしければ書式も教えていただければありがたいです。