• ベストアンサー

任意のセルを別シートに抽出する方法

自分で選択したセルを他のシート(ファイルは同じ)上に、選択した順に上から並べたいと考えています。関数でやろうといろいろ考えましたが上手くいかず、結局マクロが必要か~と行き詰まり皆さんのお力を借りたく掲載させていただきました。 状況を説明させていただくと、住所一覧の抽出をしたいと考えています。 A1:名前 b1:住所といった順でデータが入っていますが任意で名前を選択し、マクロボタンを押すと隣のシートに行ごとコピーされるようにし、順次、選択+クリックを行えば新しいリストが出来るというイメージでやろうと思っています。 時間のあるときでかまいませんのでご協力よろしくお願いします。

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

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

こんにちは。 「マクロ・ボタン」を押すと書かれていましたが、このようにすれば、右クリック・メニューに入りますので、それで行のコピーをしたらいかがでしょうか? 以下は、少し手を加えるだけで、ユーザー環境に合わせられる汎用マクロです。ですから、2列のみをコピー・貼り付けではなく、行にある右端までをコピーします。 コピー・マクロは、#1 さんのを参考にさせていただきました。ロジックとして、#1 のは問題がないと思います。ですから、#1 さんのでうまくいかないとすれば、こちらもダメだと思います。(何か別の条件が含まれているかもしれません) 設定は、標準モジュールです。 使用法は、A列ならA列のコピーしたいデータを選択肢、右クリック-「行コピー」で、次のシート(Sheet2)にコピーされます。Sheet2ではない場合は、myCopyプロシージャのところの設定のShName = の右の部分を書き換えてください。 '<標準モジュール> Sub SettingMenu() '右クリックのメニュー   On Error Resume Next   CommandBars("Cell").Controls("myCopy").Delete   With CommandBars("Cell").Controls.Add _     (Type:=msoControlButton, Temporary:=True, Before:=1)    .BeginGroup = True    .Caption = "行コピー"    .OnAction = "myCopy"    .FaceId = 133   End With End Sub Sub myCopy() 'コピーマクロ Dim ShName As String '設定  ShName = "Sheet2"  If IsEmpty(Selection) Then Exit Sub  With Sheets(ShName).Range("A65536").End(xlUp)  If IsEmpty(.Cells) Then num = 1 Else num = .Row + 1  End With  Selection.Range(Cells(, 1), Cells(, 1).End(xlLeftToRight)).Copy _  Sheets(ShName).Cells(num, 1) End Sub Sub MenuReset()  '通常は、Excelを終了すれば、メニューは消えますが、途中で解除したい  '場合に適用されます。  CommandBars("CELL").Reset End Sub

fromyokohama
質問者

お礼

凄い!出来ました。バッチリです。何より自分が想像していた工程よりも楽に出来るようになったのがうれしいです。 GOOの教えてサービス初めて利用させていただきましたが、本当に助かりますね。もっと自分で考えろとか言われるかと思いビクビクしていましたが本当に感謝です。私が得意な分野でお手伝いできることがあれば今後も参加させていただきます。 いま、エクセルがおもしろい時期なのでまたお願いするときがあるかもしれませんが今後もよろしくお願いします。ありがとうございました。

その他の回答 (3)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。KenKen_SP です。 >選択した順に上から並べたい... 選択した順に、、というのがミソですかね。。 単純にクリック毎に該当行を他シートにコピーすればよいのでしょう が、そうなると Worksheet_SelectionChange イベントを利用すること になりそうです。 が、エラーなくこれを制御するのは大変ですし、これだと間髪いれず にマクロが実行されてしまうため、間違ったセルを選択したらさらに 面倒です。 アイディアですが、、 1. ユーザーフォームに以下のコントロールを作成   1)リストボックス(カラム数は2)   2)コマンドボタン[登録]   3)コマンドボタン[複写] 2. 1.のフォームをモードレスで表示 3. シート上のセルを選択し、フォームの[登録]ボタンクリックで   リストボックスに次の内容を登録。      1)Column(0) に ActiveCell.Row   2)Column(1) に ActiveSheet.Name    4. 最後に貼り付け先を指定して、[複写]ボタンクリックで、リスト   ボックスからシート名と行番号を読み出してデータコピー。 こんな感じでいけると思います。ついでにユーザビリティーを考えるなら、 さらにコマンドボタンを追加して、リストボックス内の順序を変更でき るようにしたり、リストをクリックすると該当行にジャンプしたりする と良いかもしれません。 ご参考までに。

回答No.2

このVBAはいかかでしょうか? Sub collect_up() Set targetSheet = Worksheets("Sheet2") cRow = 1 For cArea = 1 To Selection.Areas.Count For cCell = 1 To Selection.Areas(cArea).Rows.Count For i = 1 To 2 targetSheet.Cells(cRow, i).Value = Selection.Areas(cArea) _ .Cells(cCell, i).Value Next i cRow = cRow + 1 Next cCell Next cArea End Sub

