質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

20438閲覧

Exel VBA 同一フォルダ別ブックから該当データを検索し、一致すればデータを取得して貼り付け

marutoki

総合スコア16

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/01/13 06:54

お世話になります。
マクロ、難しいです、お力添えをいただけないでしょうか。

【やりたいこと】
商品にJANコードを付けているのですが、商品が目まぐるしく変わるためはたしてどのJANが使っていないJANコードかを2枚のシートで判別したく。

【流れ】
同一フォルダに2つのワークブックがあり、それぞれシートがあります。
①JAN付マスター(Sheet1シート)
②商品Master(春夏シート)

①はJANコードがあらかじめC5セルから下に1万行ほど入っています。
②はA列にJANコード、D列に品名、E列にサイズ、F列にカラーが入っています。

もし②で使用しているJANが①にあれば
②のE列(サイズ)を①のF列に、
②のD列(品名)とF列(カラー)を結合させ、①のE列に。

【問題】
一応ネット上で調べてマクロを書き換えたのですが、

①初歩的なことですが、7行目で
Set xlBook = Workbooks.Open("C:\★★\商品Master.xlsm")を、
Set xlBook = Workbooks.Open Filename:=ThisWorkbook.Path & "\商品Master.xlsm"
に変えたいのですが「構文エラー」となりどこが悪いか分かりません。

②とりあえず商品名だけでもと思い、vlookupを使ったマクロを試したのですが、「#N/A」が出るばかりです。

Option Explicit Sub Sample() Application.ScreenUpdating = False Dim I As Long Dim J As Long Dim xlBook Set xlBook = Workbooks.Open Filename:=ThisWorkbook.Path & "\商品Master(マクロ).xlsm") I = 2 J = 5 Do While Range("C" & J).value <> "" ThisWorkbook.Worksheets("Sheet1").Range("E" & J).value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("C" & J).value, xlBook.Worksheets("春夏").Range("A:D"), 4, 0) I = I + 1 J = J + 1 Loop xlBook.Close Application.ScreenUpdating = True MsgBox ("完了") End Sub

①JAN付マスター
②商品Master

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私の読解力が足りないせいなのか、判断がしづらいです。

一つのエクセルファイル 内で収まる範囲としているのですか?

それとも ExcelBook1.xls, ExcelBook2.xls, Master.xls があり、
Master.xls が大本のデータベース みたいな状態で ExcelBook1.xls, ExcelBOok2.xls を読み込んで
ストアするっていうことでしょうか?

関係性があいまいすぎてイメージできません。

返信読みました。

追記です。:

つまり、JAN付きデータ一覧 ( 本店が記録したデータ群、取り扱える商品一覧。 ) が入っている エクセルファイル ( ここでは JanStock.xls としておきます。 ) のシート1 を 各支店がチェックして在庫をチェックするための エクセルファイル ( ここでは Master.xls とします。 ) が読み取って、追加なり削除なり処理をする... という感じでしょうか?

もしそうなら、 ファイルの読み込み をするよりも、ActiveWorkbook... を使わずに Workbooks( ブック名 ) を使ってみては?

たとえば、

Master.xls の 標準モジュールか UserFormのモジュールかに書くとします。

VBA

1Dim data As String 2 3data = Workbooks( "JanStock.xls" ).Range("A1").Value 4

のようにします。

ですが、これだと For文ではできません。 (できることはできるが、数値を文字列に変換しないといけない... )

ここで Rangeの代わりに Cells を使います。

Cells( 行番号, 列番号 )

という感じになります。

VBA

1Dim data As String 2 3' "C1" のデータを取得 4' A=>1, B=>2, ... のため。 5data = Cells( 3, 1 ).Value 6

これでアクセスすれば For文でも使えます。

例:

VBA

1Dim i As Long 2 3' 1の列のセルで A1からA100 までの一列 に "OK" を印字する 4For i = 1 To 100 5 Cells(i, 1).Value = "OK" 6Next i

みたいにできます。

上記のものを組み合わせて

WorkBooks(ブック名).Shees(シート番号).Cells(行,列).Value

みたいにすれば別のブックのシートを操作することができますよ。

あと、Sheets( シート番号 ) でアクセスする場合は 数字で指定できます。

これとFor文を使って セルをチェックしていけばいいと思います。

使っていないJANデータってありますが、これってアドレスを新規登録するときに サーバのデータベースに同じデータがある場合は使えない, ない場合はOKみたいな感じですよね?
それなら、上記のチェックで チェックすればいいのでは?
あるいは 考えるためのシート ( 一覧データ と 使っているデータから 割り出す みたいな。 ) とかを一時追加するっていう手もありますね。

