• 締切済み

Exel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。 A列     B列     C列       商品名  商品番号  コード モータ  U-1325-L   ホルダ  R-134256 また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。 やりたいことは 部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。 部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。 自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが… Sub 別ブックから貼り付ける()   Dim 検索する As Long Windows("部品表.xls").Activate 検索する = cells(i,2).Value Windows("コード一覧表.xls").Activate ActiveWindow.SmallScroll Down:=-3 Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。 基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。 どうぞよろしくお願いします。

みんなの回答

  • avanzato
  • ベストアンサー率54% (52/95)
回答No.4

こんにちは。 とりあえず実用性も踏まえました。 メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。 また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。 Option Explicit Sub Sample()  Application.ScreenUpdating = False  Dim I As Long  Dim xlBook  Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★  I = 2  Do While Range("A" & I).Value <> ""   ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)   I = I + 1  Loop  xlBook.Close  Application.ScreenUpdating = True  MsgBox ("完了") End Sub

dengennao
質問者

お礼

検索のセル範囲を指定する Range("A2:B65535") を参考にさせていただきました ありがとうございました みなさんのアドバイスを組合わせて、単語の意味を検索しながら 思い通りのものができました! みなさまに感謝いたします。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

>基本事項は本で学びましたが、呪文のようなコードはよく理解できません。 呪文は分らないようなので 基本的なコードしか使用していません 'サンプルコード Sub test() Dim x As Long, y As Long For x = 2 To Workbooks("book1.xls").Worksheets("sheet1").Cells(Rows.Count, 2).End(xlUp).Row For y = 2 To Workbooks("book2.xls").Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row If Workbooks("book1.xls").Worksheets("sheet1").Cells(x, 2).Value = Workbooks("book2.xls").Worksheets("sheet1").Cells(y, 1).Value Then Workbooks("book1.xls").Worksheets("sheet1").Cells(x, 3).Value = Workbooks("book2.xls").Worksheets("sheet1").Cells(y, 2).Value Exit For End If Next y Next x End Sub しかし、呪文を使用しないと長くなりますね 後は自分の環境に合わせてアレンジしてください 勉強頑張って

dengennao
質問者

お礼

よく理解できました! Dimは、まとめて宣言できるものなのですね? 今までは、それぞれ行を変えて宣言していたので、 何行にもなっていました…。 また、元気にがんばれます。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

>関数ではなく、マクロで処理を希望します 生半可な知識で言ってませんか。 関数VLOOKUPでやれる。 VBAでもVLOOKUP関数は使える。 それを知った上で言ってますか。 ーー それ(いや)なら、ややこしいほうのFindメソッドを勉強したら良い。(背伸びすることは無いと思うが。時間をかけて勉強しないと。入門本を一読して達せられるものではない。) WEBには「VBA Find FindNext」で照会すればコード例が沢山在る。 普通は、AutoFilterを使うものではない。

dengennao
質問者

補足

ネットで質問すると ほんとうに勉強になって感謝の気持ちで一杯になるときと、 質問しなければ良かった、といやな気持ちになる両極端なことが起こります。 それでも、仕事上どうしても必要なときは嫌なことも我慢して質問しています。 相手の状況を良く知りもしないで、馬鹿にするような言い方はほんとうに失礼だと思う。何様なんでしょう。 こんな馬鹿な質問で頭にくるんなら、見ないで無視すればいいでしょう。 この質問は、今回組んだマクロの、ほんの一部の動作です。 何百枚の表を、(1)図番を規則的に書き換える、(2)セレクトケースで場合わけする、(3)別の一覧から書き換えた番号に該当する関連項目を引っ張ってくる、(4)新しい図番番号で保存する など。 他のものは組めたので、最後に残った今回の件をマクロに組み込みたかったのです。

  • NYAN99
  • ベストアンサー率35% (32/90)
回答No.1

マクロでやりたいなら、ツール、マクロの記録で実際にやりたいことを やって記録終了とすると、自動でマクロが書かれていますので それを見て修正していくと分かりやすいです。 でもKeyと一致する項目を探して、取得したいのであるなら エクセル関数で簡単に出来ますけど、Vlookupとか それが同じブックにあるのかないのかの違いなので、 Workbooks("ブック名").Worksheets("シート名").cells(セルの位置)で指定すればいいのでは。