fromyokohama
質問者

お礼

アドバイスありがとうございます。 マクロの設定をしてみたところバッチリでした! 現在マクロを起動するたびに別シートにコピーされたデータが随時上書きされていますが、 出来ればマクロを起動するたびにデータが埋まった下のセルに順次追記されるようにしたいです。 お時間のあるときで結構ですのでアドバイスよろしくお願いします。

  • masa_019
  • ベストアンサー率61% (121/197)
回答No.1

Sheet2のA,B列に追加していくとして、 Selection.Resize(, 2).Copy _ Sheets("Sheet2").Range("A65536") _ .End(xlUp).Offset(1) とか Sheets("Sheet2").Range("A65536") _ .End(xlUp).Offset(1).Resize(, 2).Value _ = Selection.Resize(, 2).Value とかでどうでしょうか?

fromyokohama
質問者

お礼

迅速に対応していただきありがとうございました。 マクロ設定していましたが私のやり方が悪いのか上手く機能できませんでした。 とにかくアドバイス頂き感謝です。

関連するQ&A

  • エクセル 関数 別シートへの抽出

    エクセル関数について質問します。 「数値の入ったセルだけを、その行ごと丸々別シートに抽出する方法」 について教えてください。 例、C列に空白セルと1、2や3など、数値の入ったセルがあります。空白セル以外の数値の入ったセルを、その行ごと別シートに抽出したい。 C3とC5に数値が入ってる→3行目と5行目を別シートに抽出する。 このようなことは関数でできるのでしょうか? マクロでないと無理でしょうか? お力をお貸しください。 よろしくお願いします。

  • 別シートに抽出

     データを別シートに抽出したい。 画像を参照して下さい。 シートの「一覧」を別シートへ関数を使って抽出したのですが、 思うような結果になりません。お教え下さい。 別シートに VLOOKUP(A3,'一覧'!$A$3:$E$36,2,1) VLOOKUP(A3,'一覧'!$A$3:$E$36,3,1) VLOOKUP(A3,'一覧'!$A$3:$E$36,4,1) VLOOKUP(A3,'一覧'!$A$3:$E$36,5,1)の関数をセルに入れてセル事に 抽出します。その時に別シートに A01・A02・A03・A03・A04・・・・ の順序で抽出したいのですが、うまく抽出できません。

  • エクセルでデータを抽出し,別シートに転記する方法

    「志望校一覧」というシートに添付ファイルのような書式で約200人のデータが入っています。 これを高校学科別にデータを抽出して書式を変えずに「志望校別」という別のシートに転記したいのですが,何か良いマクロか数式はありますか?実際のデータが入っている行は3行目(A子)から188行までです。並び順は右端のコード順,なおかつ組・番順になると良いのですが…。

  • ある条件の複数の氏名を別シート抽出

    添付画像のサンプルのような表があるとします。 これを例えば、「契約者リスト」の20XX年Y月の契約に〇が入っている人の名前を全員分、「契約抽出」に抽出する方法はありませんか?関数だけでお願いします。 「契約抽出」の青色のセルに任意の月を入力するとその月のものが抽出されるようにしたいです。 列番号を特定するために3行目と4行目の間に非表示にするテクニックを作ってもかまいません。

  • Excel VBAで抽出したデータを別シートに表示する方法。

     Excelで20分類された3000行くらいの商品DBシートから名前の定義を利用して分類別のリスト選択(入力規則)しています。  内容は分類シートで商品DBシートから分類列別で抽出し(関数で分類)分類列ごとに名前の定義を設定し入力シートでリスト化(入力規則)を行っております。  商品DBシートにデータを追加すれば自動的に分類シートに反映はされますが、各セルに関数が入っており、再計算が非常に時間がかかります。  VBAで効率よく分類、またはそれ以外の方法がありましたら、ご教授いただければと思います。  よろしくお願いいたします。

  • エクセル 別シートから一覧を抽出したい

    部品一覧表を作成しているのですが、2シートあり 1入力シート・2部品コードシートとあります。 部品コードシートにはB列に部品番号・C列部品名・D列部品番号・E列部品名と2行ずつ使い番号・品名がB~Wまで47行分入力されています。 B1:C47、D1:E47…と2列47行にはそれぞれ【A】、【B】、…とセルの名前の定義をつけました。現在【H】までありますが、今後増える可能性があります。 入力シートに、セルの名前を指定したときに部品コードのシートから 一覧を抽出したいのですが、どの関数を使えばよいのかわかりません。 入力シート                 |部品コードシート G   H                  | A Bコード C部品名  Dコード E部品名 4式入力用にあけています。     |1 1800  ユニットA   1501 電源A 5コード 部品名             |2 1801  ユニットB   1502 電源B 6                       |3 G4に関数を入れてG6~G52まで部品コードのシートA1~A47を一気に表示 させたいのです。部品コードシートの行数が変わることはありません。 マクロを使わないと、関数では難しいでしょうか?

  • エクセルで作成した住所録から任意のデータ抽出

    まず住所録ですが、形式はAからD列に番号、略号、氏名、住所、行は2行目から最大100行まで同じ形式のものが、10シート以上あります。別形式の証明書用のシートがあり、そこに空欄の氏名と住所が別行にあります。任意の証明書に複数ある住所録から任意の氏名と住所を番号を検索して、1発抽出したいのが今回の質問です。 住所録、証明書用のシートが1つづつならばVLOOKUP関数で簡単に抽出できました。 しかし、各々が10シート以上にせざるを得なくなりました。 このような操作の場合、そもそも関数で対応できますか?証明書用シートそれぞれに住所録全部を範囲とすることもできず、困っております。  もし関数でできるならばその方法を教えてください。 VBAやマクロでないと対応ができないとなるとその知識がないに等しいのでご教授の際は、細かく指示してもらえればありがたいです。  コピペでやれば手間でもできますが、かなりの人数のものが利用しますので必ず氏名と住所を違うものをコピーしてきて貼り付けるのでこの方法は、不採用にしました。 以上、長くなりましたがよろしくご教授お願いいたします。

  • マクロ!一覧から別シートへの抽出

    商品の納期や、集金日などが一覧になっている【一覧】シートがあります。 他に集金月別にシート【4月】【5月】…と一年分12シートあります。 一覧シートは、空欄セルに店舗名や納期などを随時入力していき、データは増えていくのみです。 下記のマクロでデータの抽出・抽出結果のコピー・貼り付けを行っています。 Sub Macro4() ' ' Macro4 Macro ' 集金月で抽出 Dim myRow1 As Long, myRow2 As Long myRow1 = Sheets("一覧").Range("B65536").End(xlUp).Row myRow2 = Sheets("4月").Range("B65536").End(xlUp).Row If myRow2 >= 3 Then ★ Sheets("4月").Range("A3:P" & myRow2).ClearContents End If Sheets("一覧").Range("A3:P" & myRow1).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range("G1:H2"), CopyToRange:=Range("A4:P4"), Unique:=False End Sub 一覧以外のシート全てに、上記マクロを登録した【抽出】ボタンを設置し G1:H1セルには集金日と検索項目のタイトル G2セルには>=4/1、H2セルには<=4/30 抽出ボタンをクリックして一覧から取得しています。  マクロは、説明が載っているHPからの独学なのでどう応用すれば良いのかがわかりません。 一覧に追加入力し、4月シートに4月分抽出。次に5月シートに5月分抽出とすると4月シートの抽出結果が消えてしまいます。 そこで、★で指定している4月シートではなく、現在選択している”シート”としたいのですが、どのように記述すればよいかわかりません。 自分が分からない事を、どう検索してよいかも分からなくなってきたので、どうかアドバイスお願いします。

  • 選択したセルの値を別シートのセルに取り込む方法

    顧客情報を閲覧・印刷するためのフォームがsheet1とします。顧客の情報が入ったデータベースがsheet2とします。 以下のマクロでsheet2の48列目を空欄にして、48列のいずれかのセルに「出力」と入力すると、そのセルの行の値を出力結果というシートに渡すようにしています。取り込んだ行の顧客番号をsheet1のmach関数の参照先に指定して、index関数で各項目に取り込むようにしています。 Worksheets("sheet2").Activate Dim i, LastRow As Long LastRow = Cells(Rows.Count, 48).End(xlUp).Row For i = 1 To LastRow If Cells(i, 48) = "出力" Then Rows(i).Copy Sheets("出力結果").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i もう少しこれを改良して、Sheet2の顧客番号の入っている1列目の任意のセルを選択して、sheet1のmatch関数の参照先(例としてK4)に選択した顧客番号を渡す方法はありませんでしょうか。sheet1は顧客番号だけ取得できれば、match・index関数でフォームが完成します。 VBAは初心者です。上記マクロは検索で調べて必要な個所をコピーして今の環境にアレンジしました。よろしくお願いします。

  • 住所録の値を別シートに取り込むには

    一つのブックに住所録シートと請求書リストがあります。 100件程度の住所録のリストを別シートの請求書フォームの宛先住所に取り込むVBAを教えてもらえますでしょうか。 住所録リストのシートには一行に例として B2には名前 B3には郵便番号 B4には住所が入ってます。これが100行程度あります。 請求書フォームも同様にB2に名前、B3に郵便番号 B4に住所が入るようにしてあります。 住所録リストは100件程度なので、選択した行の住所の値を、請求書フォームの住所のセルに取り込みたいわけです。 よろしくお願いします。

専門家に質問してみよう