Excelデータの抽出並べ替え方法と注意点

このQ&Aのポイント
  • Excelデータの抽出や並べ替え方法についてのアドバイスをお願いします。
  • Excelデータを一覧で表示する方法や、別シートへのデータ抽出方法について教えてください。
  • Sheet1からデータを抽出し、Sheet4やSheet5に並べ替える方法や注意点を教えてください。
回答を見る
  • ベストアンサー

Excelデータの抽出 並べ替えについて

Excelで、登録や契約日等を入れているのですが、一覧で見れるようで気無いか、苦心中です。 すいませんが、アドバイスをお願いします。 こんな事が出来ないかと思っています。 Excel5枚のシートを使います。 Sheet1 ココには、登録日・解約日を記していきます。    A  B     C       D      E  1 No. 氏名 登録・解約  登録日   解約日    2  1 AB  登録     1996/9/16 3 2 CD 登録     1996/9/17 4 3 EF 解約 1996/9/18 2010/11/27 Sheet2 には、契約日及び契約終了日を入れていきます。    A  B     C       D       1 No. 氏名 契約日   契約終了日   2  1 AB  2010/11/10 2011/11/9 3 2 CD 2010/11/11 2011/11/10 4 3 EF 2010/11/12 2011/11/11 Sheet3 には、証明書期限を入れていきます。    A  B     C              1 No. 氏名 証期限  2  1 AB  2010/11/21 3 2 CD 2010/11/22 4 3 EF 2010/11/23 この、上記3枚シートから、2枚のシートにデータを抽出並べ替えたいのです。 Sheet4 ここには、登録日順に顧客を表示し、横に、Sheet2,Sheet3にある、契約日・証期限を表示させたいのです。それも、契約日・証期限は、その各シートで、契約が更新される都度に、データが増えていくため、とうぜん、新旧が混在していますが、最新のデータを表示となります。    A  B     C      D        1 No. 氏名 契約日    証期限  2  1 AB  2010/11/19 2010/11/30 3 2 CD 2010/11/20 2010/12/1 4 3 GH 2010/11/22 2010/12/3 ※Sheet1で解約になっている人は表示させません。 Sheet5では、Sheet1で解約になっている人を表示しないのは同様ですが、それ以上に、最新の契約日を基点として、顧客を羅列し、最新の証期限を表示したいのです。    A  B     C      D        1 No. 氏名 契約日    証期限  2  1 QR  2010/11/27 2010/12/8 3 2 OP 2010/11/26 2010/12/7 4 3 MN 2010/11/25 2010/12/6 大変ややこしい説明で申し訳ないのですが、 宜しくお願いします。  

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

  • ベストアンサー
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

作業列を作って対応します。 シート1のF2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(OR(C2="",C2="解約"),"",D2) シート2のE2セルには次の式を入力し、入力を確定する際にはCtrlキーとShiftキーを押しながらEnterキーを押します。 その後にF2セルの式を下方にオートフィルドラッグします。 =IF(B2="","",IF(C2=MAX(IF(B:B=B2,C:C)),B2,"")) シート3のD2セルには次の式を入力し、入力を確定する際にはCtrlキーとShiftキーを押しながらEnterキーを押します。 =IF(B2="","",IF(C2=MAX(IF(B:B=B2,C:C)),B2,"")) シート4のA2セルには次の式を入力し右横方向にオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(ROW(A1)>COUNT(Sheet1!$F:$F),"",IF(COLUMN(A1)=1,ROW(A1),IF(COLUMN(A1)=2,IF(COUNTIF(Sheet1!$F:$F,SMALL(Sheet1!$F:$F,ROW(A1)))=0,"",INDEX(Sheet1!$B:$B,MATCH(SMALL(Sheet1!$F:$F,ROW(A1)),Sheet1!$F:$F,0))),IF(COLUMN(A1)=3,IF(COUNTIF(Sheet2!$E:$E,$B2)=0,"",INDEX(Sheet2!$C:$C,MATCH($B2,Sheet2!$E:$E,0))),IF(COLUMN(A1)=4,IF(COUNTIF(Sheet3!$D:$D,$B2)=0,"",INDEX(Sheet3!$C:$C,MATCH($B2,Sheet3!$D:$D,0))),""))))) シート5のA2セルには次の式を入力し右横方向にオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(ROW(A1)>MAX(Sheet4!$A:$A),"",IF(COLUMN(A1)=1,ROW(A1),IF(COLUMN(A1)=2,INDEX(Sheet4!$B:$B,MATCH(LARGE(Sheet4!$C:$C,ROW(A1)),Sheet4!$C:$C,0)),IF(COLUMN(A1)=3,INDEX(Sheet4!$C:$C,MATCH($B2,Sheet4!$B:$B,0)),IF(COLUMN(A1)=4,INDEX(Sheet4!$D:$D,MATCH($B2,Sheet4!$B:$B,0)),""))))) なお、シート4や5のセルではセルに日付がシリアル数で表示されますのでセルの書式設定で日付にします。

