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

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

ただいまの
回答率

90.04%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 9,435

marutoki

score 14

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

【やりたいこと】
商品に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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

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

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

返信読みました。

追記です。:

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

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

たとえば、

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

Dim data As String

data = Workbooks( "JanStock.xls" ).Range("A1").Value

のようにします。

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

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

Cells( 行番号, 列番号 )

という感じになります。

Dim data As String

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

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

例:

Dim i As Long

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

みたいにできます。

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/13 19:03

    >> これを結合(&?)させて1セルに「商品名 カラー」と表示させたいですが、分からないです。

    これって、

    商品A - 品名1 - ... - 青 - ...
    商品B - 品名2 - ... - 赤 - ...

    とあったら、

    "商品A 青"
    "商品B 赤"

    みたいにするんですよね?

    それなら、普通に連結すればいいんです。

    文字列として

    ' "商品名"セルから取得
    Dim Shohin As String

    ' "カラー" セルから取得
    Dim strColor As String

    として、セルからそれぞれ取得する。

    で、

    Dim strData As String



    strData = Shohin & strColor

    とすればいいだけ。

    直接セルを指定してもいいと思います。

    キャンセル

  • 2017/01/13 21: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コードを作り何度も手入力しているので助けてあげたく
    データ入力を一度で済ませられるように試行錯誤しているところです。

    キャンセル

  • 2017/01/15 23:20

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

    キャンセル

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • VBAに関する質問
  • Exel VBA 同一フォルダ別ブックから該当データを検索し、一致すればデータを取得して貼り付け