VBAで特定の行を抽出し別シートへコピー・削除する方法
- VBAを使用して、特定の行を抽出して別のシートにコピーし、元のデータから削除する方法について教えてください。
- 詳細には、【リストsheet】の注文番号に対応する行を【出荷sheet】にコピーし、コピーした行は元のデータから削除する方法が知りたいです。
- VBAの理解度は未熟ですが、どなたか教えていただけると助かります。
- ベストアンサー
VBA 特定の行を別シートへコピー・削除
下記のように、VBAで特定の行を抽出して別シートへコピーし、コピーした行については元リストデータを削除したいです。 具体的には、【出荷sheet】(C列注文番号は、出荷があった時に入力済)へ、注文番号に対応する行を【リストsheet】から抜き出してコピーし、コピー後は、【リストsheet】から該当行を削除したいです。 検索により調べてもうまく合致する回答が見当たらず困っています。 VBAの理解度は未熟ですが、何卒ご教授いただけると幸いです。 【リストsheet】 A列 B列 C列 D列 ・ ・ ・ J列 No. 日付 注文番号 品名 ・ ・ ・ ・ 1 1/1 A111 鉛筆 ・ ・ ・ ・ ←コピー後、削除 2 1/2 B222 ペン ・ ・ ・ ・ 3 1/5 C555 消しゴム・ ・ ・ ・ ←コピー後、削除 ・ ・ ⇓ 【出荷Sheet】 A列 B列 C列 D列 ・ ・ ・ J列 No. 日付 注文番号 品名 ・ ・ ・ ・ 1 1/1 A111 鉛筆 ・ ・ ・ ・ 3 1/5 C555 消しゴム・ ・ ・ ・
- star_red123
- お礼率96% (24/25)
- Excel(エクセル)
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは 出荷sheetのシートタブを右クリックして「コードの表示」でVBE画面を出して、 下記コードを貼り付けて下さい。 C列に注文番号を入力すると処理が走ります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim s As Worksheet Dim a As Variant Dim r As Range If Target.Count > 1 Then Exit Sub If Target.Column <> 3 Then Exit Sub If Target.Value = "" Then Exit Sub Set s = Worksheets("リストsheet") With s Set r = .Range("C1", .Range("C" & Rows.Count).End(xlUp)) a = Application.Match(Target.Value, r, 0) If IsError(a) Then MsgBox "入力注文番号が有りません。", vbExclamation Else Application.ScreenUpdating = False Application.EnableEvents = False .Range("A" & a).Resize(, 10).Copy Target.EntireRow.Cells(1, 1) .Range("A" & a).EntireRow.Delete Application.EnableEvents = True Application.ScreenUpdating = True End If End With End Sub テストブックで試して下さい。 出荷sheetのC列はデータの入力規則でリストsheetのC列の注文番号を選択出きるように しておくといいかと思います。
その他の回答 (2)
- Prome_Lin
- ベストアンサー率42% (201/470)
私なりの回答です。 Option Explicit Sub Test() Dim s1, s2 As Worksheet Dim i As Integer Dim f As Range Set s1 = Worksheets(1) Set s2 = Worksheets(2) For i = 2 To s2.Range("C2").End(xlDown).Row Set f = s1.Range(s1.Cells(2, 3), s1.Cells(s1.Range("C2").End(xlDown).Row, 3)).Find(s2.Cells(i, 3).Value) s1.Rows(f.Row).Copy s2.Cells(i, 1) s1.Rows(f.Row).Delete Next i End Sub 簡単な説明。 「Worksheet(1)」(左端のシート)を、「s1」とセット、同じく「Worksheets(2)」を「s2」としてセット。 「Worksheets(2)」の「C」列の2行目からデータのある最終行(ここでいう最終行とは、空白があるまで、なので、途中に空白があれば、そこで止まってしまいます。従って、「注文番号」は連続して入力してある必要があります。)まで1行ずつ処理。 「Worksheets(2)」の「注文番号」を使って、「Worksheets(1)」の「注文番号」を検索(Find)。 見つかった行(f.Row)をコピー(記憶)し、「Worksheets(2)」にペースト。 「Worksheets(1)」のその行を削除。 以上です。
お礼
ご回答ありがとうございました。 簡潔な表示かつご丁寧な説明までしていただき有難うございます。 私自身の理解の浅さを反省し、もっと勉強したいと思います。
- kkkkkm
- ベストアンサー率65% (1615/2454)
それぞれのシート名は表の参考に記載されているシート名にしています。 データは質問に書かれた状態で2行目からデータがあるものとしています。 リストsheetの注文番号に重複があった場合、下にあるものがコピーされます。 出荷Sheetの注文番号に重複があった場合、同じものがコピーされます。 最後に削除する行を選択するようにしてますので、正常に動作したらSelect をDeleteにしてください。 Sub Example() Dim ListData As Variant, SearchData As Variant Dim i As Long, j As Long Dim TargetRows As String Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Sheets("リストsheet") Set ws2 = Sheets("出荷Sheet") ListData = ws1.Range(ws1.Cells(2, "C"), ws1.Cells(Rows.Count, "C").End(xlUp)) SearchData = ws2.Range(ws2.Cells(2, "C"), ws2.Cells(Rows.Count, "C").End(xlUp)) TargetRows = "" For i = LBound(SearchData) To UBound(SearchData) For j = LBound(ListData) To UBound(ListData) If ListData(j, 1) = SearchData(i, 1) Then TargetRows = TargetRows & j + 1 & ":" & j + 1 & "," ws1.Range(ws1.Cells(j + 1, "A"), ws1.Cells(j + 1, "J")).Copy ws2.Cells(i + 1, "A") End If Next j Next i TargetRows = Left(TargetRows, Len(TargetRows) - 1) ws1.Activate ws1.Range(TargetRows).Select 'Delete Set ws1 = Nothing Set ws2 = Nothing End Sub
お礼
早速、ご丁寧にご回答いただきまして、ありがとうございました。 前提が抜けている箇所があり、申し訳ございませんでした。 コピー&ペーストしたら、正常に起動しました!感謝です。 まだまだ勉強不足であることを痛感しました。。。
関連するQ&A
- Sheet1のデータを条件で行ごと抽出するVBA
ExcelのVBAについて質問です。 Sheet1 | A | B | C | D | E 1| 5/12|青森|出荷済|11個|りんご 2| 5/12|静岡|準備中|10缶|お茶 3| 5/12|愛媛|未出荷|21個|みかん 4| 5/12|新潟|未出荷|99粒|おこめ 5| 5/12|栃木|出荷済|15個|巨峰 こんなシートがあります。 これを、シート状のボタンをクリックしたときに、 「C列が"出荷済"または"準備中"の行だけ抽出して、列を入れ替えながらSheet2に並べる」 というVBAを組みたいです。 ボタンを押した後Sheet2がこんな感じになるようにしたいです。 Sheet2 | A | B | C | D | E 1|りんご|11個|5/12|青森|出荷済 2|お茶 |10缶|5/12|静岡|準備中 5|巨峰 |15個|5/12|栃木|出荷済 列の入れ替えはこのような感じです (Sheet1⇒Sheet2) E列⇒A列 D列⇒B列 A列⇒C列 B列⇒D列 C列⇒E列 行はSheer1の順番をSheet2でも抽出されない行を詰める形で維持したいです。 また、ボタンを押されるたびSheet2が全て上書きされる形で構いません。 抽出と入れ替えのヒントだけでもお教え頂ければ自分でやってみたいと思います。 よろしくお願いいたします。
- 締切済み
- その他MS Office製品
- VBAで検索して、行をコピー&追加したい
Excel2010で以下のことをしたいのですが、VBAがあまりできないのでやれません。 どうか助けてください。 ・sheet1のA列に検索用の番号(例として商品番号)が入力されています。 ・sheet2はデータベースで、A列に商品番号B列に商品名、C列に国名、D列に価格・・~その後J列まで情報が入っています。(行数は1万行) ・sheet1に入っている商品番号でデータベースから行をピックアップし、該当の行をsheet1のB列以降にコピーしたいのです。 (シート3を新しく作っても構いません。やりやすい方で) ・ただし、同じ商品番号で複数の行がヒットしますので、複数の行がヒットしたら行を追加しながら、行をコピーしたいです。 どのように書いたら良いか参考になるURLだけでもご教授ください。 よろしくお願いします。
- ベストアンサー
- Excel(エクセル)
- VBAで重複していない行を削除したいです。
初めてgoo質問を使います。 sheet1とsheet2の1列目と2列目で重複していない行を sheet2から削除したいです。 例えば、 Aの列に番号?、Bの列に数字 sheet1 A B CDEF 1 番号A 1 2 番号A 2 3 番号A 3 4 番号C 1 5 番号C 2 6 番号F 6 7 番号F 7 8 番号F 8 9 番号F 9 10 番号F 10 sheet2 A B CDEF 1 番号A 1 2 番号A 2 3 番号A 3 4 番号B 1 5 番号B 2 6 番号B 3 7 番号C 1 8 番号C 2 9 番号D 8 10 番号D 10 があったとして、上記を下記のようにしたいです。 sheet2 A B CDEF 1 番号A 1 2 番号A 2 3 番号A 3 4 番号C 1 5 番号C 2 6 番号F 6 7 番号F 7 8 番号F 8 9 番号F 9 10 番号F 10 CDEFの列にはsheet1とsheet2で違うデータが入っています。 sheet2から重複していない行を削除したいです。 宜しくお願いします。
- ベストアンサー
- Visual Basic
- エクセル VBA 特定文字がある行を別シートに移動
C列にA,B,C,D,E(赤枠部分)の文字列が入力された表があります。 マクロ実行時下記のようにするには、VBAのコードをどのように記入すれば、よろしいでしょうか? AとBが入力されている行をシート2にコピー Cが入力されている行を切り取りしシート2に貼り付け(下の行は上方向にシフト) Dが入力されている行を切り取りしシート3に貼り付け(下の行は上方向にシフト) Eが入力されている行を切り取りしシート3に貼り付け(下の行は上方向にシフト) エクセルは2000及び2007です。 よろしくお願い致します。
- ベストアンサー
- その他MS Office製品
- エクセルVBAで、ある文字を含んでいたら別シートに抽出したい
エクセル2002を使っています。 シート1に A列に氏名 B列に住所 C列に電話番号 のデータが300件の表があります。 B列を検索してたとえば大阪府があれば、その行(ABC列)をシート2へコピーして抽出したいのです。 VBAを使ってやりたいのですがどうしたらよいでしょうか? よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- VBAを使って検索したセルを別のシートにコピーする
こんにちは。 業務でエクセルを使用して差し込み文書を印刷しています。 量が多いのでVBAを使って簡単に作業したいです。 まず、以下のようなシートがあります。 <Sheet1>差込文書 <Sheet2> (A) (B) (C) (D) (E) (F) 番号|会社名|支店名|役職名|氏名|会社、支店名、役職名、氏名 次のような作業をさせたいです。 1.<sheet2>のA列と同じ番号が<sheet1>の(L1)にあるかどうか検索する。 2.もし、一致するセルがあれば、<sheet2>の該当番号の行のF列を<sheet1>の(B5)にすべて(書式ごと)コピーする。 以上です。 VLOOKUP関数でしましたが、すべてをコピーする事ができなかったので、VBAでコピーしたいです。 F列は、個人名だけの方、支店がない会社などがあるため、バランス良く配置しているセルです。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 別のシートの文字列を他のシートに移すには?
エクセル VBAで別のシートの文字列を他のシートにコピーするには どのようなコードを記入すればよろしいでしょうか? 同一ブック内に「Sheet1」と「リスト」のワークシートがある場合、 次の順序でリストのデータを他のシートに貼り付けるには どのようにコードを入力すればよろしいでしょうか? (1)2行目からのリストの使用行数を調べる。 ※リストの使用行数は変動するため、決まっていません。 (2)Sheet1は、32行しか入力できないため、(1)で求めたリストの行数から ワークシートを必要数コピーする。 例 リストの行数が100の場合、Sheet1を3つコピーし、計4つにする。 (3)リストの図番(A列)、名称(C列)、金額(E列)をコピーし Sheet1のA,B,C列に「値」で貼り付ける。 (4)Sheet1のA,B,C列に32行貼り付け終わったら(2)でコピーした次のシートに続きのリストを貼る。 (5)リストの最後(文字が記入してある箇所)まで他のシートへのコピーが終わるまで ワークシートを変えて続ける。 以上です。 よろしくお願い致します。 エクセルは2003、2007使用しております。
- ベストアンサー
- その他MS Office製品
- VBA初心者です。シート1の文字列をシート2のリストにコピーしたい。
VBA初心者です。 ExcelのVBAでシート1の文字列をシート2のリストに追加したいのですが すでにリストに登録されているものは(重複するもの)追加しないようにしたいのですがうまくいきません。 シート1のA列に「商品名」B列に「色番号」が入力されています。 A B 1ペン 123 2ペン 233 3ペン 123 4ペン 222 ※A列とB列はセットです。 このようになっていたとして、それぞれに変数A・Bを用意して シート2の商品リストに入れていくのですが 1行目と3行目のように重複するものは(すでにリストに入っているもの) 1つ目だけをリストに加え、2回目以降のものはリストに加えたくありません。 条件をIF文で書いているのですが、重複するものの判定がうまくいかず 困っています。 シート1には毎回違う納品書がくるのでフィルタ等で重複を 探すことはできません。
- 締切済み
- オフィス系ソフト
- シート内の一部のセルを別シートにコピー
Excelのマクロ(VBA)の記載方法について お分かりになる箇所だけでも結構ですので、 どなたかご教授を願い致します。 シートX A B C 1 data1 data2 data3 2 x data7 data8 3 data4 data5 data6 4 data7 data8 data9 シート Y A B C D 1 length 3 (任意) (任意) 2 xxxx (任意) (任意) (任意) 3 zzz (任意) (任意) (任意) 4 (空白)(任意) (任意) (任意) 上記のような2つのシート(同一Excelファイル内)があって、 シートXの一部のセルを次の条件(1~4)でシートYにコピーしたい場合 1.コピー元の列の数は、シートYの "length"と書かれたセルの右となりの数字 とする(上記では3なので、A,B,C列をコピー対象) 2.コピー元の行の数は、シートXの1~4行目までとするが、 シートXのA列のセルが"x"だったら、その行は全てコピーしない。 3.コピー先(Y)の列は、コピー元(X)の列と一つずれてコピー(BならCに、CならDに) 4.コピー先(Y)の行は、シートYのA列で1行からで始めて空白セルになった行からコピー開始。 (上記では、A列で空白セルのある4行目からコピー) 上記条件で、下記のシートYを作成したいのですが、 この場合どようなマクロ(VBA)で実現できますでしょうか。 コピー結果(シートY) A B C D 1 length 3 (任意) (任意) 2 xxxx (任意) (任意) (任意) 3 zzz (任意) (任意) (任意) 4 (空白) data1 data2 data3 5 (任意) data4 data5 data6 6 (任意) data7 data8 data9
- ベストアンサー
- オフィス系ソフト
- Excel VBA Sheet2で指定した条件でSheet1の行削除
Sheetが2つあるExcelブックがあります。 Sheet2で検索条件(列とキーワード)を指定し、 この条件でSheet1を検索、 Sheet1で検索にヒットした行を行削除したいと考えています。 汎用性を高める為、Sheet2で指定する検索条件は可変とし、 検索対象とする列とキーワードは任意のものを必ず指定(""は無し)。 列&キーワードをひとつの検索条件として、 Sheet2の2行目~最終行までLoopしたいのです。 InStrを使用するなど、部分的には分かるのですが、 2つの条件を同時に変えながらLoopさせる方法が 色々試してみましたが、どうしても分かりません。 VBAに詳しい方、同様の処理をしたことがある方、 どうか助けてください!宜しく御願い致します。 [Sheet1] ・・・ 元データ A B C ---------------------------- 1 あ ---------------------------- 2 い 該当 ---------------------------- 3 う 閉鎖 ---------------------------- 4 え 該当 ---------------------------- 5 お ---------------------------- [Sheet2] ・・・ 行削除する範囲とキーワードを指定。 A B ---------------------------- 1 列 キーワード ---------------------------- 2 A あ ---------------------------- 3 B 該当 ---------------------------- 4 C 閉鎖 ---------------------------- [求めている結果] 1, 2, 3, 4行目が削除される
- ベストアンサー
- Visual Basic
お礼
早速ご回答いただきましてありがとうございました。 コピー&ペーストしたら正常に進みました。 マクロボタンを作成しなくとも自動で実行される方法もあるとは、驚きでした。しかも、エラー時にメッセージボックス表示までされるようにしていただき、こちらの意図を汲み取っていただき、本当にすごい方だと感謝の念が尽きません。自分の勉強不足を痛感したので、もっと勉強したいと思います。