• ベストアンサー

エクセルの名簿抽出貼付けについて

シート1に名簿があります。 A列    B列    C列 D列  E列  F列  G列  H列 ・・・・ 通し番号 クラス  名前 部活 趣味 部活 趣味 部活 ・・・  D列E列は1年時の部活と趣味 F列G列は2年時の部活と趣味です。 これが縦に100名以上、横には6年分くらい続きます。 で、シート2には A列    C列  D列  E列 通し番号 名前 部活 趣味 の枠だけがあります。およそ40名分の枠です。 そこで、シート1のあるセルに「2」「3」と入れてマクロボタンを 押すと、シート2に「3組の2年時のデータ」の名簿が出来上がる という抽出、コピー、貼付けのマクロを教えてください。 貼付けるのは、名前と部活と趣味だけですが、まず抽出方法が?です。 よろしくお願いします。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.3です! たびたびお邪魔します。 >シート2に「学年」「クラス」のセルがあってもできるということですよね? に関しては「そのとおり!」ということになります。 そして、配列数式を使っている関係上、コンピュータへの負担を心配されていましたので、 作業用の列を設けて、少し負担を少なくする方法を書いておきます。 もう一度画像をアップさせていただきます。 Sheet1の最終列に作業用の列を設けて、今回はSheet2に年時とクラスを入力するようにしてみました。 作業列P3セルに =IF(OR(Sheet2!$C$1="",B3<>Sheet2!$C$1),"",ROW(A1)) としてオートフィルで下へコピー又はP3セルのフィルハンドルでダブルクリック。 今回もSheet2の各列の数式は違いますので、それぞれのセルに数式を入力する必要があります。 (配列数式はありません) Sheet2のA3セルに =IF(COUNT(Sheet1!$P$3:$P$200)<ROW(A1),"",INDEX(Sheet1!$A$3:$A$200,SMALL(Sheet1!$P$3:$P$200,ROW(A1)))) B3セルに =IF(A3="","",VLOOKUP(A3,Sheet1!$A$3:$C$200,3,0)) C3セルに =IF(A3="","",INDEX(Sheet1!$D$3:$O200,MATCH(A3,Sheet1!$A$3:$A200,0),$A$1*2-1)) D3セルに =IF(A3="","",INDEX(Sheet1!$D$3:$O200,MATCH(A3,Sheet1!$A$3:$A200,0),$A$1*2)) として、前回同様全てを範囲指定しオートフィルで下へコピーします。 これで少しはコンピュータも軽くなると思います。 以上、今回も長々と書いてしまいました。 参考になれば幸いです。m(__)m

yuko-saita
質問者

お礼

ありがとうござりまする~~~~。 いろいろな方法を検討してみたいと思います。 みなさん素晴らしいですね~。 マクロよりもこの、さくっと出る方が個人的には好きです。 マクロだといろいろファイルをいじってる間にどっかにいってしまって 「マクロが見つかりません」てなことになるので、だったら数式の方が 便利だなと思っていました。ありがとうございました!

yuko-saita
質問者

補足

実際にやってみましたら、できました! で、追加質問ですが、 IF(COUNT(Sheet1!$P$3:$P$200)<ROW(A1),"",INDEX(Sheet1!$A$3:$A$200,SMALL(Sheet1!$P$3:$P$200,ROW(A1)))) と、ここでA1はどういう理由で利用されているのですか? A1とは年時のセルですよね。それを何と比べてるのかなと思いました。C1のクラスのセルかな?と最初思ったので教えてください。 それと、C3D3セルは「1*2-1」を参考に、慣れているVLOOKUPでやってみたら出来ました!(^^)

