• 締切済み

vbaでvlookup

vbaプログラムについて どなたかお願いします。 vbaで,vlookup関数を作成したいのですが・・・ ファイル1にコード番号、JANコード、商品名、重量の データがs hee t1~ 3まであります。 ファイル2にコード番号があります。 ファイル1からJANコード、商品名、重量を ファイル2に持ってくるにはどうしたらよいのでしょうか? もし、よろしければプログラムを教えていただけ ないでしょうか? 具体的には、 (ファイル1)s hee tがたくさんあります。 コード番号 J AN 商品名 重量 1 10 00 りんご 1 0 2 10 01 みかん 2 0 3 10 02 ぶどう 1 0 : : : : i i i i (ファイル2) コード番号 J AN 商品名 重量 3 空白 空白 空白 8 空白 空白 空白 1 空白 空白 空白 5 空白 空白 空白 : : : : i i i i この空白にファイル1のデータを移したいです。 よろしくお願い致します

みんなの回答

  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.2

こんにちわ いくつか前提があります。 このマクロは、ファイル1に書いてあります。 ファイル1には、コード番号 J AN 商品名 重量 だけしかない事 データは2行目から シート数はいくつあってもかまいません。 データの中に、スラッシュ"/"が無いこと。"/"をプログラムで使用しています。 コード番号が8桁以上の数字のみだと、 実行が遅くなるのでプログラムの変更が必要になります。 ファイル2のシート名は、"Sheet1"です。 Option Explicit Sub test() Dim ファイル1_dec As Object 'Scripting.Dictionary Dim i As Long, j As Long, n As Long Dim ファイル1ABCD列配列 As Variant Dim ファイル2ABCD列配列 As Variant Dim 配列 Dim ws1 As Worksheet Dim ws2 As Worksheet Dim wb2 As Workbook On Error Resume Next Set wb2 = Workbooks("ファイル2.xls") If Err.Number > 0 Then MsgBox "ファイル2.xlsが開かれていません" Exit Sub End If On Error GoTo 0 Set ファイル1_dec = CreateObject("Scripting.Dictionary") 'New Dictionary ThisWorkbook.Activate For Each ws1 In ThisWorkbook.Worksheets ファイル1ABCD列配列 = ws1.Range("A2", ws1.Cells(Rows.Count, 1).End(xlUp)).Resize(, 4).Value For i = 1 To UBound(ファイル1ABCD列配列) If Not ファイル1_dec.exists(ファイル1ABCD列配列(i, 1)) Then '初出なら ファイル1_dec.Add ファイル1ABCD列配列(i, 1), _ ファイル1ABCD列配列(i, 2) & "/" & _ ファイル1ABCD列配列(i, 3) & "/" & _ ファイル1ABCD列配列(i, 4) 'keyに追加、itemにb/c/d End If Next i Next ws1 Set ws2 = wb2.Worksheets("Sheet1") ws2.Range("B2:D" & Rows.Count).ClearContents ファイル2ABCD列配列 = ws2.Range("A2", ws2.Cells(Rows.Count, 1).End(xlUp)).Resize(, 4).Value For i = 1 To UBound(ファイル2ABCD列配列) If ファイル1_dec.exists(ファイル2ABCD列配列(i, 1)) Then 配列 = Split(ファイル1_dec.Item(ファイル2ABCD列配列(i, 1)), "/") ファイル2ABCD列配列(i, 2) = 配列(0) ファイル2ABCD列配列(i, 3) = 配列(1) ファイル2ABCD列配列(i, 4) = 配列(2) End If Next ws2.Range("A2").Resize(UBound(ファイル2ABCD列配列), 4).Value = ファイル2ABCD列配列 Erase ファイル1ABCD列配列, ファイル2ABCD列配列 Set ファイル1_dec = Nothing Set wb2 = Nothing Set ws1 = Nothing Set ws2 = Nothing End Sub

  • nao-y
  • ベストアンサー率58% (111/190)
回答No.1