aoidisk
質問者

お礼

有り難う御座います。 大変助かりました。読み取っていくと大変面白かったです。

その他の回答 (4)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.5

ANo3です。 Sheet5は契約日は降順でしたね、修正です。 Sub test02() Dim myDic As Object Set myDic = CreateObject("Scripting.Dictionary") Dim myN, myN2 With Sheets("Sheet1") myN = .Range("B2", .Cells(Rows.Count, "C").End(xlUp)).Value End With For i = 1 To UBound(myN) If Not myDic.Exists(myN(i, 1)) Then If myN(i, 2) <> "解約" Then myDic.Add myN(i, 1), "" End If Else '既出なら If myN(i, 2) = "解約" Then myDic.Remove (myN(i, 1)) End If End If Next i With Sheets("Sheet4") .Range("A2", .Cells(Rows.Count, "D")).ClearContents .Range("B2").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.keys) .Range("B2").Resize(myDic.Count, 1).Offset(, -1).Formula = "=ROW()-1" .Range("B2").Resize(myDic.Count, 1).Offset(, -1).Copy .Range("B2").Resize(myDic.Count, 1).Offset(, -1).PasteSpecial xlPasteValues Application.CutCopyMode = False End With With Sheets("Sheet2") myN2 = .Range("B2", .Cells(Rows.Count, "C").End(xlUp)).Value End With For i = 1 To UBound(myN2) If myDic.Exists(myN2(i, 1)) Then myDic(myN2(i, 1)) = myN2(i, 2) End If Next i Sheets("Sheet4").Range("C2").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.items) With Sheets("Sheet3") myN3 = .Range("B2", .Cells(Rows.Count, "C").End(xlUp)).Value End With For i = 1 To UBound(myN3) If myDic.Exists(myN3(i, 1)) Then myDic(myN3(i, 1)) = myN3(i, 2) End If Next i Sheets("Sheet4").Range("D2").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.items) Sheets("Sheet4").Columns("A:D").Copy With Sheets("Sheet5") .Columns("A:D").PasteSpecial Application.CutCopyMode = False .Range("B2:D" & myDic.Count + 1).Sort Key1:=.Range("C2"), Order1:=xlDescending, Header:=xlNo, Orientation:=xlTopToBottom End With End Sub

aoidisk
質問者

お礼

有り難う御座います。 まずは関数でと考えていますが、この方法の方が、誤入力もなさそうなので、考えてみます。 助かりました。

回答No.4

考え方を理解してほしいので、同一シート内で説明するとする F1セル0 F2セル 解約の除去のための作業列 =(C2<>"解約")+F1 下へオートフィル E7セル 不要な計算の除去、契約日、または、過去に契約がある場合はその何日後かを出す =IF(INDEX($C$2:$C$4,MATCH(B7,$B$2:$B$4,0))="解約","", IF(ISNA(MATCH(B7,$B$6:B6,0)),C7, MAX(0,C7-SUMIF($B$6:B6,B7,$E$6:E6)))) 下へオートフィル E15セルも同様、 不要な計算の除去、証期限 B21セル 解約者以外の氏名表示 =IF(ISNA(MATCH(A21,$F$2:$F$4,0)),"",INDEX($B$2:$B$4,MATCH(A21,$F$2:$F$4,0))) オートフィル C21 最新の契約日 =IF(B21="","",SUMIF($B$7:$B$12,B21,$E$7:$E$12)) D21 最新の証期限 =IF(B21="","",SUMIF($B$15:$B$18,B21,$E$15:$E$18)) C21:D21下へオートフィル E21セル 同様の考え方で重複のない番号でSheet5への作業列、 =IF(B21="","",RANK(C21,$C$21:$C$23)+COUNTIF($C$20:C20,C21)) 下へオートフィル Sheet5は作成してません。添付図参照。