その他の回答 (5)

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.6

   A   B   C   D   E   F   G…  1  No.  クラス 名前 部活  趣味  部活  趣味…  2  1   1   高木 柔道 生け花 柔道 生け花… ・ ・   ・   ・  ・   ・   ・   ・ … ・ ・   ・   ・  ・   ・   ・   ・ … ・ ・   ・   ・  ・   ・   ・   ・ … ・ ・   ・   ・  ・   ・   ・   ・ … 312 311   3   青木  ・   ・   ・   ・ … ・ ・   ・   ・  ・   ・   ・   ・ … ・ ・   ・   ・  ・   ・   ・   ・ … ・ ・   ・   ・  ・   ・   ・   ・ … ・ ・   ・   ・  ・   ・   ・   ・ … (※左端はセルの行ナンバー) こんな感じの表だと仮定します 更にシート1のP1に検索対象組ナンバー、P2に検索対象学年が数値として入っているものとします エラー処理は省きますね A1に =OFFSET(Sheet1!$A$1,SMALL(INDEX((Sheet1!$P$1<>Sheet1!$B:$B)*1100000+ROW(Sheet1!$B:$B),0,0),ROW($A1)),COLUMN(A$1),1,1) C1にA1をコピー D1に =OFFSET(Sheet1!$A$1,SMALL(INDEX((Sheet1!$P$1<>Sheet1!$B:$B)*1100000+ROW(Sheet1!$B:$B),0,0),ROW($A1)),COLUMN(A$1)+Sheet1!$P$2*2,1,1) D1をE1にコピー この1行目を 40行目までフィルハンドルなどで数式コピー 如何でしょうか 御役に立てたなら幸いです

yuko-saita
質問者

お礼

こんなやり方もあるのですね~。勉強になりました! ありがとうございました!

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.5

>貼付けるのは、名前と部活と趣味だけです とは,貼り付け先シートのA列は残すという意味だったんですね。 Sub macro1r1() Dim nen Dim cls nen = InputBox("学年") cls = InputBox("クラス") If nen = "" Or cls = "" Then Exit Sub Application.ScreenUpdating = False Worksheets("Sheet2").range("C:E").ClearContents With Worksheets("Sheet1")  .AutoFilterMode = False  .Range("B:B").AutoFilter field:=1, Criteria1:=cls  .Range("C:C").Copy _   Destination:=Worksheets("Sheet2").Range("C1")  .Range("B:C").Offset(0, nen * 2).Copy _   Destination:=Worksheets("Sheet2").Range("D1")  .AutoFilterMode = False End With Application.ScreenUpdating = True End Sub とかなんとか。

yuko-saita
質問者

お礼

細かいところまでありがとうございました! もう少し分かりやすい説明を心がけます。 わからない言語?もあるので勉強してみます。 ありがとうございました!

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! VBAでないので参考にならなかったら無視してください。 関数を使った一例です。 ↓の画像で上側がSheet1で下側のSheet2に抽出する方法です。 今回はSheet2の各列に違う数式を入れていますので、列方向へのコピーは考えていません。 Sheet2のA2セルに =IF(COUNTIF(Sheet1!$B$3:$B$200,Sheet1!$C$1)<ROW(A1),"",INDEX(Sheet1!$A$3:$A$200,SMALL(IF(Sheet1!$B$3:$B$200=Sheet1!$C$1,ROW($A$1:$A$198)),ROW(A1)))) これは配列数式になってしまいますので、この画面からコピー&ペーストしただけではエラーになると思います。 貼り付け後、F2キーを押す、又は貼り付けセルでダブルクリック、又は数式バー内で一度クリックします。 編集可能になりますので、Shift+Ctrlキーを押しながらEnterキーで確定してください。 数式の前後に{ }マークが入り配列数式になります。 残りの3列の数式は配列数式ではありません、単に貼り付けだけでOKです。 B2セルに =IF(A2="","",VLOOKUP(A2,Sheet1!$A$3:$C$200,3,0)) C2セルに =IF(A2="","",INDEX(Sheet1!$D$3:$I$200,MATCH(A2,Sheet1!$A$3:$A$200,0),Sheet1!$A$1*2-1)) D2セルに =IF(A2="","",INDEX(Sheet1!$D$3:$I$200,MATCH(A2,Sheet1!$A$3:$A$200,0),Sheet1!$A$1*2)) という数式を入れ、A2~D2セルを範囲指定し、D2セルのフィルハンドルで下へコピーすると 画像のような感じになります。 これでSheet1のA1セルに表示したい年時を、C1セルにクラスを入力すると 入力したクラスの年時のデータが抽出できると思います。 以上、長々と書きましたが 最初に書いたように的外れなら 読み流してくださいね。m(__)m