> vbaで,vlookup関数を作成したいのですが・・・ 確認させてください。 ・Excel VBAでマクロを作りたいということですよね?Excelのバージョンはいくつですか? ・「vlookup関数を作成したい」ではなくて  「vlookup関数を使用したマクロを作成したい」ということですよね?  マクロの作成は既に御自分で試されましたか?  試された場合、どこまでやって、何が分からないとか補足してください。  マクロのことを何も調べずに、「何をどう書いたらいいか分からないから  とりあえず丸投げ」っていうのは論外ですよ。 ・VLOOKUP関数をファイル2に埋め込むのは駄目なんですか?  駄目ならば、なぜ駄目なのか教えてください。行数が多いからですか? ・ファイル1のsheet1~3(どうでもいいですが、「s hee t」のように 「sheet」という言葉に空白が入るのはなぜですか?)や、ファイル2の行数を教えてください。 ・ファイル2のコード番号は重複する(同じコード番号が何回か出てくる)ことは ないのですか?重複する場合は重量を集計する必要はないですか? ・ファイル1のコード番号は、もちろん重複することはないですよね?

chankaho
質問者

補足

1.vlookup関数を使用したマクロを作成したいです。 2.自分でも作成しましたが、他のファイルから参照することが  わかりません。 3.sheetの要領を最大限に使用したデータなので、  vlookupを使用すると手間がかかってしまいます。  ファイル1のコード表は約12万ほどあります。 4.ファイル2の行数は、書類の多さにより異なります。  もちろん、重複するコードもあります。 5.ファイル1のコードはコード表なので  新しい商品が増えたら増えていきます。