aoidisk
質問者

お礼

なるほどと思いました。 他の方も何人か触るので、どうしたものかなと思っていましたが、 この方法だと、万が一の時も修正しやすそうですね。 有り難うございます。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

VBAでの方法です。 以下の手順をお試しください。 1.Altキー+F11キー 2.画面上部のメニューバーから挿入、標準モジュールで、出てきた右側の白い広い部分に以下をコピペ '***ここから下をコピペ*** Sub test01()   Dim myDic As Object   Set myDic = CreateObject("Scripting.Dictionary")   Dim myN, myN2   With Sheets("Sheet1")     myN = .Range("B2", .Cells(Rows.Count, "C").End(xlUp)).Value   End With   For i = 1 To UBound(myN)     If Not myDic.Exists(myN(i, 1)) Then       If myN(i, 2) <> "解約" Then         myDic.Add myN(i, 1), ""       End If     Else '既出なら       If myN(i, 2) = "解約" Then         myDic.Remove (myN(i, 1))       End If     End If   Next i   With Sheets("Sheet4")     .Range("A2", .Cells(Rows.Count, "D")).ClearContents     .Range("B2").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.keys)     .Range("B2").Resize(myDic.Count, 1).Offset(, -1).Formula = "=ROW()-1"     .Range("B2").Resize(myDic.Count, 1).Offset(, -1).Copy     .Range("B2").Resize(myDic.Count, 1).Offset(, -1).PasteSpecial xlPasteValues     Application.CutCopyMode = False   End With   With Sheets("Sheet2")     myN2 = .Range("B2", .Cells(Rows.Count, "C").End(xlUp)).Value   End With   For i = 1 To UBound(myN2)     If myDic.Exists(myN2(i, 1)) Then       myDic(myN2(i, 1)) = myN2(i, 2)     End If   Next i   Sheets("Sheet4").Range("C2").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.items)   With Sheets("Sheet3")     myN3 = .Range("B2", .Cells(Rows.Count, "C").End(xlUp)).Value   End With   For i = 1 To UBound(myN3)     If myDic.Exists(myN3(i, 1)) Then       myDic(myN3(i, 1)) = myN3(i, 2)     End If   Next i   Sheets("Sheet4").Range("D2").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.items)   Sheets("Sheet4").Columns("A:D").Copy   With Sheets("Sheet5")     .Columns("A:D").PasteSpecial     Application.CutCopyMode = False     .Range("B2:D" & myDic.Count + 1).Sort Key1:=.Range("C2"), Order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom   End With End Sub '***ここより上までをコピペ*** 3.Alt+F11キーでワークシートへ。 4. Alt+F8キー 5. test01を選択し実行ボタンをクリック

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

例えば、Sheet4に以下のような数式を入力して下方向にオートフィルしてください。 B2セル(名前表示セル) =INDEX(Sheet1!B:B,SMALL(INDEX((Sheet1!$E$2:$E$1000<>"")*10000+ROW($E$2:$E$1000),),ROW(B1)))&"" A1セル(連番表示セル) =IF(B2="","",ROW(A1)) C2セル(最新の契約日表示セル) =IF(B2="","",INDEX(Sheet2!C:C,MAX(INDEX((Sheet2!$B$2:$B$1000=B2)*ROW($C$2:$C$1000),)))) D2セル(最新の証期限入力セル) =IF(B2="","",INDEX(Sheet3!C:C,MAX(INDEX((Sheet3!$B$2:$B$1000=B2)*ROW($C$2:$C$1000),)))) >それ以上に、最新の契約日を基点として、顧客を羅列し、最新の証期限を表示したいのです。 Sheet5の表示内容の意味(Sheet4との違い)が良くわかりません。 表示データ数が多い場合は、数式で対応するとシートの動きが重くなるので、あまりお勧めできませんが、上記の数式を参考にして、ご自分で数式を組んでみて、もしうまくできないようでしたら、ご希望の集計方法を補足説明してください。