yuko-saita
質問者

お礼

なるほど~。数式はまだ詳しく見てませんが、参照でも対応できるのですね!ありがとうございました!! ちょっとやってみたいと思います。これはシート2に「学年」「クラス」のセルがあってもできるということですよね?そうなると数字を入れたらババっと名簿が出来るので壮観な気がします。ただ、オートフィルタ的なマクロを組むのと、どっちが軽いかが気になりました。結構重くなると入力の反応が遅くなることがあって困っているので(単にPCの性能が低い可能性もあります)いろんなパターンがあるんですね~。だからエクセルって面白いですね。出来るかな?ってことが大体出来るのも面白いです。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

>…のマクロを教えてください。 Sub macro1() Dim nen Dim cls nen = InputBox("学年") cls = InputBox("クラス") If nen = "" Or cls = "" Then Exit Sub Application.ScreenUpdating = False Worksheets("Sheet2").Cells.ClearContents With Worksheets("Sheet1")  .AutoFilterMode = False  .Range("B:B").AutoFilter field:=1, Criteria1:=cls  .Range("C:C").Copy _   Destination:=Worksheets("Sheet2").Range("A1")  .Range("B:C").Offset(0, nen * 2).Copy _   Destination:=Worksheets("Sheet2").Range("B1")  .AutoFilterMode = False End With Application.ScreenUpdating = True End Sub とかなんとか。

yuko-saita
質問者

お礼

早速のお返事ありがとうございます! 今日は試せないのですが、後日やってみたいと思います!

回答No.1

>まず抽出方法が?です。 フィルタオプションの設定を使えば抽出可能です。 そのためには項目に重複があってはいけません。 よって、部活1年 趣味1年 と2セル分書いて2セル選択して横へオートフィル 部活1年 趣味1年 部活2年 趣味2年 部活3年 趣味3年 部活4年 とするのはどうでしょうか? Sheet2には 通し番号 名前 ="部活"&学年&"年" ="趣味"&学年&"年" のようにしておく。(タイトルは学年を参照するようにする) フィルタオプションは Sheet2の何も書いてないセルで行います。 ●指定した範囲 リスト範囲 Sheet1!$A$1:$N$44 検索条件範囲 $F$1:$F$2 抽出範囲 $A$1:$D$1 添付図参照 G2セルを名前の定義で「学年」にしています マクロを使えば項目の重複も可能だと思いますが、フィルタを覚えてからでも遅くはないと思います その後、マクロを自動記録してみると良いと思います。

yuko-saita
質問者

お礼

初心者なもので・・・ お礼を補足につけてしまいました・・・・。 ありがとうございました。

yuko-saita
質問者

補足

画像まで添付していただいてありがとうございます! オートフィルタですね!新しいマクロで記録中に オートフィルタをしてみたのですが、なんだかちんぷんかんぷんで 困っていました。ちょっと分かってきたような気がします! 週が開けたらやってみます。ありがとうございました!

