Excelで、


[佐藤] | [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] | [×]

のように並べかえたいのですが、
良いやり方がありましたらご教授ください。よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2007/07/10 21:00:38
  • 終了:2007/07/10 23:43:37

ベストアンサー

id:zuguimo No.4

zuguimo回答回数19ベストアンサー獲得回数32007/07/10 22:32:48

ポイント400pt

D列、E列が自由に使えるという前提でC列には○または×だけで

余分なスペースが入っていない条件で答えます。

D列 =IF(C1="○",1,0)

E列 =SUMIF(A:A,A2,D:D)

これを1行目に入れて下までコピーします。

あとはA列からE列までE列を基準に降順に並べ替えをすれば

とりあえず可能です。

(D列には○なら1、×なら0を入力し、E列でA列の名前の○の数を

数えています。)

その他の回答(3件)

id:maeda No.1

maeda回答回数8ベストアンサー獲得回数12007/07/10 21:32:27

ポイント30pt

VBAでやればできますが。名前のセルの【】の中をmid関数で

文字を抽出します。 文字がそろっているものの中で、右端の【】の中身をmid 関数で読み込みます。 一つでも○のあるものを選択して、並べて行けばいいですよね。

 VBA とか mid 関数はお分かりですか。

id:Solais

回答ありがとうございます。

すみません、VBA・mid 関数・マクロ等まったくわかりません。

よろしければ書式も教えていただければありがたいです。

2007/07/10 21:36:00
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912007/07/10 22:13:44

ポイント400pt

マクロを使った例です。


処理シートのシートタブを右クリック、コードの表示を選択し、

表示されたウィンドウに下記のコードをコピーしてから、

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
id:phantazy No.3

phantazy回答回数4ベストアンサー獲得回数02007/07/10 22:24:50

ポイント400pt

・左から、列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)の式を変えてください。

id:zuguimo No.4

zuguimo回答回数19ベストアンサー獲得回数32007/07/10 22:32:48ここでベストアンサー

ポイント400pt

D列、E列が自由に使えるという前提でC列には○または×だけで

余分なスペースが入っていない条件で答えます。

D列 =IF(C1="○",1,0)

E列 =SUMIF(A:A,A2,D:D)

これを1行目に入れて下までコピーします。

あとはA列からE列までE列を基準に降順に並べ替えをすれば

とりあえず可能です。

(D列には○なら1、×なら0を入力し、E列でA列の名前の○の数を

数えています。)

  • id:Solais
    データについて
    データ数10000件以上。
    横の列数は同じですが、それぞれの名前ごとの行数は同じではありません。
    また「名前」等の位置順は維持しなくてもかまいません。
    1件でも条件に合う名前のデータのみを抽出したい、
    1件も該当しない名前のデータを除去したいのが目的です。
  • id:zuguimo
    どんな条件なのでしょうか?
    もしかしたら[データ]から[フィルター]を使って
    *を使って抽出した方が簡単なんではないでしょうか?
    どんな条件かもう少し詳しくお願いします。
  • id:Solais
    一番右側の[○]が条件に合致すると考えてください。

    1件でも[○]がある名前のデータに関しては、

    [鈴木] | [N4] | [○]
    [鈴木] | [O5] | [×]
    [鈴木] | [P6] | [×]

    のように全部抽出したい。

    1件も[○]のないデータ

    [佐藤] | [A1] | [×]
    [佐藤] | [B2] | [×]
    [佐藤] | [C3] | [×]
    [佐藤] | [D4] | [×]

    に関しては、排除したい。
    (完全に削除ではなく、別々に分けたい)

    データの並び替えでは[○]のある名前と[×]が同居するため、うまくいきません。よろしくお願いします。
  • id:fuentebella
    エクセルでやろうとすると、パズルかVBAの力技の世界になりそうです。アクセスに取り込めば、一瞬でできると思いますが。。。

    名前一人あたりの最大行数は決まっていますか??
  • id:rikuzai
    あら、終わってしまった。
    せっかく書いたのでこちらに。
    処理後別のシートに分ける方法です。

    http://q.hatena.ne.jp/1183995788
    ↑での回答と途中までは同じです。


    名前がA列、
    教科がB列、
    条件がC列、
    にそれぞれ入っているとして、
    D1=A1&C1
    E1=COUNTIF(A:A,A1)-COUNTIF(D:D,A1&"×")
    と入力し、該当行までコピーします。
    D、E列を選択し、コピー、そのまま右クリック「形式を選択して貼り付け」で値貼り付けをします。


    この後、まず、1行目に1行空の行を挿入します。
    (1行目を行選択し、右クリック「挿入」でOK)
    挿入された行が反転したままの状態で、
    ツールバー「データ」→「フィルタ」→「オートフィルタ」をクリックします。
    すると、1行目の各列に▼のプルダウンがつきます。


    E列の▼をクリックして、「オプション」
    抽出条件を「0」「と等しい」にしてOK。
    これで条件が一つも該当していない名前のデータだけが抽出されます。


    この表示されたデータを行選択してコピー。
    わけておきたい別シートを選択して貼り付け。
    これで該当しないデータがわけられます。


    元のデータシートから該当外のデータを削除するならば、
    フィルタをかけた状態のまま、反転したセルの上で右クリック「行の削除」でデータは削除されます。
    後はE列の▼をクリックし、「すべて」をクリック。
    該当データが再表示されるので、1行目の空行を削除したら完了です。
  • id:Solais
    皆様ご回答ありがとうございました。

    おかげさまで解決しました。大変助かりました。
    ありがとうございます。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません