Excel VBAでB列を検索して1行下をコピーする方法

このQ&Aのポイント
  • ExcelのVBAを使って、B列を検索してそのセルの1つ下の行をコピーする方法について教えてください。
  • データシートにはA1~G1までの1行目から1000行目までのセルにランダムな数字が入っており、コマンドボタンを押すことで入力した数字をB列を下に検索します。
  • 例えば、入力した数字がB列に存在する場合、そのセルの1つ下の行(A列~G列まで)を別のシートにコピーする処理を実現する方法を教えてください。
回答を見る
  • ベストアンサー

Excel VBA B列を検索して1行下をコピぺ

はじめまして。 VBAを始めたばかりですが、自分ではどうにもならないので、教えていただければと思い、初めて質問致します。 A1~G1、1行目から1000行目まで各セルに数字がランダムに1つずつ入っているデーターSheet1があり、コマンドボタンを押すことによってMsgBoxに入力した数字をB列を下に検索していき、例えば、数字の8が入力されたら、B1から下にB列に8が出現したらそのセルの1つ下の行(A列~G列まで)をコピーしてSheet2に抽出したいと考えているのですが、なかなか出来ず、困っています。 イメージとして A B C D E F G H I 1 5 14 30 25 30 3 9 2 22 34 6 7 29 49 3 3 1 8 20 4 10 6 45 4 30 15 34 50 2 5 9 5 11 8 45 7 6 20 1 6 40 8 48 25 36 4 10 7 21 22 30 28 6 7 36 8 2 3 50 2 1 43 6 と、データがSheet1に仮にあって、8が入力されたなら4行目の 30 15 34 50 2 5 9 と 6行目 40 8 48 25 36 4 10、7行目 21 22 30 28 6 7 36という様に抽出されてSheet2に 上から順に貼り付けられる様にしたいので、皆様の御知恵をお貸しいただければと 思っております。かなり複雑かとは思いますが、どうか宜しくお願いいたします。 FINDやOFFSET、IF文、ループ等を使ってみましたが私のレベルでは全く話になりませんでした。 まだVBAかけだしなもので、なるべ簡単なくプログラムでお願いいたします。

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

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

こういう文脈での「簡単」とは,大概の場合「1行ずつデータを舐め回して調べる」一番効率の悪い方法ですね。 手順: コントロールツールボックス(Excel2007以降ではActiveXコントロール)のコマンドボタンをシート1に配置する 右クリックしてコードの表示を開始し,現れたシートに下記をコピー貼り付ける private sub CommandButton1_Click()  dim h as range  dim res as variant  dim i as long  res = inputbox("Number") ’ if res = false then exit sub ’ if not isnumeric(res) then ’  msgbox "INPUT NUMBER" ’  exit sub ’ end if  worksheets("Sheet2").cells.clearcontents  for each h in range("B1:B" & range("B65536").end(xlup).row)  if h.value - res = 0 then   i = i + 1   worksheets("Sheet2").cells(i, "A").resize(1, 7).value = cells(h.row + 1, "A").resize(1, 7).value  end if  next end sub 「青い三角定規」ボタンをクリックしてデザインモードを終了し,コマンドボタンをクリックしてマクロを実行する。 #「実際のエクセル」が,あなたがご質問に書かれたようではなくもっとふつーに「1行目に何かタイトル行」「2行目から実データ」だった場合は,もうちょっとだけ簡単な(汎用的な)書きぶりのマクロにする事もできました。

nanjyamonjyahi
質問者

お礼

keithin様のおかげでうまく動作させる事が出来ました! 初めてネットで質問をさせていただいたのですが、こんなに的確でわかりやすい御答えを頂戴することが出来るとは正直思っていなかったので、感動致して居ります。keithin様のような方がいらっしゃるOKWAVEをこれから積極的に活用していきたいと考えております!というかkeithin様がすばらしいのですがね! なにぶんVBAカケダシ文系人間なので、失礼の無い様にと思い、自分なりに理解してからということで、御返事に時間がかかってしまいました。どうにかこうにか理解しようとまだ頑張っているのですが、やっている事はなんとなくわかるのですがfor文の中身がちんぷんかんぷんで、変数やら代入やらの所で頭爆発してます。これからさらにVBA勉強頑張ります。本当に有難う御座いました! ついでといっては申し訳ないのですが、アドバイスいただいた「もっとふつーに「1行目に何かタイトル行」「2行目から実データ」だった場合」というケースのマクロを御教えいただけないでしょうか?(タイトル行は数字列1、数字列2、・・・数字列7という感じで!?) 最初に書いてくださったプログラムとの差異を比較しつつ、今回の質問で使われている書式の内容を、理解だけでなく、習得してしまいたいと考えております。御手数でなければ、どうか宜しくお願い致します。