関連するQ&A

  • エクセル 名簿以外のを抽出するには

    エクセルについて教えてください。 元データシートがあります。データの行列は結構な数が入っています。    A    B     C      D     E     F     G ・・・・・ 1 東京  山田  小計  ・・・  ・・・  ・・・  ・・・  ・・・・・ 2 埼玉  菊池  小計 3 栃木  中山  平均 4 茨城  岸本  小計 5 東京  村井  合計 といった具合にいくつものデータがあります。 抽出データシートに「名簿シート以外の人物」でなおかつ「元データのC列が"小計"と記載されているもの」だけを抜き出したいのです。 名簿シート(今後増減あり)    A    B       1 埼玉  菊池   2 東京  山田   3 ・・・   ・・・   ・ ・ 抽出データシート    A    B      C     D      E     F     G ・・・・・ 1 茨城  岸本  小計 2 ・・・   ・・・  小計 3 ・・・   ・・・  小計 ・ 関数で可能でしょうか? 難しいなら、せめて、名簿以外の人物だけを抽出したいです。 また、元データや名簿が更新されるごとに抽出データが自動的に「名簿以外の人物」と 「C列が小計」のものだけを抽出したいのですが、関数以外に何かありますでしょうか? よろしくお願いいたします。

  • VBAでソートして、貼り付けのやり方

    (条件及び操作) 1 シートが2つあります。(元データ と 名簿シート)という名前。 2 名簿シートのH2に数字を入力する。元データのシートの1行目にある、番号と一致する列を操作する。 3 元データの対象の列で、まずD列(組ごと)に、1組・2組をソートする 4 次に、対象の列(科目:国語や理科など)事に、○をソートする 5 ソート後に、番号、名前、出身と○をコピーする。 6 その後、名簿シート(1組でソートしたものは、B2、2組でソートしたものはE2)に貼り付ける 7 対象の列の科目名(国語なら国語を)をA1に貼り付ける 8 元データのソートを解除する (備考) 番号も科目も100ぐらいあります。 これらの(条件及び操作)を元に、名簿シートのH2に任意の数字を入力して、元データの対象の列を上記(1~8)の操作を行いたいと思います。 《シート名:元データ》 A列   B列   C列   D列   E列   F列   G列   H列   I列   ・・・                       1    2     3     4    5   ・・・   番号  名前   出身  組    国語  理科   英語   数学  社会  ・・・ 001 Aさん  東京    1     ○                ○   ○  002 Bさん  沖縄   1     ○                 ○   ○  003 Cさん  鹿児島  1     ○                     ○  004 Dさん  青森    1     ○                     ○  005 Eさん  北海道  2     ○          ○  006 Fさん  京都   2     ○          ○     ○ ・ ・ ・ 《シート名:名簿シート》      A列   B列   C列   D列   E列   F列   G列   H列    国語     1組              2組     番号   名前   出身  番号   名前   出身  番号入力      お忙しい中、大変申し訳ございませんが、どうぞよろしくお願いします。 また、質問の内容などがわかりづらいなどの事がありましたら、ご指摘ください。

  • 検索・抽出・貼り付けのマクロ

    シート1のデータをオートフィルターかけて検索し抽出したものを、A列、B列、D列、F列をシート2の、A列、B列、C列、D列に貼り付けるマクロを教えて頂けますでしょうか? 一週間位悩んでいます。

  • 二つのエクセル名簿を比較し、抽出したい

    エクセルでできた名簿が2つあります。 どちらも 列EがID、 列Fが氏名 列Gがフリガナ という構成は同じです。 両方の名簿で同じ人は、同じIDです。 ただ、上記記載以外の列、備考や更新日などは同じ人でも異なったデータが入っています。 二つの名簿ファイルを借りに名簿A、名簿Bとすると 名簿Aにのみ掲載されてる人のレコードのみ抽出したいのです。 両方の名簿から、ABともに掲載されてる人、Bのみに掲載されてる人を除き、Aのみに掲載されてる人だけのリストを作りたい。 理想は、名簿Aのリストはそのままにして、 まったく別の列(例えば列Z)に抽出した人だけ 1を入力するなどが理想です。 1行ずつ目で見て比較していくのは、時間のむだでとてもできません。

  • エクセル 名簿の人だけを関数で抜き出す方法

    エクセルについて教えてください。 元データシートがあります。データの行列は結構な数が入っています。    A    B     C      D     E     F     G ・・・・・ 1 東京  山田  小計  ・・・  ・・・  ・・・  ・・・  ・・・・・ 2 埼玉  菊池  平均 3 栃木  中山  平均 4 茨城  岸本  小計 5 東京  村井  合計 といった具合にいくつものデータがあります。 抽出データシートに「名簿シートに載っている人物」でなおかつ「元データのC列が"小計"と記載されているもの」だけを抜き出したいのです。 名簿シート(今後増減あり)    A    B     1 東京  山田 2 栃木  中山 3 茨城  岸本 ・ ・ ・ 抽出データシート    A    B      C     D      E     F     G ・・・・・ 1 東京  山田  小計  ・・・  ・・・  ・・・  ・・・  ・・・・・ 2 茨城  岸本  小計 ・ ・ ・ 関数で可能でしょうか? 難しいなら、せめて、名簿に載っている人物だけを抽出したいです。 また、元データや名簿が更新されるごとに抽出データが自動的に「名簿に載っている人物」と 「C列が小計」のものだけを抽出したいのですが、関数以外に何かありますでしょうか? よろしくお願いいたします。

  • エクセルで、データのある行だけを抽出したい。

    エクセルのSheet1にデータが入っており、セルが空白でない行のデータのみを、Sheet2に抽出したいと思っています。 Sheet2にあらかじめ関数を入れておく方法にしたいため、関数について教えてください。 タイムテーブルで予定を管理するような表で、A~Hまでにデータが入っています。 予定を入れる際にはE列には必ず入力をするため、E列が空白でない行のみを抽出したいです。 A|B|C|D|E|F|G|H 月|日|時間|… 11|22|10:00|… 11|22|10:30|… 時間枠は10:00~17:00の30分刻みで、1日15行使用するので、1年で5475行まで使用します。 1行目はタイトル行なので、データは2行目から入力しています。 フィルタオプションで抽出する方法や、それをマクロで登録しておく方法は分かったのですが、あとから予定を追加することがあるため、マクロを実行する度にデータが置き換わると困ってしまいます。 また、抽出したSheet2のI列以降には備考などを入力したいため、やはり後から列がずれると困るため、A~H列に関数を入れておく方法で実行したいと思います。 よろしくお願いいたします。

  • excelで名簿を

    excelで名簿を作りたいのですが..... (1)登録順に1から始まる数字が割り振られています。(”登録番号”と呼ぶことにします) (2)A列から順に A列「登録番号1~30」、B列「1~30の人の名前」、C列「1~30の人の生年月日」が入るとします。 (3)登録番号が31~60のデータは、D列「登録番号31~60」、E列「31~60の人の名前」、F列「31~60の人の生年月日」に入るとします。 (4)2ページ以降も同様にしてA~C列には登録番号61~90の人のデータがD~F列には登録番号91~120の人のデータが入るとします。 ここでたとえば30番目の人の名前と生年月日のデータを削除したときに31番目以降のデータが一つずつずれるようにはできますか? 30番目には31番目の人の名前と生年月日が、60番目には61番目の人の名前と生年月日がくるといった具合です。データ(セル?)を追加するときも同様です。 データ(セル?)を削除、追加したときに2ページ目以降の印刷開始位置や開始番号(登録番号のことです)→(2ページ目なら61、3ページ目なら121 がずれないようにしたいのです。 どなたかよろしくお願いします<(_ _)>       

  • VBA チェックボックスをチェックした名前のみ抽出

    数百名のリストからチェックした名前のみ抽出したいと思いまして。 1.シート1のA、C、E…奇数列にフォームのチェックボックスを配置 2.B、D、F…偶数列に名前を並べる 3.チェックボックスでクリックし、チェックマークが出る 4.マクロでSheet2のA列から抽出された名前を並べる 宜しくお願いします。

  • エクセルVBA/抽出・貼付け

    下記を行いたいのですが、どのようなコードになるのでしょうか? シート001(入力用) (1)A1~A50、B1~B50、C1~C50、D1~D50  に数値、E1~E50に文字列 (2)F1~F50、G1~G50、H1~H50、I1~I50  に数値、J1~J50に文字列 ※空白行混在 シート002(計算用) シート001に作ったコマンドボタン:クリックにより、 シート002を表示させ、A1~E100に、 シート(1)のA1~E50とF1~J50の空白行以外を連続して 反映させたい。並べ替え用など別シートを用いずに、 VBAコード内で処理したい。

  • エクセルで名簿

    エクセル2003を使ってある名簿を作成しています。 各シートには地域で分けたそれぞれ男女の名簿があり (男女が入り交じってはいません) 4シート(地域)分くらいあります。 そこでですが、 たとえば、そこから (1)1つのシートに各地域ごとの男子or女子のみを各シートから抽出したい。 (2)次年度で各地域で増減があればまとめたシートにも反映させたい てことは可能でしょうか? やはりマクロ等を使わないとだめでしょうか? いろいろ検索してみましたが見合ったのが見つからず、 どうすればいいかわかりません。 よろしくお願いいたします。

専門家に質問してみよう