Excel VBAで範囲内のデータを検索条件に一致したデータを入力する方法

このQ&Aのポイント
  • Excel VBAを使用して、ある範囲内のデータを検索条件に一致したデータを入力する方法を探しています。具体的には、Sheet2のB列のデータがSheet1のB列のデータと一致した場合に、Sheet2のA列に対応するデータを入力したいと考えています。しかし、作成したマクロがうまく機能しないため、質問させていただきました。
  • Excel2003を使用しています。作成中のマクロでは、事前に選択した範囲内のデータに対して処理を行い、A列のデータは日付、B列のデータは数値となっています。以前に示していただいたサンプルコードを参考にしながら試しているのですが、思うように結果が得られません。どのように修正すれば良いでしょうか。
  • この問題については、VBAの知識を持つ方に質問させていただきたいと考えております。マクロを作成している中で発生している問題点を具体的に記載し、アドバイスをいただければ幸いです。お手数をおかけしますが、よろしくお願いいたします。
回答を見る
  • ベストアンサー

Excel VBA ある範囲内で検索条件に一致したデータを入力する

Excel VBA ある範囲内で検索条件に一致したデータを入力する Excel2003を使用しています。 Sheet2で選択している範囲内のB列のデータがSheet1で選択している範囲内のB列のデータと一致していたら、そのA列のデータをSheet2のA列に入力するというマクロを作成中ですが、うまくいきません…。 Sheet1とSheet2の選択範囲については、このマクロを実行前に都度選択するようにし、A列のデータは日付、B列のデータは数値です。 以前、示していただいたサンプルを参考にコードを書き換えて試していますが、なかなか思うようにいかず、質問させていただきました。 よろしくお願いします。

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

  • ベストアンサー
noname#130090
noname#130090
回答No.5

空欄を回避するシステムが仇になってますね。 乗りかかった船なので、これでどうでしょう? Sub all_check()   Dim i As Integer, j As Integer   For i = 0 To Sheets(1).Range("B65536").End(xlUp).Row - 1     For j = 0 To Sheets(2).Range("B65536").End(xlUp).Row - 1       If Sheets(1).Range("B1").Offset(i) = _           Sheets(2).Range("B1").Offset(j) Then         Sheets(2).Range("A1").Offset(j) = Sheets(1).Range("A1").Offset(i)       End If     Next j   next i End Sub

KOH3193
質問者

お礼

zen_kuukai さま、お礼が遅くなり申し訳ありません。 教えていただいたコードを参考にさせていただき、無事完成しました! 最後までお付き合いくださいまして、ありがとうございました。

その他の回答 (4)

noname#130090
noname#130090
回答No.4

ああ、動いて一安心です。 >ひとつ確認というか質問ですが、このコードは選択範囲内の1番上の行は、 >それぞれのSheetの1行目(行番号1)ということですよね。 その通りです。まず、   Do While Sheets(1).Range("B1").Offset(i) <> 0     i = i + 1   Loop で、第1シートのB1から1つずつチェックしながらOffset(i)で下に移動します。 これでセルが「""」つまりなにも入力されていなければ止まります。 (よって、B1になにも入力されていなければ動きません) こんどは上記のLoop文の中に     For j = 0 To Sheets(2).Range("B65536").End(xlUp).Row - 1         If Sheets(2).Range("B1").Offset(j) = "" Then Exit Do     Next j のFor文で第2シートのB1から下に検索していきます。 これもセルが「""」(なにも入力されていない)なら止まります。 で、第1シートのB行のあるセルと第2シートのB行のあるセルが同じだったら 第1シートのB行の左隣(つまりA)のセルの値を第2シートの左隣に書き出してね。 という動きです。 なので、「Sheets(1).Range("B1")」をすべて第1シートの最初のB行セル でもって、「Sheets(2).Range("B1")」をすべて第2シートの最初のB行セル と書き換えれば(例: 第1シートのB4が最初ならSheets(1).Range("B4")) 動くはず。たぶん。

KOH3193
質問者

お礼

zen_kuukai さま、何度もありがとうございます。 手直ししてくださったコードの私なりの解釈が間違っていなかったようで良かったです。 実際に使用するデータで、使えるコードになるよう、選択範囲の最上行を取得して実行してみたところ、希望通り動作しました。 選択範囲のパターンをいくつか試していたら、Sheet1で範囲を選択する際、B列に空欄が含まれる場合があることがあり(ページをまたがっているときなのですが)、Sheet1の選択範囲の最下行も取得して、下記のようにしてみましたが、うまくいきません。 Do While Sheets(1).Cells(r1, 2).Offset(i) <> Sheets(1).Cells(r2, 2) (r1は選択範囲の最上行、r2は選択範囲の最下行です) 何度も恐れ入りますが、ここがクリアできれば完成しそうなので、もう少しお付き合い願えないでしょうか? よろしくお願いします。