関連するQ&A

  • Excelで抽出

    初めまして。よろしくお願いします。 Excel2000を使っています。 例えば、 A列     B列   C列   D列 お客様番号  氏名   契約日  生年月日  :      :    :    : という表があるとし、データは2000件ほどあると 思ってください。 1行目から最終行までみて、 『同一氏名』&『同一契約日』&『同一生年月日』の ものを違うシートに表示させたいのですが、 こういうことってExcelで出来るのですか? 出来るのであれば是非教えてください。 質問するのは初めてなので お手柔らかに・・・m(__)m

  • エクセルでこんなジャンプ出来ますか

    Sheet2    A     B   C  D    E   F   G     H 3  no.   氏名     no.   氏名     no.   氏名 4 100001 山本A   102001        104001 伊藤F 5 100002        102002 佐藤D   104002  6 100003 鈴木B   102003        104003 中村G 7 100004 高橋C   102004 山田E   104004 :   :    :       :     :       :     : Sheet1    A     B    C   3  no.   氏名  回数   4 104003 中村G   3 5 100004 高橋C   5 6 102003 :   :    :    : Sheet2の表を基にSheet1のような表を作成したい。 Sheet2には約2万件の番号が登録されています。 Sheet1のA列のno.は番号順に入力されるわけではない。 Sheet1のA列にno.を入力するとSheet2より該当の氏名をB列に表示、 該当氏名が空白の場合は、Sheet2の該当セルにジャンプし、氏名入力後Sheet1のC列にジャンプして戻る。 また、Sheet2において例えば、B1に104001を入力するとH4にジャンプしEnterを押すとB1に戻り、100002を入力するとB5にジャンプ氏名入力後Enterを押しB1に戻る。・・・ということもしたいのですがマクロではなく関数で出来るでしょうか?

  • Excelにおけるデーター抽出

    Excelのシートに記載されている内容は次の通りです。 (1) セルA5~A60の間に1~56の昇順の番号 (2) セルB5~B60には氏名 (3) セルC5~C60には○、×、△の記号 このシートからC列が ○ の記号が付与されている者だけの氏名を別のシートのB7~B**の間に抽出するのですが、抽出したシートの行に空白ができないようにするには式をExcel関数で作成することは可能でしょうか? 若し、不可能でしたらマクロで行う場合のプログラムを教えて下さい。

  • Excel 別ファイルからのデータ抽出

    OfficeXP-Excelにて質問させて頂きます。 以下のような異なるファイルが2つあります。 ------------------- [ファイルA]     A         B     C     D     E     F    G 1    No.           1            2           3 2    氏名         山田         田中        佐藤 3             送付日 受領日  送付日 受領日 送付日 受領日 4   2007年04月分   4/2  4/27   4/3  4/26   4/2  4/25 5   2007年05月分   5/1  5/30   5/1  5/31   5/2  5/30                   ・                                     ・                   ・ (1行目・2行目のB:C、D:E、F:Gは結合されています。) ------------------- [ファイルB-シート2007/5]     A     B     C     D 1   2007年05月分 2     ←空白行 3   No.    氏名  送付日  受領日 4   1    山田 5   2    田中 6   3    佐藤                   ・                                     ・                   ・ ------------------- [ファイルA]のA4以降の『2007年**月分』のデータ『送付日』と『受領日』を [ファイルB]のセル[A1(2007年**月分)]と『No.』が一致する『送付日(C4~)』『受領日(D4~)』に 関数などを用いて抽出したいのです。 1年分のデータを1つの表にまとめて格納している[ファイルA]に対し[ファイルB]は各月のデータをシート毎に分けてあります。 [ファイルB]で元になるシートを作成しておき、毎月その元シートをコピーし[A1]の日付だけを変更すれば自動的に必要なデータを引っ張ってくるように出来ますでしょうか? 説明が解り辛ければ補足致しますので、何卒ご教示宜しくお願いします。

  • エクセルの並べ替えについて

    A列に個人コード、B列に氏名、C列に4月分の日数といった表がSheet1にあります。sheet2にはA列に個人コード、B列に氏名、C列に5月分の日数の表があります。表にでてくる人は同じなのですが順番がバラバラです。sheet1に並んである氏名の順番にsheet2も並び替えをしひとつの表にしたい場合どうすればいいでしょうか??かなり困っています。アドバイスよろしくお願いします。

  • エクセル データの並べ替え

    エクセルでシート内にデータを入力しています。 A列に氏名が入力されており、B列は空欄でC列に花の名前が入っています。(氏名と花の名前は各自決まっております。) A列を”並べ替え”を使って五十音に並べたときに、自動的にC列の花の名前も連動して並べ替えしたいのですが、そういう操作は可能なのでしょうか? よろしくお願い致します。

  • エクセルのデータ並べ替えについて教えてください。

    いつもお世話になっています。 エクセルシートで、 A1 B1 あ  い う   え お  か と入力されているのを、 A1 あ い う え お か という風に、AB交互で1列にするには、どうしたらよいでしょうか?

  • エクセルでデータから文字を抽出には?

    仕事で非常に困っています。補足は月曜日にさせていただきます。 シート1に下記のデータがあり、シート2にシート1のデータをもってきたいのです。 シート2の数字は自動で別シートからリンクさせてあります。 シート2の数字の横にシート1のデータと一致する文字を表示させたいです。 シート1      A     B     C ・ ・ L  1    1    0     0     0 あ 2    1    1     0     0 い 3    1    1     1     0 う ・ ・ 3000 Aは1から30まで、Bは1から50までCからLは3桁台まであります。 シート2    A  B  C  D   E  F ・・・・ 1  1 あ  1  い  1  う         2 3 ・ ・

  • EXCEL VBA データの並べ替え

    EXCEL VBAを利用して、【Sheet1】を【Sheet2】へ並べ替えるようにしたいのですが、可能でしょうか? 【Sheet2】について、「No.」と「ファイル名」の並べ方は決まっています。 コードウィンドウ(VBAの文法)で「No.=ファイル名」を定義したい。 例えば、「1=EFGH」、「2= 」、「3=ABCD」、「90=IJKL」のように。 説明がわかりづらいかもしれませんが、ご不明がありましたらご連絡下さい。 よろしくお願いいたします。 ★イメージ★ 【Sheet1】※データ受信(元データ)       A   │ B │ C │ D  (列)    ┌─────┼───┼───┼───   1│ファイル名│会社名│部署名│件数    ├─────┼───┼───┼───   2│ABCD │A社 │S部 │12345   3│EFGH │B社 │T部 │23456   4│IJKL │C社 │U部 │34567   :│  :   │ : │ : │ :   91│MNOP │Z社 │Y部 │99999   (行)  【Sheet2】※並べ替えた後  ⇒  A│  B  │ C │ D │ H  (列)    ┌─┼─────┼───┼───┼───   1│No│ファイル名│会社名│部署名│件数    ├─┼─────┼───┼───┼───   2│1│EFGH │B社 │T部 │23456   3│2│     │   │   │   ←ブランク   4│3│ABCD │A社 │S部 │12345   :│:│  :   │ : │ : │ :   91│90│IJKL │C社 │U部 │34567   (行)      └───────┬────────┘             マクロ実行で表示される。

  • エクセルの同一ファイル内での検索

    行き詰ってます。 例えば・・・ シート1 A  B   C 1 No. 氏名 支給月 ・・・ 2 ↓ シート2・・・ A  B 1 No. 氏名 2 ↓ 上記のように、シート2には支給月により、No.と氏名のみ表示したいのです。 条件は、支給月が毎月ではないので、C~Nを4月から翌年3月とし、支払月に○を入力します。 シート2以降、シート13までを4月から翌年3月にしたい場合に、シート2以降はどのような組み方が可能でしょうか? 説明下手ですみませんがご教示願います。

専門家に質問してみよう