その他の回答 (2)

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

前回のマクロを消して次のマクロに入れ替えます。 private sub CommandButton1_Click()  dim h as range  dim res as variant  res = application.inputbox("Number", type:=1)  if res = false then exit sub  worksheets("Sheet2").cells.clearcontents  range("1:1").copy destination:=worksheets("Sheet2").range("A1")  for each h in range("B2:B" & range("B65536").end(xlup).row)  if h.value =res then   h.offset(1).entirerow.copy destination:=worksheets("Sheet2").range("A65536").end(xlup).offset(1)  end if  next end sub 貼り付け先を1行ずつカウントアップしていくような無様なことをしなくてもよくなり,つねに「1番下の行の1つ下の空の行」に貼り付ければよくなりました。 #参考: 「1行ずつ舐め回さない」(=ループを回さない)マクロ private sub commandbutton2_Click()  dim res as variant  res = application.inputbox("NUMBER", type:=1)  if res = false then exit sub  application.screenupdating=false  with range("B1:B" & range("B65536").end(xlup).row)  .offset(1, 6).value = .value  end with  range("H:H").autofilter field:=1, criteria1:=res  worksheets("Sheet2").cells.clearcontents  range("A:G").copy destination:=worksheets("Sheet2").range("A1")  range("H:H").delete shift:=xlshifttoleft  application.screenupdating=true end sub

nanjyamonjyahi
質問者

お礼

keithin様、素早い御返事有難う御座いました。どうにかこうにか最初のプログラムと2番目のプログラムを詳しく理解する事が出来ました。IsNumeric関数、Application.InputBoxとInputBox関数の違い、ForEachInNextとFor文の違い、マクロ記憶での記述とは違うSheet内データの消去法、シートの最終行から上にデータ行の最後の行の取得方法やコピーの仕方でもcopy命令を使わない代入によるコピー!?やentirerowでまた違ったり、回し方でもオブジェクトの回数分だったり変数を1つずつ増加させて行を移動していく方法であったりと、とにかく、色々な方法を御教授いただき、有難う御座います!3番目のプログラムはまだ理解出来ていませんが、マクロ記憶のプログラム程度しか知らなかった私を一歩踏み出させてくれたkeithin様には非常に感謝致しております!早速VBAの本を買ってきて読んでおります。まずは簡単なと思ったので、次は役立つわかりやすいサンプルがたくさん載っている本を買おうと思っています!VBA最高!!プログラム超面白い!これも全てkeithin様のおかげです!本当に有難う御座いました!

noname#252332
noname#252332
回答No.1

sheet1にuserformを挿入してtextbox1とcommandbutton1を貼りつけて Private Sub CommandButton1_Click() y2 = 1 For y1 = 1 To 1000 If TextBox1.Text = Sheet1.Cells(y1, 2) Then For x = 1 To 7 Sheet2.Cells(y2, x) = Sheet1.Cells(y1 + 1, x) Next y2 = y2 + 1 End If Next End Sub こんな感じで。y1は検索行、y2はコピー先、xはコピー用です。

nanjyamonjyahi
質問者

お礼

御返事遅くなりました!なにぶんカケダシなもので、なにせ、inputbox関数はわかってもuserformには手を出していなくて、すみませんでした。inputbox関数を使って教えていただけたら嬉しいのですが、御手数でなければ宜しくお願い致します。