関連するQ&A

  • Exel VBA 別シートから該当データを取得する

    お世話になります。 エクセルVBAで質問です。 以下の日付表というシートがあります A列に日付、B列に商品番号が入力してあります。C列のコードは未入力です。 A列     B列     C列       日付    対象商品番号  コード 2020/6/1  U-1325-L   2020/6/2  R-134256 2020/6/3  L-456632 ・ ・ ・ 2020/6/30  W-724789 また、一覧表という別のシートには、A列に商品番号と、B列からコードが何百件も入力されています。 (1行目に限っては、A1だけ商品番号の項目でB列からは日付です) A列     B列     C列     D列  AE列 商品番号  2020/6/1  2020/6/2  2020/6/3・・・・ 2020/6/30 R-134256  123123   456456   741741 ・・・・ 753753 U-1325-L  789879   963963   852852 ・・・・ 951951 ・ ・ ・ やりたいことは 日付表のC列のコード欄に、一覧表から商品番号と日付が一致するコードを貼り付けしたいのです。 現状、目視で全入力しているので、マクロで一度に処理を希望します。 または、マッチしたら一覧表側のコードセルにマークつける方法でもかまいません。 と、言ってみたものの、Google検索しても、どうやって調べればいいのかが、わかりませんでした。 マクロの基本事項は本で学びましたが、条件が複数になってくるとよく理解できません。 どうぞよろしくお願いします。

  • エクセル VBA 別ブックのコード一覧から必要なデータをコピーする方法について

    Aブックには、部品番号が入力してあります。   部品番号   U123-456-789   U132-445-555 Bブックには、部品番号・部品コードが入力してあります。   部品番号    部品コード   U198-444-101  1923589536   U132-445-555  1624658946   U123-456-789  3254625986 Aブックに、Bの部品コードを入力したいのです。 Aの部品番号をコピーして、Bで検索するまでは良いのですが 検索結果の隣のセルをどう選択すればよいのかがわかりません。 よろしくお願いします。

  • エクセルで別ブックを検索するマクロ、VBA

    エクセルで以下の処理を行えるマクロを作成したいです。 当方、マクロについてほとんど知識がありません。 恐縮ですが、教えていただけると嬉しいです。 ・主にしたいこと  [検索]ブックで一致するコードを探して、  [結果]ブックの対応するコードの行にそれぞれの項目を返したい。 ●ブック1 [検索]  シートが12個あります(それぞれ、1、2、3…12というシート名=1~12月分)  ↓各シートの内容    A    B    C    D 1  氏名  数値  コード  内容 2  abc   111  SS1234 あいうえお 3  bcd   123  SS3456 かきくけこ ・ ・ ・ といった感じです。 12個のシートの中身はそれぞれ似たようなものですが、 「コード」や「内容」などは少しずつ違います。 ●ブック2 [結果]  ↓シートの内容    A    B    C    D 1  氏名  コード  内容  数値 2      SS3456 3      SS1234 ・ ・ ・ といった感じです。 (注)検索用ブックとは列の並びが異なっています。 ここでやりたいことの詳細ですが、 ・[結果]ブックの「コード」(B列)にコードを入力すると、  [検索]ブックで一致するコードを検索し、  A列「氏名」、C列「内容」、D列「数値」に、[検索]シートの内容を  自動的に表示させたい。  (ただし[結果]ブックに入力した「コード」は、[検索]ブックの1~12のうち、   どのシートにあるかわからない) ・入力したコードが見つからない場合は何も表示しない。 ということです。 最初VLOOKUP、MATCH等の関数で表示することを考えましたが、 シートが複数にまたがっているのと、 列の並び方が[検索][結果]ブックで違うのでわかりませんでした。 長くなってしまい申し訳ありませんが、どうかおしえてください。 よろしくお願いします。

  • エクセル VBA find は別シートを検索できますでしょうか?

    こんばんわ。マクロ初心者です。 皆さんいつも親切なご回答ありがとうございます。 早速ですが質問内容を記入いたします。 ・ブックA を開いています。 選択している行のC列セルの値を検索キーワードにして、 ブックB 内を検索し、検索結果のセルの3つ左のセルの値を、 ブックA で選択していたセルの同じ行のO列(15列目)に入力したいです。 ※ブックBをアクティベートする事無く行えますでしょうか? (他の処理と組合わせて行い、回数も多いので、  ブックA⇔ブックB アクティベートの往復は避けたいです。) 下のようなマクロを作成してみましたがうまくいきません。 どうかご指導よろしくお願いいたします。 --------------------------------------------------------------- dim 検索品目 as string dim fcell as object dim i as integer i = Selection.Row '選択行の3列目セルの値を変数『検索品目』に格納 検索品目 = Cells(i, 3).Value 'オブジェクト変数『fcell』に検索したセルを格納 Set fcell = Cells.Find(What:=検索品目, After:=Workbooks("ブックB.xls").Worksheets("sheet1").Range("G2"), LookAt:=xlWhole, searchorder:=xlByColumns) '検索したセルの3行左のセルの値を変数『オーダ番号』に格納 オーダ番号 = fcell.Offset(, -3).Value 'ブック A の選択行の15列(O列)にデータ入力 Cells(i, 15) = オーダ番号

  • 一覧表から一行ごとのデータを別ブックに保存するには?

    あまり使用頻度はないかもしれませんが・・・・ (例) ○元になる一覧表のブック(BOOK_1.xls) 1行目:項目  (A1:一連番号 B1:氏名    C1:住所) 2行目:データ1(A2:1     B2:山田太郎 C2:東京都) 3行目:データ2(A3:2     B3:山田次郎  C3:大阪府)    ・    ・ 以降10行目まで同様のデータが入っているとします。 上記のファイルから ○あらかじめ決められた単票形式のブック(FORMAT.xls)  A1:一連番号(文字列) B1:空白  A2:氏名(文字列)   B2:空白  A3:住所(文字列)   B3:空白 を呼び出し ○BOOK_1.xlsの一行目の項目のデータを  FORMAT.xlsの B1 B2 B3 の空白部分にコピーペーストし ○BOOK_1.xlsのA2の一連番号の数字をファイル名として取得  し"1.xls"として新規保存をする。 ○そのあとは10行目までその作業を繰り返し、1.xlsから10.xls  というファイルを10個作成し終了する 以上のようなことが可能でしょうか? 実際は列数は30程度、行数が1500行程度あり、1500ほどの ファイルができるようになるんですけど・・・。 よろしくおねがいします。    

  • マクロ:別ブックのデータの値を転記

    ExcelでVlook関数を使ってデータを検索していたのですが、マスタの件数(15,000件)と数式が多くなってしまいブックの容量が大きくなってしまって動きづらくなってしまったので、マスタと検索のブックに分け、マクロを使おうと思ってます。 簡単にいうと、 【マスタブック】   A列  B列 1  1   あ 2  2   い 【検索ブック】   A列  B列 1  2   い 2 検索ブックA列1行目に、「2」を入力してマクロを実行すると「い」が表示されるようにしたいのです。   開いておくのは検索ブックはのみです。 Sub 転記() Dim マスタ As Workbook Dim 検索 As Workbook Dim 行, 数字 As Long Dim Bname As String Bname = ActiveWorkbook.Name Workbooks.Open Filename:="C:\Documents and Settings\mi200274\デスクトップ\\マスタ.xls" Workbooks("マスタ.xls").Activate Set マスタ = Workbooks("マスタxls") Set 検索 = ThisWorkbook Set ws1 = マスタ.Worksheets("Sheet1") Set ws2 = 検索.Worksheets("Sheet1") On Error Resume Next 行 = 1 Do Until ws2.Range("A" & 行).Value = "" 数字 = ws2.Range("A" & 行).Value 対象 = ws1.Range("A:A").Find(数字, lookat:=xlWhole).Row ws2.Range("B" & 行).Value = ws1.Range("B" & 対象).Value 行 = 行 + 1 Loop ActiveWorkbook.Close Workbooks(Bname).Activate End Sub 以上のマクロを知人に教わりながら作ってみたのですが、マスタを一度開かないと検索はできないのでしょうか? 重たいデータなのでできれば開かずに検索して値を転記したいので、そのようなコマンド等ご存知の方教えてください。 ちなみにマクロは「新しいマクロの記録」から作る程度の初心者です。よろしくお願いします。

  • 条件に合うデータを別のブックに書き出したい

    お世話になります。 エクセル2003で、数量を入力した「行」だけを別のブックに書き出したいのですが、機能や関数を教えてください。 (表1)    A     B     C    D 1 商品名  単価  数量  合計 2  い    100   4    400 3  ろ    500   2    1,000 4  は    200 5  に    150 6  ほ    330 7  へ    230   5    1,150     ・     ・    ・    ・     ・     ・    ・    ・ 17  た    180   2    360 と、17行、4列の表があります。この「数量」が入力された行だけ、 (表2)   A    B    C   D 1 数量 単価 合計 商品名 2  4   100  400   い 3  2   500  1,000  ろ 4  5   230  1,150  へ 5  2   180  360   た (表2)のように書き出したいのです。 (表1)から抽出される行数は、必ず4行以下です。 (表1)に数量を入力すると、(表2)が自動的に変わるのが好ましいです。 マクロやVBAは苦手なのでエクセルの機能や関数で教えていただければ幸いに存じます。 情報が足りなければ補足します。 宜しくお願いします。

  • エクセルVBAでのブック名の取得について。

    こんにちは。よろしくお願いします。 自身:a.xls 他:1.xls、2.xls、3.xls 上記全てを開いた状態で、a.xlsのA列に、a.xls以外のブック名を文字列として取得しました。 A 1.xls 2.xls 3.xls この状態で、更に、 追加:11.xls、12.xls、13.xls というブックを開いた場合(1、2、3は開いたまま)に、B列に上記3つのみのブック名を文字列として取得したいと考えています。が、A列に取得したところで行き詰ってます・・・。 ご教授願えると嬉しいです。 よろしくお願いします。

  • VBA 別BOOKへのデータ転記について

    VBA初心者です。 以下のことがしたいのですが、 コードをご教示いただきたくお願いいたします。 BOOKが5つあります。 BOOK1:抽出用(Sheet2に日々の受注データを入れています)        BOOK2:転記100用 BOOK3:転記200用 BOOK4:転記300_400_500用 BOOK5:工事番号用 BOOK1:抽出用はA列からQ列まで工事番号ごとに2行目から受注データが入っています。 抽出用のsheet2のA列に「1」と入力することで転記したいデータだというフラグにし、 抽出用O列のコード100,200,300,400,500(工事の種類のようなものです)を見て、 該当のBOOK2から4にその工事番号が転記がされているか? (されていれば登録済みのメッセージ表示) 転記がされていなければ新規に登録、 新規登録の際に、抽出用Sheet2のD列の工事番号、I列の件名、K列の数量を表示して、 このデータを新規登録しますか?のようなメッセージを出し、Yesなら新規登録。 さらに、新規に登録した際にはその工事番号を名前とするBOOK5を新規作成、 BOOK5にも抽出用の受注内容を転記。 BOOK2から4に転記された工事番号をクリックすると その工事番号のBOOK5にジャンプするようにしたいのです。 抽出用A2とA4に「1」と入力された場合(O列は共に200) BOOK1抽出用データの転記したいセル番地  →  BOOK3転記200用のセル番地 A2のデータ D2 → A7 K2 → A8 C2 → A9 H2 → A10 I2 → A11 F2 → D7 L2 → D8 M2 → D9 J2 → D10 C2 → I5 Q2 → J5 A4のデータ D4 → A12 K4 → A13 C4 → A14 H4 → A15 I4 → A16 F4 → D12 L4 → D13 M4 → D14 J4 → D15 C4 → I10 Q4 → J10 BOOK2から4は1つの工事番号を5行使用して表わしています。 ですので、1つの工事番号が7から11の行、 2つ目の工事番号が12から16行目となり、それぞれ100件分の工事番号を入れられるように 作成してあります。 またBOOK5については、(A2のデータの場合)以下のように転記し、ファイル名を抽出用D2の工事番号にしたいです。 A2のデータ D2 → A3 K2 → A4 C2 → A5 H2 → A6 I2 → A7 F2 → F3 L2 → E4 M2 → E5 J2 → E6 大変長くなってしまいましたが、以上のようなことをしたいと考えておりますが、 当方、VBA初心者でして参考書とネットを駆使して抽出用のVBA(CSVデータをコピーして加工する)ことにすら大苦戦しております。 なんとかお力を貸していただけないでしょうか? ご教示よろしくお願いいたします。

  • マクロで、別ブックのデータを、既存ブックの一欄に

    マクロで以下のような操作をしたいと思っております。 どのようなコードを書けばよろしいでしょうか。ご教授ください。 【顧客データ一覧.xls】というブックのシート1に顧客データ一覧表があります。 同ブックのシート1上部にコマンドボタンを作成し、ボタン押下で以下のような操作を行いたい 1.ファイルダイアログを開いて、【顧客データひとり分.xls】というブックを選択 2.【顧客データひとり分.xls】に入力されているデータを、【顧客データ一覧.xls】の顧客データ一覧表の末尾に、コピーして追加・上書保存 顧客データひとり分はセル(3,4)に年齢が入力されている等、入力箇所は固定です。 3.顧客データひとり分.xlsは閉じて、更新された顧客データ一覧.xlsを表示させる よろしくお願いいたします。マクロは作成したことがありますが、何年もブランクがあり、かなり忘れてしまいました・・・。 と、エクセル2003以来久しぶりに操作ですので、エクセルそのものに大変戸惑っております。。。実力不足でお恥ずかしいのですが、お力をお借りできれば幸いです。

専門家に質問してみよう