• ベストアンサー

エクセル関数(マクロ) 抽出方法について

列A~Dに職員NO、所属、家族、名前の入っている名簿(左側)を、並び替えをする際に、下記右表のように、家族区分の”1”のみを取り出して、一人一レコードにしたいのですが、何か良い関数とかまたはマクロでの考え方とかをお教えいただければと思います。 (元シート)|(抽出シート) 職員No.|所属|家族|氏名| 職員NO順 120 002 1 B | A 120 002 2 B | B 134 010 1 C | C 134 010 2 C | D 134 010 3 C 152 050 1 D | 所属・職員NO順 152 050 2 D | B 152 050 3 D | C 152 050 4 D | D 152 050 1 D | A 100 200 1 A ※出来ればオートフィルタを使用せずに関数や マクロで対応したいと考えています。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

>もともとひとつの職員番号が家族単位で重複して存在していたものを、ひとつの職員番号で一つの行としたいのです。 これで意味が分かりました。できれば、標準モジュールに貼り付けるのがベストです。なお、家族区分は、抽出されません。また、これは、職員No.順でしか、抽出されません。こちらのマクロは、最初に見つけたものを、抽出する仕組みですから、二重の出力はしません。 Sub Compaction()  Dim Sh1 As Worksheet, Sh2 As Worksheet  Dim Rng As Range, c As Range  Dim RowNo As Variant  Set Sh1 = Sheet1 '元シート  Set Sh2 = Sheet2 '抽出シート  Application.ScreenUpdating = False  With Sh2   .Range("A1").CurrentRegion.ClearContents   Set Rng = Sh1.Range("A1", Sh1.Range("A65536").End(xlUp))   Rng.AdvancedFilter _   Action:=xlFilterCopy, _   CopyToRange:=.Range("A1"), _   Unique:=True   .Range("A1").CurrentRegion.Sort _   Key1:=.Range("A2"), _   Order1:=xlAscending, _   Header:=xlGuess, _   OrderCustom:=1, _   MatchCase:=False, _   Orientation:=xlTopToBottom   '元シートからフィールド行のコピー   Sh1.Range("B1:D1").Copy Sh2.Range("B1")   For Each c In .Range("A2", Range("A65536").End(xlUp))    RowNo = Application.Match(c.Value, Rng, 0)    If Not IsError(RowNo) Then     c.Offset(, 1).Value = Sh1.Cells(RowNo, 2).Value     'c.Offset(, 2).Value = Sh1.Cells(RowNo, 3).Value '家族区分     c.Offset(, 3).Value = Sh1.Cells(RowNo, 4).Value    End If   Next  End With  Application.ScreenUpdating = True End Sub

miyo05
質問者

お礼

ご回答ありがとうございました。 いろいろ対応方法を教えていただき試しましたが、 最終的にマクロでの方法にしました。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

職員NO順 =SQL.REQUEST("DSN=Excel Files;DBQ=抽出.xls",,3,"SELECT DISTINCT 氏名 FROM 抽出.table WHERE 家族=1",TRUE) 所属・職員NO順 =SQL.REQUEST("DSN=Excel Files;DBQ=抽出.xls",,3,"SELECT 氏名 FROM 抽出.table WHERE 家族=1 ORDER BY 所属,職員No.",TRUE) の様にできます。 SQL.REQUESTはアドインをMSからダウンロードしてインストールする必要があります。(SQL.REQUESTのヘルプにサイトへのリンクがあります)この例では、ワークシート上の関数として使用していますが、マクロからも使用できます。 抽出.xlsはブック名 tableは、表の範囲名 後の方は、152 050 1 Dが2つあるので、2つ表示されます。

miyo05
質問者

お礼

ありがとうございます。 試してみようと思ったのですが、私の使っているPCは 2000だったので、ダウンロードできませんでした。 PCを購入したらぜひ試してみようと思います。

  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.2