関連するQ&A

  • vlookup関数についてですが。

    こんにちは。 仕事で使う注文書をエクセルで作っています。 sheet1が注文書本体。sheet2が商品一覧(データベース形式)で左からコード番号(5桁)、商品名、内容量、単価などと並んでいます。 問題は、注文書のsheet1のコード番号を入力する箇所が、セルが5つ横並びで、1セルに1文字づつ入れるようになっています。 そこで、考えたのが注文書の5桁のコード番号を取得するセルを設けそこに(=D18&E18&F18&G18&H18のようにして)5桁のコード番号を取得、そのコード番号に対応するセルをsheet2の商品コードから抜き出し、その横の商品名を、sheet1注文書の商品名をN18に返すようにしました。(=IF(I18="","",VLOOKUP(I18,Sheet2!A2:E400,2,FALSE)) しかし、N18に返ったのは、#N/Aでした。 なぜでしょうか? どのようにすれば、N18に商品名を返すことが出来るでしょうか?

  • エクセル vbaでの相談です

    エクセルでの質問です。 販売管理表を作りたいと思います。 sheet1を商品マスター表とし、下記の見出しがあって A1 JANコード(上一桁4からの番号で13桁) B1 商品コード (14桁) C1 商品名 D1 価格 以下A2行以降、A1行の見出しを元に商品詳細があるとします。 sheet2の下記のA1行を見出しとし、A2行から販売実績をユーザーフォームを使って入力していきたいと思います。 A1 JANコード B1 商品コード C1 商品名 D1 価格 E1 販売番号 フォームを作成し、入力窓に JAN、商品コードのいずれかを入力すると、他の入力窓にsheet1の商品マスター表から該当する商品名、価格を自動入力し登録ボタンを押すと、sheet2の該当セルに反映されるということはできますでしょうか? そして異なる商品のまとめ買いの件数も知りたいので、フォーム上で複数アイテム登録できるようにし、販売番号で件数を管理したいのですが、そちらも可能でしょうか? 販売番号も自動で通し番号が入るようにしたいです。わかりにくい文章で申し訳ありません。ご教授の程、よろしくお願い致します。

  • Excel2013VBAでVLOOKUP条件付き

    いつもお世話になっております。 Excel2013VBAでVLOOKUP関数を使用して、商品名に対応した商品コードをとりたいのですがうまくいきません。 アクティブシートの表のA列、D列、G列に商品名を複数入力してあります。 テーブルシートのB列に同じく商品名があり、C列に商品コードがあります。 VLOOKUPを使ってテーブルシートから商品コードを取り出して、アクティブシートのA列、D列、G列の商品名の下の行に商品コードを入力するにはどうすればよろしいでしょうか? 条件として、テーブルシートのC列の商品コードは空白のものが存在する。その場合は処理する必要なし。 アクティブシート内の商品名の下の行が空白の場合のみ処理を行う。商品名が連続して入力してある箇所で商品コードが存在する場合は、メッセージでセル番地を表示して、処理を中断。ただし連続して入力してあっても、商品コードが存在しないものは問題なしとして次の処理を行う。 一部作りかけのものを提示します。また、下記コードはブレークポイントで停止しながらだと一応動作していましたが、普通に動かすとフリーズを起こします。すいません。 たびたびすいませんが、よろしくお願いいたします。 Sub VLOOKUP検索() Dim h As Range, ac As Range Application.ScreenUpdating = False Set ac = ActiveWindow.ActiveCell On Error Resume Next For Each h In Range("A:A,D:D,G:G") If h.Offset(1, 0) = "" Then h.Offset(1, 0) = Application.WorksheetFunction.VLookup(h, Worksheets("テーブル").Range("B:C"), 2, False) End If Next Application.ScreenUpdating = True ac.Select End Sub

  • エクセルVBA VLOOKUPについて

    エクセル VBA初心者です。 関数でのVLOOKUPをVBAで作りたいのですが、上手くいきません。 あらかじめ、Sheet2の1から300行までに A列  / B列 商品名 / 商品コード が入力されています。(名前の定義=商品コード) Sheet1にユーザーフォームを利用して、データを書き込んだ後、 B列に商品名が書き込まれると、 A列に商品コードが表示されるようにしたいと考えています。 A列に =IF(B2="","",VLOOKUP(B2,商品コード,2,FALSE)) と入力していたのですが、 VBAでIfを使って出来ないかと考えてみたのですが、 上手くいきませんでした。 Private Sub Worksheet_Change(ByVal Target As Range) Dim sRow As Long Dim sColumn As Long sRow = ActiveCell.Row sColumn = ActiveCell.Column If Cells(sRow, 2).Value = True Then Cells(sRow, 1).Value = WorksheetFunction.VLookup(Cells(sRow2).Value, Worksheets("Sheet2").Range("A1:B300"), 2, False) ElseIf Cells(sRow, 2).Value = " " Then Cells(sRow, 1).Value = " " End If End Sub ご教授いただけないでしょうか? エクセル2003 WindowsXP

  • MSアクセスのDBからエクセルのVBAで情報を抽出する

    いつもお世話になります。 以下のフォーマットでアクセスに十数万行のデータがあります。 JANコード,商品名,分類1,分類2,分類3,分類4 そして、エクセルのSheet1のA列に、数百から数千のJANコードが並んでいるのですが、マクロを起動させることによって、B列以降に、同じJANコードの商品名から分類4までをVLOOKUP関数のようにくっつけたいのですが、そのようなことは可能でしょうか。 尚、エクセルファイルとアクセスファイルは、同じフォルダに保存されているとします。

  • VBAでVLOOKUP関数を使う

    下記VBAでResultsを反映する(更新)するのは、 空白セルだけにするのは、どうすれば良いのでしょうか。 (※参考:http://myrtus21.com/blog/2007/06/vbavlookup.html) 1日かけてトライしていますが、打開できません。 どなたかご教授願います。 どうかよろしくお願いいたします。 Sub 在庫数検索() Dim SerchName As String Dim SerchArea As Range Dim Results As Variant '初期設定 Range("A2").Activate ItemCode = Range("A2").Value i = 0 '検索範囲の設定(ポイント1) Set SerchArea =Worksheets("シート2").Range("List1") '商品コードが空になったら終わり Do Until ItemCode = "" 'エラーになっても続行する(ポイント2-1) On Error Resume Next '商品コードに該当するデータを探し、Resultsに入れる ItemCode = ActiveCell.Offset(i, 0).Value Results =Application.WorksheetFunction.VLookup(ItemCode, SerchArea, 2, False) '該当するデータがないとエラーになるための処理、エラーなら空欄にする(ポイント2-2) If Err <> 0 Then Results = "" ActiveCell.Offset(i, 1) = Results i = i + 1 Loop End Sub

  • VLOOKUP関数の使い方について

    以前コード番号を入力すると自動的に商品番号が出るようにしたいと質問させていただきました。 教えていただいた方法を使い おかげさまでコード番号を入力すると隣のセルに商品番号が出るようになりました。 ただ一緒に単価も入力させたいのですがそれができません。 入力本体は(シート名 「仕入れ表」) E列 コード番号 F列 商品名 G列 数量 H列 単価 I列 小計(G*H) という構成になっています。 (A~C列は他の項目が入っています) 参照するシート名「cade」 同じブック内にあります。 A列コード番号 B列商品名 C列単価 が入っておりA~C列までを名前の定義で 「cade表」としてあります。 「仕入れ表」のI列(小計) の二行目より =IF(E2<>"",G2*H2,"") の数式がコピーしてあります。 同じく 「仕入れ表」のF列には =IF(E2<>"",VLOOKUP(E2,cade表,2,FALSE),"") と数式を入れました。 結果コード番号を入力すると商品名は出ますが 単価は入力されません。 単価も同時に入力する為にはどのようにしたらよろしいでしょうか? どなかた教えていただけると助かります。 宜しくお願い致します。

  • VBA ""が認識されないのはなぜですか?

    VBAで、空白のセルがあり、ウォッチウインドウで見ても、""(string) になっているのですが、次のようなコードのとき、うまくいきません。 i=1 Do untilcells(i+1,1)<>"" (処理) i=i+1 loop 空白でないセルになっても、ループがとまってくれません。 どうしたらよいでしょうか? ご回答をお願いいたします。

  • エクセルVBAでのvlookup関数の使い方

    エクセルでvlook up関数を用いたVBAを書こうと思っているのですが上手くいきません。 詳しい方がいらっしゃいましたら教えて頂けませんでしょうか。 使用しているエクセルは2010です。 いろいろ調べながら書いてみたのですが、繰り返しの処理かエラー処理が悪いようでVBAを実行することが出来ませんでした。 シート1にあるコマンドボタンを押すことで別シート(シート2、3)に入力されている値をもってくるというVBAを考えています。 Sheet1(取扱商品)にはA列に商品番号、B列に商品名、C列に管理者が入力されています。 D~H列には属性1~5というヘッダーだけがあり、コマンドボタンを押すことで、別シートから商品の属性が入ります。 Sheet1(取扱商品) 商品番号 商品名 管理者 属性1 属性2 属性3 属性4 属性5 001  桜   安部 002  薔薇  安部 002  薔薇  伊藤 004  梅   上田 007  水仙  伊藤 010  牡丹  榎本 ...(以下続く) Sheet2(データベース1) 商品番号 属性1 属性4 001  A1  A4 002      B4 004  D1     008  H1  H4 ...(以下続く) Sheet3(データベース2) 商品番号 属性2 属性3 属性5 001  A2      A5 003  C1  C3  C5 004      D3 011  K1  K3 ...(以下続く) 各シートの商品番号は1対1で対応していません。 Sheet1は商品番号が重複する場合があります。Sheet2、3は重複しません。 コマンド実行後のイメージは下記のような形です。 対応する商品番号、属性がない場合はnull入るようにしたいと思っています。 Sheet1(取扱商品) 商品番号 商品名 管理者 属性1 属性2 属性3 属性4 属性5 001  桜   安部  A1  A2      A4  A5 002  薔薇  安部              B4     002  薔薇  伊藤              B4     004  梅   上田  D1      D3         007  水仙  伊藤                     010  牡丹  榎本                     ...(以下続く) 要領が得ないところがあるかと思いますが、皆様のお知恵を拝借致したく、教えて頂ければ幸いです。 どうかよろしくお願い致します。

  • エクセルで優先的に表示

    いつもご丁寧に教えていただき本当に感謝しております。 また行き詰ってしまったのでお分かりになる方、よろしくお願いします。 まず、L1~L5に商品コードとして“1~5”、M1~M5に商品名として“花1~花5”の表があります。 C2に商品コードを入力するとD2に商品名がでるように、D2に=VLOOKUP(C2,$L$1:$M$5,2,FALSE)と関数を入れてます。E2には“×”or“空白”が入ります。 同様にF2に商品コード、G2に商品名がでるようにG2に=IF(F2="","",VLOOKUP(F2,$L$1:$M$5,2,FALSE))といれ、もう1つ同様に、 I2に商品コード、J2に商品名がでるようにIFとVLOOKUP関数を入れてます。H2とK2には“×”or“空白”が入ります。 この商品コードの入力はC2→F2→I2の順に入力していき、F2からやI2からの途中入力はないものとします。 ・・・・で,A2とB2の商品名を下記の例のように表示させるにはどうしたらいいですか? 例)D2に商品名がある場合→A2にD2の商品名、B2は空白 例)D2とG2に商品名がある場合→A2にD2の商品名、B2にG2の商品名 例)D2に商品名があるが、E2に“×”、G2に商品名がある場合→A2にG2の商品名、B2は空白 例)D2、G2、J2に商品名があるが、E2、H2に“×”がある場合→A2にJ2の商品番号、B2は空白 わかりにくい説明で申し訳ございません。

専門家に質問してみよう