noname#130090
noname#130090
回答No.3

すみません。 親切で入れたつもりのExitが間違った動きをしていました。 これで動くと思われます。というか、動きました。 Sub all_check()   Dim i As Integer, j As Integer   Do While Sheets(1).Range("B1").Offset(i) <> 0     For j = 0 To Sheets(2).Range("B65536").End(xlUp).Row - 1       If Sheets(1).Range("B1").Offset(i) = _           Sheets(2).Range("B1").Offset(j) Then         If Sheets(2).Range("B1").Offset(j) = "" Then Exit Do         Sheets(2).Range("A1").Offset(j) = Sheets(1).Range("A1").Offset(i)       End If     Next j     i = i + 1   Loop End Sub 混乱させてしまい申し訳ない。

KOH3193
質問者

お礼

zen_kuukai さま、再度の回答ありがとうございます。 早速、試してみたところ、無事動作しました。 ひとつ確認というか質問ですが、このコードは選択範囲内の1番上の行は、それぞれのSheetの1行目(行番号1)ということですよね。 実際に使用するデータで実行してみたときは、前回と同じく何も変化が起きなかったのですが、Sheet1とSheet2の選択範囲の最上行を1行目に合わせて実行してみると、希望通りの結果となりました。 今回の質問では、Sheet1、Sheet2ともに、選択範囲の最上行も最下行もバラバラですので、教えていただいたコードを参考にさせていただきながら、少し手を加えてみたいと思います。

noname#130090
noname#130090
回答No.2

すでに回答がついていますが、 こうじゃないかなあと思ったので Sub all_check()   Dim i As Integer, j As Integer   Do While Sheets(1).Range("B1").Offset(i) <> 0     For j = 0 To Sheets(2).Range("B1").End(xlDown).Row - 1       If Sheets(1).Range("B1").Offset(i) = Sheets(2).Range("B1").Offset(j) Then         if sheets(2).Range("A1").Offset(j) then Exit For         Sheets(2).Range("A1").Offset(j) = Sheets(1).Range("A1").Offset(i)       End If     Next j     i = i + 1   Loop End Sub ただsheet1のB列に同じ数字が2個以上あると 一番下に出たA列の数字しか反映しませんが。 1番目の回答の方で十分でしたら読み飛ばしてください。

KOH3193
質問者

お礼

zen_kuukai さま、回答ありがとうございます。 教えていただいたコードで試してみましたところ、エラーメッセージ等は表示されないものの、何も変化が起きませんでした。 >ただsheet1のB列に同じ数字が2個以上あると >一番下に出たA列の数字しか反映しませんが。 これ(上矢印)に関しては、Sheet1の選択範囲内でB列に同じ数字が2個以上あることはないので、全く問題なかったのですが…。 記載していただいたコードでテスト後、投稿してくださったようですが、もしよろしければ、Sheet1とSheet2の範囲選択をどのようにされていたかを教えていただけないでしょうか? エラーメッセージでも表示されれば、何かしらのヒントを得られそうなのですが、マクロを実行しても何も変化が起きないので、早速行き詰っています。

  • Yosha
  • ベストアンサー率59% (172/287)
回答No.1

前のサンプルがどういったものか分からないので、ごく平凡に。 但し、データ範囲および比較するセルの行番は、sheet1、sheet2 共に同じ1~15行であるとします。 Sub test()  Dim r As Integer, c As Integer  Dim n As Integer, n1 As Integer, n2 As Integer  Sheets("sheet2").Select  c = 2  For n = 1 To 15   r = n   n2 = Cells(r, c).Value   n1 = Sheets(1).Cells(r, c).Value   If n2 = n1 Then    Cells(r, c-1).Value = Sheets("sheet1").Cells(r, c - 1).Value   End If  Next End Sub で、試してみてください。 For … Next 文で、変数に n を設定し、行番 r を定義しているのは、シート1,2の各選択範囲が違ったときに、ここでそれぞれの行番を定義すれば (cf. r1 = n + 1、r2 = n + 5 のように) よいので、拡張用にと思ってこの様にしました。

KOH3193
質問者

お礼

Yosha さま、回答ありがとうございます。 Sheet1、Sheet2ともに選択範囲(行番号)が同じである場合のコードを教えていただきましたが、今回の質問に関しては、行番号が同じになることはほぼありませんので、回答文の最後に記載されている応用方法で試してみたいと思います。 ありがとうございました。