152-050-1-D が重複していますがこれは2レコードになってもよいのでしょうか? 見出しをのぞくデータはA2:D12にある。 職員Noは000~999の範囲である。 という条件の下で、 E2:E6 に職員No順 E8:E12 に所属、職員No順で氏名をとりだす 下記のセルに式を入れてください。 ただし配列数式として入力するために [enter] ではなく [ctrl]+[shift]+[enter]で決定してください E2: =IF(COUNTIF($C$2:$C$12,1)>=ROW()-1,INDEX(D:D,MOD(SMALL(IF($C$2:$C$12=1,VALUE($A$2:$A$12)*65537+ROW($A$2:$A$12)),ROW()-1),65537)),"") E8: =IF(COUNTIF($C$2:$C$12,1)>=ROW()-7,INDEX(D:D,MOD(SMALL(IF($C$2:$C$12=1,VALUE($B$2:$B$12)*65537*1000+VALUE($A$2:$A$12)*65537+ROW($A$2:$A$12)),ROW()-7),65537)),"") E2、E8のセルを4つずつ下方コピーします やりたいこととあってるといいのですが...

miyo05
質問者

お礼

ありがとうございます。 配列数式というのをはじめて知りまして、試してみたのですが、まだいまいち理解が出来ず断念しました。 もっと知識を深めたいと思います。 またお聞きすることもあるかと思いますが、その際は よろしくお願い致します。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

>家族区分の”1”のみを取り出して、一人一レコード という意味が、どのようになるのか、理解できません。レコードというのは、データベースの1つのまとまりのあるデータのことですが、Excelで、どう扱うのでしょうか? 示された図も、 >(元シート)|(抽出シート) >120 002 1 B | A >職員No.|所属|家族|氏名| 職員NO順 元シートと抽出シートの区切れが、所属と家族の間にあって、シートのデータの構造が見当がつきません。

miyo05
質問者

補足

分かりづらくてすみません。 列A・・・職員NO. 列B・・・所属NO. 列C・・・家族区分 列D・・・氏名 と入っています。行数は5000くらいです。 これを職員NOで並び替えをすると、通常、職員番号順に 並び替えされると思いますが、その際に、家族区分1以外を無視して、並び替えが出来ればと考えています。 結果的に、もともとひとつの職員番号が家族単位で重複して存在していたものを、ひとつの職員番号で一つの行としたいのです。 説明がへたくそですみません。 いかがでしょうか?