投稿2017/01/13 07:11

編集2017/01/13 08:26
BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marutoki

2017/01/13 07:55

いえ、私の駄文がいけないのだと思います(-_-;) いろいろシートが入ってますが、使うシートは2つです。 添付画像がそれにあたります。 JAN付マスターファイルのSheet1と、 商品Masterファイルの春夏です。 商品Masterの春夏がデータベースのような役割をしています。 ここに新しく商品が入れば追記し、無くなれば削除。 そして、JANコードをふるとき、JAN付マスターから使っていないJANをコピーして貼り付けます(ここは手作業です) そして、JAN付マスターの更新ボタンでマクロを実行すると、商品Masterで使用したJANコードの行に追記した商品の名前やサイズがJAN付マスターの指定した列に自動で入る、削除していればJAN付マスターの情報も消える。といった具合です。 ・・・う~ん、マクロとしてやりたいことは 商品Masterの春夏シートA列にあるJANコードがJAN付マスターにもあったら商品Masterの必要な情報をJAN付マスターに転記する。 で、分かりましたでしょうか?
marutoki

2017/01/13 08:08

問題①は解決しました! そもそも()も無かったですが・・・ Setステートに入れるのでブック変数を宣言してエラーは出なくなりました。 Dim xlBook As Workbook Set xlBook = Workbooks.Open(fileName:=ThisWorkbook.Path & "\商品Master(マクロ).xlsm")
marutoki

2017/01/13 08:26

Do~Loop、かなり変ですね、修正しました。 しかし相変わらず「#N/A」がずらっと並ぶだけです・・・。 I = 5 Do While Range("C" & I).value <> "" ThisWorkbook.Worksheets("Sheet1").Range("E" & I).value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("C" & I).value, xlBook.Worksheets("春夏").Range("A2:D65535"), 4, 0) I = I + 1 Loop
marutoki

2017/01/13 08:38

あ・・・できました。 商品MasterのJANコードが文字列になっていましたorz あとは、サイズは同じようにすればできると思いますが、 ②のD列(品名)とF列(カラー)を結合させ、①のE列に。 Vlookup関数でいう4がD列で6がF列なわけですが、これを結合(&?)させて1セルに「商品名 カラー」と表示させたいですが、分からないです。
BeatStar

2017/01/13 10:03

>> これを結合(&?)させて1セルに「商品名 カラー」と表示させたいですが、分からないです。 これって、 商品A - 品名1 - ... - 青 - ... 商品B - 品名2 - ... - 赤 - ... とあったら、 "商品A 青" "商品B 赤" みたいにするんですよね? それなら、普通に連結すればいいんです。 文字列として ' "商品名"セルから取得 Dim Shohin As String ' "カラー" セルから取得 Dim strColor As String として、セルからそれぞれ取得する。 で、 Dim strData As String に strData = Shohin & strColor とすればいいだけ。 直接セルを指定してもいいと思います。
marutoki

2017/01/13 12:07

ありがとうございます。 かなり初心者ですのでもう少し詳細に教えていただきたいのですが・・・ 列(セル)を変数にして結合というのは理解できました。 ただ、それをVlookupで抽出したセルへの適用方法が分かりません。 私の認識ではVLookup(検索値, 範囲, 列番号, 検索の型)であり、 列番号(数値)にて列を指定しています。 strData = Shohin & strColor で指定したstrDataを入れるところが分かりません。 それとも strData = Shohin & strColor Do While Range("C" & I).value <> "" shohin= Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("C" & I).value, xlBook.Worksheets("春夏").Range("A2:D65535"), 4, 0) strColor= Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("C" & I).value, xlBook.Worksheets("春夏").Range("A2:D65535"), 6, 0) ThisWorkbook.Worksheets("Sheet1").Range("E" & I).value =strData I=I+1 Loop というイメージでしょうか? (やってみたいところですが、現在自宅のパソコンのためファイルがありません) 余談ですが、追記でイメージされてるような大企業ではありません(-_-;) 本店支店どころか町の小さな卸売り屋さんです。 このデータを扱うのは私と事務のおばちゃんくらいです。 事務のおばちゃんが手計算でJANコードを作り何度も手入力しているので助けてあげたく データ入力を一度で済ませられるように試行錯誤しているところです。
marutoki

2017/01/15 14:20

アドバイスいただきイメージが沸き、 For~Nextに直したり、エラー無視などいろいろやって思うように動きました! まだまだ勉強不足ですので精進したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問