関連するQ&A

  • Excel Vba でデータの範囲を知るには?

    Excelを使用していますが、マクロ(VBA)で、シートのデータの範囲を知るにはどうすればよいのでしょうか。  印刷プレビューを行うと、自動的にページ数が求めらていますが、これは、シートのデータの範囲(列及び行の最大値)を判別しているからできるのだと思います。  これを、VBAで行、及び列のMAX値を取得したいのですが、そのメソッド(プロパティ)を知りたいのです。  どなたかご教授ください。

  • エクセル VBAで2つのデータを比較して、一致するものを検索したい

    以下のような事をしたいと思っています。 VBAは今まで使った事が殆どなく困っております。 仕事で作らなければならず、宜しくお願い致します。 エクセルVBAで、既存と新規という2つのシートから 2つの条件(A列とB列の完全一致)で行を検索して 一致したものを探し出します。 一致したら「新規シート」の該当した行の売上列のデータを 「既存シート」の該当月の列へコピーしたいと思っております。 また、「新規シート」には「既存シート」にないデータが 存在するので、一致から漏れた行は「既存シート」へ 新たに追加のデータとしてコピーしたいと思っています。 イメージ↓ 既存シート) 商品名 |製造地|6月(製造月の売上)|7月(製造月の売上) a     |あ   |¥150      | b     |い   |¥200      | (空白)  |(空白)|          | 新規シート) 商品名 |製造地 |7月(製造月の売上)| a     |あ   |¥300      | b     |い   |¥100      | c     |う   |¥250      | 上記の2シートで、商品名と製造地の2つが一致していれば 「新規シート」の7月の列のデータを「既存シート」の 7月の列にコピーし、「既存シート」に存在しない 「新規シート」の商品名”c”の行のデータを「既存シート」へ 新たに商品名”c”の行を作成しコピーしたいと思っています。 出来上がり後の(既存シート) 商品名 |製造地 |6月(製造月の売上)|7月(製造月の売上) a      |あ   |¥150      |¥300 b      |い   |¥200      |¥100 c      |う   |¥0        |¥250

  • 【Excel VBA】条件に合うデータの転記

    Excel2003を使用しています。 2つのシート間の特定の範囲内で、条件に合うデータを転記したいのですが… Sheet1(A1:C41) ← 一定範囲 Sheet2(選択範囲) ← 都度、選択範囲取得 Sheet2の選択範囲内で、A列とB列の値が、Sheet1のA列とB列のそれぞれの値と一致した場合、Sheet1のC列の値をSheet2のE列に転記したいのですが、こういう場合、コードはどのように書いたらいいでしょうか? 条件に合ったものを順に転記していくコードは書いたことがあるのですが、特定の範囲内ということや、転記する場所が指定されたりしていて、つまづいています。 よろしくお願いします。

  • 【Excel】一致するデータの検索

    Excel2003を使用しています。 Sheet1のB列の値がSheet2のA列に入力されている値と一致したら、Sheet1のC列とD列の値をSheet2のC列とD列に表示させたく、VLOOKUP関数を使用したところ、Sheet1のB列とSheet2のA列のデータの並び方(順序)が同じではないためか、VLOOKUP関数ではできませんでした。 こういう場合、マクロで処理することは可能でしょうか?可能であれば、どのようにコードを記述すればいいでしょうか? Sheet1のデータは4行目から、Sheet2のデータは6行目から入力されています。 よろしくお願いします。

  • エクセルVBAで2つの条件が一致すれば結果を転記

    エクセルVBAの書き方を教えてください。 以下3つのエクセルファイルがあります。 ・F依頼(使うSheet:ナンバリング ・F結果(使うSheet:OKリスト ・F回答(使うSheet: F結果の「OKリスト」シートのA列3行目に結果が入っています。     A列         B列     C列 3行目 OK(結果)    12345678    9012 F依頼の「ナンバリング」シートには、過去からの番号が書き続けられています。     A列      B列     C列     D列 2行目 日付    12345678    9012    OK(結果) OKリストのB&Cの12桁をナンバリングシートのB&Cから検索し 一致するものがあれば、ナンバリングシートのD列(結果)にOKリストのA列(結果)を 貼り付けたいです。

  • Excel VBAを使って会員検索

    Sheet1のA列に会員番号、B列に氏名、C列にフリガナ、D列に住所といったデータがあります。 Sheet2のA列に会員番号のみがあります。 この2つのデータを照合して、一致した場合のみ、Sheet1の該当会員データの横のセルに“一致”もしくは“1”などの値(上の例だとSheet1のE列に)を入力できるようなVBAを組みたいのですが、教えていただけますでしょうか?

  • ExcelのVBAマクロ作成で他のExcelから条件つきでデータを取り込みたい

    毎日の在庫データが記載されたファイル群の中から特定のデータのみを他のファイル(貼付け先ファイル)の一つのシートに縦一列にして取り込みたいのですがどうすればよいのでしょう? 具体的には… ・在庫データは年ごとにファイルが分かれている(ファイル名「在庫2003年.xls」など) ・在庫データファイルは月ごとにシートが分かれている(シート名「2003年04月」など) ・シートの中のA列に「日付」(上記のシートなら2003/4/1から2003/4/30まで)、D列に「製品A在庫数」、F列に「製品B在庫数」が入力されており他の列にも様々なデータが入力されている。 ・貼付け先ファイルはA列に日付(2000/1/1~2006/12/10)が入力されている。 この状況で、例えば2003年4月と指定してマクロを実行すると、指定の在庫データファイルのシートから「製品A在庫数」と「製品B在庫数」を貼り付け先ファイルの、日付に対応したB列、C列の部分に入力してくれるようにしたいのですが、VBAの記述の仕方がわかりません。どうすればよいのでしょう? お願いします!

  • エクセルVBAで困ってます。

    エクセルVBAで困っています。 データ入力済みのシートが2つあります。 シート名を「Sheet1」「Sheet2」とします。 「Sheet1」のA列のデータが「Sheet2」のA列のデータと一致した時に それぞれのシートのセル番地を取得したいのですが出来ません。 教えて下さい。 データの並び順は「Sheet1」と「Sheet2」で異なります。

  • Excelで2つの条件が一致したデータの抽出

    Excelで2つの条件が一致したデータの抽出 こんにちわ。 タイトルの通り、Excelで2つの条件が一致したデータの抽出作業を行っています。 Sheet1にデータがあり、以下のような構成なっています。 A列    B列    C列 日付   社員名   売上金 6月1日 鈴木     3万円 6月1日 今井     2万円 6月2日 川口     10万円 6月3日 鈴木     4万円 6月3日 野口     1万円 6月4日 鈴木     3万円 6月7日 佐藤     6万円 6月7日 今井     2万円 6月7日 黒木     7万円 6月9日 野口     3万円 A列の日付は不連続かつ同一日付のものもあります。 Sheet2に以下のフォーマットを作成してあります。 1行目:B1セルから連続する日付(6/1~6/30まで) A列:A2から社員名(社員名は各セルに固定) 6月1日 6月2日 6月3日 6月4日 6月5日 ・・・ 鈴木 佐藤 今井 川口 野口 黒木 Sheet2のセルに、Sheet1の表の日付と社員名が一致した売上金のデータを反映させたいのです。 そこで例えばSheet2のB2セルには以下の関数を入れました。 B2=IF(ISNA(MATCH($A$2:$A$9&$B$1:$N$1,INDEX(Sheet1!$C$2:$C$24&Sheet1!$A$2:$A$24,))),"",INDEX(Sheet1!$D$2:$D$24,MATCH($A$2:$A$9&$B$1:$N$1,INDEX(Sheet1!$C$2:$C$24&Sheet1!$A$2:$A$24,),0))) この関数を入れると、該当するところには売上金のデータが反映されるものの、それ以外のセルには全て#N/Aが表示されてしまいます。 この#N/Aを表示させないようにするには、関数をどのようにすればいいのでしょうか? エクセル初心者なので、分かりやすくご教授願えたら…と思います。 よろしくお願いいたします。 使用OS:XP  使用ソフト:Office2000 Pro.

  • Excel VBA アクティブセルからある一定のセルまでの範囲選択

    Excel VBA アクティブセルからある一定のセルまでの範囲選択 Excel2003を使用しています。 アクティブセルからC列に『計』と入力されている行の1行上のD列までを選択状態にするマクロを作成しようとしています。 C列に『計』と入力されている行は下記のように複数あるので、アクティブセルの行以下に入力されている次のC列の『計』の1行上までとしたいのですが、どのようにコードを書いたらいいでしょうか? 例えば… A2セルをアクティブにしていてマクロを実行するとA2:D3が選択状態に A7セルをアクティブにしていてマクロを実行すると、A7:D9が選択状態になるように という具合です。 わかりづらくて申し訳ありませんが、よろしくお願いします。    A     B     C     D 1  日付    №   品名    金額 2  1/1     1    ○○○   1,000 3  1/2     2    ×××   1,500 4              計      2,500 5 6 7   1/1     5    ○×○   2,000 8   1/3     6    ××○   1,200 9   1/4     7    ×○○   2,500               計      5,700            :            :

専門家に質問してみよう