関連するQ&A

  • エクセル VBA

    最終行から順番に下へ同列で入力するVBAを教えて下さい。 EXCELのVBAで教えて下さい。 シート1のA列にはB列が入力されると自動入力されるNo.があり、C~G列もB列が入力されると自動入力されます。 B列には日付が、H列には3~4桁の数字が入力したいのですが、 入力行は必ず最下行のセルB、Gな為、VBAでフォームを作成し、 入力実行ボタンを押すことにより、最下行のセルB、Gに反映されるように したいです。 又、上記入力後に、シート2のH~N列をコピーして、シート3のA~G列に値のみの貼り付けを行い保存した後、シート3のA~G列をコピーして csvファイルを作成して保存したいです。 一連の流れを、フォームの入力実行ボタンを押すことで実行したいのですができるのでしょうか? 宜しく御願い致します。

  • エクセルVBAについて

    エクセルVBA初心者です。 以下のような処理をしたくて、色々な質問等を見て組み合わせて動かしてみたものの、なかなかうまくいかず困っております。アドバイスいただけないでしょうか? 「Sheet1」に以下のようなデータがあります。 <A列> <B列> <C列> ok59  886 ok88 ok70 777 ok75 okGG 478 ok66 ok97 358 ok58 ok69 764 ok47 ok39 368 ok40 okGG 794 ok68 ok85 463 ok75 ・    ・ ・ ・    ・ ・ A列とC列にはそれぞれ「ok+2桁の数字or文字」が入っています。 B列は特に今回は使わないデータですが、数字が入っています。 やりたいことは以下の通りです。 A列に「GG」を含む文字列(実質okGGしかない状態です)が出てきたとき、 その1つ下の行のA列とC列のセルをピックアップし、背景色をピンク色にします。 上の例だと、A列は「ok97」と「ok85」、B列は「ok58」と「ok75」のセルが該当します。 さらにピンク色にピックアップしたセルのから、頭の「ok」を除いた数字を3.5倍した数字を、 別のシートに抽出したいのです。 なので、上の例を使用した場合の抽出したデータは以下のようになります。 <A列> <B列> 339.5 203 297.5 262.5 ちょっと複雑なのですが、どのようにするのがよいのでしょうか? また、別シートに抽出したいのですが、 「Sheet1」の特定のセルに日付が入っているので、 できればその日付の名前のシートを作り、そこに抽出できたらなぁ・・・と考えています。 「Sheet1」にデータを貼り付けて、ボタンをポンっとおしたら日付の名前のシートができて、 欲しいデータが抽出されていく・・・というイメージです考えています。 どうぞよろしくお願いします。

  • 文字列を検索しその列をコピーする(VBA)

    よろしくお願いします。 OS:WINDOWS 2000 PRO 環境:OFFICE 2003 エクセルのVBAについての質問です。 A列には数値コードが入っています。 そのコードは"1"と"2"に分類されてます。 マスターはSHEET1で、このマスターから コード1はSHEET2に、 コード2はSHEET3に 振り分けたいのですが、どうもうまくいきません・・・ A列にはコード"1" "2"以外に空白セルが存在します。 空白セルは無視したい。。。 それとこのデータはDBから抽出するのですが、 抽出したデータは規則性はありません。 抽出するごとに"1"と"2"と"空白"はランダムなので、 LOOP等のマクロを調べてやってみたのですが、出来なくて週末になってしまいました。 A列からコード1とコード2を検索して、 ヒットしたコードの行ごと各SHEETにコピーして、 なおかつ各シートA列の入力されていない一番下の セルにコピーしたいのですが、検索でヒットした 上から順番に。。。 これをLOOPと組合わせれば、各シートにコピーするのは 問題ないような気がします。。。 Sub AAA_BBB() .Copy Worksheets("Sheet2").Range("A65536").End(xlUp).Offset(1, 0) End With End Sub LOOP等で上記の条件を満たせる方法はないでしょうか。 ご教示を、よろしくお願いします。

  • EXCEL VBAで

    EXCEL VBAで シート1のA2~G2までの列にA,B,C,D~と題名があり、それぞれの下の行には数字が並んでます。シート2のA2~G2までの列にもA,B,C,D~と題名がありますが、ランダムに並んでます。シート1のAの行を、シート2のAの行に、BにはBへという風にコピーをさせるにはどのようにすればよいでしょうか。またシート1A~Gのどれかが欠けている場合もあります。その場合はシート1にあるもののみコピーすることとします。 わかりにくいかも知れませんか、どうかよろしくお願いします。

  • エクセル最終行の下に貼り付け

    VBAで以下の作業を教えて下さい。 Sheet1のB列に入力済みのセルが何行かあります。 その入力済みのセルの値をコピーして、Sheet2のA列の入力済みの最終行のすぐ下の行に貼り付ける。 *Sheet1のB列の入力済みのセルの行数は毎回変わります。 *Sheet2のA列には一番最初は何も入力されていない状態です。 宜しくお願い致します。

  • エクセルで、検索したセルの下の行を出したいときは?

    たとえば、一つのシートに数字が入った表があるとして(シート1)、 隣のシート(シート2)でA1のセルに数値が入るとシート1から 同じ数値を探し出す(作業しているのはB1)。 その探し出したセルの下の行にあるものを出したいのですが、 その方法がわかりません。関数の数式の中で、 ”+1行”とか、”+1列”というのは、 どういった入力をすればいいのでしょうか? ちょっと説明がうまくできないので、伝わりづらいと 思いますが、補足していきますので、よろしくお願いします。

  • エクセルVBAで、一部のセルの結合をしたい

    エクセルの表で、同じ内容の行を結合したいのですが、一か所の列のみ結合をせずそのままにしておく必要があります。どなたかVBAを教えていただけないでしょうか? イメージとしては次のようになります。 a b c d e 1 g a b c d e 2 g a b c d e 3 g これを下記のようにしたい a b c d e 1 g       2       3 社内システムに入力されているデータをCSVにて抽出しそれをエクセルで加工しているのですが、 aを物件番号とするとb~e,gは物件1件につき一個の項目が入っているのに対し、数字の部分のみ1件につき複数の内容が選択されているのです。そのため、データを抽出すると数字のセル部分以外もすべての行でデータが落ちてくるのです。 そこで、見やすくするために、1~3の内容以外の部分はセルを結合させたいのです。 ここでは3行にしていますが、1行のときもあれば7行くらいになっていることもあります。 列はすべて同じ数になりますが現段階では何列か覚えておりません。すみません。 説明が下手で申し訳ないのですが、わかっていただけるでしょうか? 私はVBAを習い始めたばかりでまったくわからず、自分で作成することができませんでした。ネットで探したものをコピペしてみたりしたのですが、どうもうまくいかず・・・ でもなんとかしたいのです! みなさんのお力をお借りしたいと思います。よろしくお願いします。

  • エクセル VBA で列番号を足す方法は?

    こんにちは。大変お世話になっています。 Set btd = Range("d2:z2").Find(bmd) といったVBAを使用し、あるセル番地を抜き出しました。 そのセルの列番号のみを抜き出して、そこから列番号を右へいくつか動かしたいのですが、その方法がわかりません。 別の定義で出した行をgとして Cells(g, btd.Column)でセルの指定をしました。 このセルがa1だとします。 次の作業として、b1のセルを指定したいのですが、その方法がわからないのです。 b=Cells(g, btd.Column) と定義して、 b.Offset(0, 1).Value などと書いてもエラーになってしまいます。 行番号なら数字を足したり引いたりすればできたのですが、アルファベットの列番号の場合はどうしたら良いのでしょうか? すみませんがよろしくお願いします。

  • エクセル 合計条件が行と列の時の計算式

    エクセルで、データがはいっている”データシート”と 合計を表示させたい”合計シート”があり、 合計シートに同じ番号の品名でおなじ日付のものを合計して 表示させたいと思っています。 データシートには、以下のように品名が同じものが複数はいっています     A列 B列 C列 D列・・・・Z列これからさらにデータが増えていきます 1行目品名 4/1 4/4 4/5 2行目Z100 10  20  30 3行目Z300 40  50  60 4行目Z100 11  22  33 5行目Z200 70  80  90  ・  ・ 200行くらいデータがありこれからさらにデータが増えていきます。 合計シートもデータシートと同じような形で データシートのA列の 同じ番号&同じ日付 の数字をそれぞれセルB2からZ200まで合計した 数字を表示させたいです。     A列 B列 C列 D列・・・・Z列 1行目    4/1 4/4 4/5 2行目Z100 21  42  63 3行目Z300 40  50  60 4行目Z200 70  80  90  ・  ・ 200行目 合計シートのB2セルに入力したのですが、#VALUEエラーがでてしまい ました。 =SUMPRODUCT((データシート'!$A$2:$A$500=合計シート!$A2)*(データシート'!$B$1:$Z$1,合計シート!$B1)) SUMIFでも試してみたのですが、エラーがでてしましました。 説明が分かりにくく申し訳ないですが、どなたか分かる方いらしたら 教えてください。よろしくお願いします。

  • excelVBA でA+B列をファイル書き出し

    excel2003の VBA で、開いているシートのA列(項目行)とB列(データ)を抜粋してB列の1行目のセルに入力されているデータをファイル名として新しいEXCELファイル(B列の1行目のセルに入力されているデータ.xls)として書き出したいのです。また、B列以降も、A列+C列で1ファイル、A列+D列で1ファイル・・・のように列にデータが記載されているまでファイルとして書き出したいのです。 このような書き出しVBAを教えて下さい。宜しくお願いします。