関連するQ&A

  • どんな関数を使えばよいか困っています。

    Sheet1に    A    B    C    D 1 所属   係   NO    氏名 2 1    2    1    山本 3 1    2    2    本田 4 2    1    1     川崎 5 1    3    1    小林 6 3    1    1     鈴木 というデータが入っています。このデータをSheet2に飛ばそうとしています。Sheet2に   A       B       C     D 1 1       2       3     氏名選択リスト 2 係NO   係NO     係NO            3 社員NO  社員NO   社員NO 所属番号はあらかじめ入っています。D1の氏名選択リストはSheet1のD列の氏名を入力規則でリストにしています。このリストより検索値(氏名)を選び、この氏名に一致する所属番号の行に自動で係番号、社員番号を表示させたいと思います。 (例) 氏名リストより『鈴木』を選択。      A   B   C   D 1    1   2   3   鈴木 2            1  3            1      どういう関数を使えばよいでしょうか。教えて下さい。

  • エクセル内での、データの複数の抽出は無理でしょうか?

    Sheet1 A B C D 1 こ た い あ 2 き ち ろ か 3 け つ は さ 4 く て に た 5 か と ほ な Sheet2 A B C 1 か と ほな 2 き ち ろか 3 く て にた VLOOKUP関数で Sheet2のA1、A2、A3をSheet1から 同列のB、Cも同じように抽出しようとしましたが C列だけSheet1のC列とD列と合わせた表記にしたいのですが これは関数では無理なのでしょうか? 私自身、あまり関数が得意ではないので もしマクロでなければ・・・となると少し不安です。 宜しくお願いします。

  • 関数:行を挿入すると数値がずれてしまう

    今塾の成績管理表を作成しております。 シートは、名簿シート、◯月(12か月分)シートを用意しています。 ▼名簿シートは A学生番号  Bクラス  C高校名  D氏名 で、生徒は100人くらいです。クラスはA,B,C,Dと4クラスあります。 1~100行くらいに生徒名を登録し、 200~300行でクラス順で学籍番号順になるように、FILTER関数で並び替えをしております。 ▼◯月シートは A学生番号  Bクラス  C高校名  D氏名  E点数 となっており、A~D列はVLOOKUPを使い名簿シートを参照しております。 2月~1月にかけて、各生徒の成績を蓄積していこうと考えております。 ですが、やはり入塾退塾の生徒があるため名簿シートの行を消去したり、追加したりすることがあります。 私の関数の知識では、名簿シートの行を変更すると、◯月シートの方で生徒と点数にずれが生じてしまいます。以下参照 入塾前 A B C D E 001 A 桜高校   渡辺      50 002 A 下北高校  髙橋      37 003 B 能勢高校  柳       80 004 B 南高校   林       10  入塾後(名簿シート追加後) A B C D E 001 A 桜高校   渡辺      50 002 A 下北高校  髙橋      37 005 A 北高校   入塾      80 003 B 能勢高校  柳       10 A列は名簿シートを反映し、B~D列はVLOOKUP関数でA列を参照しているので、ずれることはないのですが、これでは肝心の点数がずれてしまいます。 A~D列の並びが変更されると、E列も一緒に移動するとこが出来るように関数を入れることは可能なのでしょうか? ご存知の方いらっしゃれば、ご教示いただければ幸いです。

  • Excelの関数またはマクロを教えて下さい。

    Exsel2000の関数で、現在以下の関数まで出来たのですが、これを応用して検索値「A1」を2つのセル「A1&B1」にしたいのですが、どうすればよいのでしょうか?どなたか方法を教えて下さい。 =VLOOKUP(A1,Sheet1!$A$1:$E$2000,4) 上記の関数から判るように、これは 例えばSheet2のC1のセルにこの式を入れる場合、A1と同じ内容の値を、Sheet1のA列から検索して、そして同じ行のSheet1のD列の値をSheet2のC1のセルに返すという関数です。 これを応用して、「A1と同じ内容…のA1を、A1&B1の2つが一致するセルを検索して、同じ列のSheet1のD列の値をSheet2のC1のセルに返すという関数にしたいのです。 どなたかおわかりになる方がおりました宜しくお願いいたします。 また、マクロを使う方法でも良いのですが、当方マクロは詳しくないので出来るだけ判りやすくお願いいたします。

  • エクセル 複数条件での抽出

    自社名簿(sheet1)と、系列会社の名簿(sheet2) A列:ID番号 B列:氏名 C列:所属グループ D列:支店 共に、同じ表です。  sheet1とsheet2を照らし合わせ、A~Dまでの情報が全て一致する(sheet2に重複してる)該当者のみに  sheet2のE列に★印が反映されるようにしたいのです。 条件が一つですと、沢山の簡易的な関数でわかりやすのですが、 複数の条件での方法が、他の質問者様の回答の説明をみてもしっくりきませんでした。 ご教授宜しくお願いします。

  • エクセルの関数での質問です

    エクセルの関数での質問です sheet1に A B  C  D  E 1 ○ ○ ○ 1 2 ○ ○ ○ 3 ○ ○ ○ 2 4 ○ ○ ○ みたいな状態からsheet2に A B  C  D  E 1 ○ ○ ○ 1 3 ○ ○ ○ 2 のようにE列の数値順に行を並べることはできますか? エクセル初心者なのでわかりやすく教えていただけると助かります。

  • エクセルでの関数を使った条件抽出方法について

    エクセル初心者です。 エクセルでの関数を使った条件抽出方法についてどなたかご教授願います。 よろしくお願いします。 Sheet1の特定のセルに対して、Sheet2中にある条件に一致するセルの値を 表示させる方法がわかりません。 <具体的内容> 次のような2つのシートがあります。 Sheet1       -------------------------     A     B     C  1                2  2  費目1 3  費目2 4  費目3 ------------------------- Sheet2 -------------------------     A     B     C     D 1  2          1     2     3 3  費目2   100   200   300 4  費目1    30    10    20 5  費目3   150   350   250 ------------------------- Sheet1のC1のセルと同じ数値をSheet2の2:2行から探して、 一致する数値に該当する列の3~4行目の値を、 Sheet1のA2:A3の費目とSheet2のA3:A5の費目とが 一致するようにして、Sheet1のB2:B3に表示したいです。 このときSheet1のB2~B3にはどのような関数式を入れたらよいですか? 上の場合だと、Sheet1のB2=10、B3=200、B4=350となってほしいです。 HLOOKUP、COLUMNなど組み合わせてみたのですが、 全くうまくいきません。簡単ではないのでしょうか? どなたか教えてください、よろしくお願いします。

  • エクセルで条件を満たすものを抽出させる(関数で)

    シート1にタイムを計った一覧があります。    A   B   C 1 山田   2  3.5 2 田中   5  4 3 根岸   2  2.3 4 村井   5  3 5 鈴木   5  3 シート2には社員名簿があります。社員は増減があるため更新したら、それも反映させたいです。   A   B    1 山田 社員 2 根岸 社員 3 村井 社員 そして、シート3に社員で、かつB列が2の情報だけを表示させたいのです。    A   B   C 1 山田  2   3.5 2 根岸  2   2.3 シート3にはどのような関数を入れたらよいのでしょうか?? よろしくお願い致します。 ちなみにVistaです。  

  • Excelで特定も文字を含む行全てを、別のシートに抽出する方法を教えて

    Excelで特定も文字を含む行全てを、別のシートに抽出する方法を教えてください。 Excel2007で名簿を作成しています。 それぞれに、ある条件で「A」「B」「C」と3つに分類しています。 それぞれの分類ごとに、別シートに一括して抽出する方法をご教示ください。 例 Sheet1には (所属名)(コード)(氏名)(コード)(資格)(コード)(年数)(ランク)など14項目あります ※コードの一部には入力規則を使用したブルダウンで選択したり、lookup関数で、数字を入力すると所属名が表示されるようになっています 抽出条件となるランクは、年数のセルが●●以上であれば「A」、●●以下であれば「B」という関数を使用しています。 名簿に入力するごとに、「A」「B」「C」と別のシートに抽出させたいのです。 こちらのサイトでいろいろ検索し参考に試してみましたが、抽出できませんでした。 関数でもマクロでもいいので、抽出する方法を教えてくださると大変嬉しいです。 宜しくお願い致します。

  • エクセルの関数で複数抽出

    エクセルの関数を教えて欲しいです。 以下のような表が別ファイルであるとします。 【Aファイル】    【Bファイル】  A  B  C    A  B  C  D  E 1 商No 分No 名   1 商No 分No 名 売上 売数 2 23  11 あいう 2 1  2  あかさ 24000  12 3 55  34 かきく  3 2 4 いきし 67000  33 4 65  77 さしす 4 11 21  うくす 55700  65 ・ ・  ・  ・   ・ ・ ・   ・   ・   ・ ・ ・  ・  ・   ・ ・ ・   ・   ・  ・ ・ ・  ・  ・   ・ ・ ・   ・   ・  ・ Aファイルの商品Noと分類Noが一致するものを、Bファイルから検索し、行ごと別ファイルに抽出(複数)する関数を教えていただけないですか?。いろいろ検索して探しましたが、複数抽出する方法がわかりませんでした。よろしくお願いいたします。

専門家に質問してみよう