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

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

ただいまの
回答率

90.33%

  • VBA

    1906questions

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

ExcelVBAで違うシートから条件に合ったデータを複数項目取得する

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 383

mowmowmilk1

score 1

 前提・実現したいこと

sheet1の一覧表の空白部分にsheet2のデータをVBAで取得する。

sheet1、sheet2があります。
sheet1には一覧表として全データが入力されています。
sheet2にはsheet1の一部分が抽出され入力されています。
sheet1にはsheet2の項目が部分的に空白になっています。(sheet2は単独で日付等が入力される)
sheet1の空白部分にsheet2のデータを取得するにはどうすればいいでしょうか?
VLOOKUP関数ではなくVBAで処理する方法を教えてください。
なお、キー項目は納品書番号です。
データは随時追加されるため最終行まで取得するよう設定したいです。

![イメージ説明](40b7660274f1d6b502554d68daab588b.png)

質問の内容が不適切で大変申し訳ありませんでした。hatena19さまのヒントをもとにやってみたのですが、INDEXで位置を取得しましたが、コピー方法がわかりませんでした。ループもうまくいきません。
すみませんが、ご指導お願いします。
イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • ExcelVBAer

    2018/06/27 13:13

    ここは他人に仕事をさせる場所ではないので

    キャンセル

  • 退会済みユーザー

    2018/06/28 09:11

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • hatena19

    2018/07/01 16:20

    コードは画像ではなく、コピーして貼り付けて、コードタグで囲んでください。コードを選択して、ツールバーの「コードの挿入」をクリックするとコードになります。

    キャンセル

回答 3

checkベストアンサー

+1

やってほしいことだけを記載した丸投げの質問は推奨されてません。
1行でもいいので、自分で調べてコードを書いてください。

とりあえずヒントだけ。

sheet2のデータの1行目の 発行No でsheet1の発行Noを検索して位置を取得する。
→WorksheetFunction.Match関数

取得した位置に、sheet2の1行目のデータをコピーする、または代入する。

sheet2のデータの2行目に移動して、上記と同じことを繰り返す。
→Do Loop構文 または For Next構文

sheet2のデータがない行にきたら終了する。

上記をヒントにできるとこまでコードを自力で書いてください。

コード例

仕様が不明確の部分があるので、下記のようだと仮定してコーディングしてみました。

Sheet1 Aheet2 とも A1~K1まで項目名、その下の行からデータが入力されている。
Sheet1 は F列からK列までが空欄の行がある。
Sheet2 は空欄はない。
納品書番号(E列)をキーとして同じ行のSheet2のF列からK列までの値をSheet1にコピーする。
コピーするときに、Sheet1が空欄かどうかチェックする必要はないものとする。

Sub ボタン1_Click()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim ws1Key As Range
    Dim i As Long
    Dim r As Long

    Set ws1 = Worksheets("Sheet1")
    Set ws1Key = ws1.Range("E2", ws1.Cells(Rows.Count, "E").End(xlUp)) '検索範囲
    Set ws2 = Worksheets("Sheet2")

    For i = 2 To ws2.Cells(Rows.Count, "E").End(xlUp).Row
       r = WorksheetFunction.Match(ws2.Cells(i, 5).Value, ws1Key, 0) + 1
        ws1.Range(ws1.Cells(r, 6), ws1.Cells(r, 11)).Value _
            = ws2.Range(ws2.Cells(i, 6), ws2.Cells(i, 11)).Value
    Next
End Sub

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/01 16:10

    ご回答ありがとうございました。丸投げにして申し訳ありませんでした。せっかくヒントをいただきましたがうまくいきませんでした。すみません。

    キャンセル

  • 2018/07/01 17:29

    すみません。検索して位置を返す関数は、WorksheetFunction.Match関数でした。回答も修正しておきます。

    キャンセル

  • 2018/07/04 22:07

    ありがとうございました。思った通りになりました。コードの貼り付け方もいただき、大変お世話になりました。

    キャンセル

0

VLOOKUP関数ではなくVBAで処理する方法を教えてください。

ちょっとご質問の趣旨を図りかねるところがあり、下記の回答で当たっているかあまり自信はありませんが...

ご質問の趣旨ですが、sheet1の空白等のある項目をsheet2に抽出し、sheet2に記入した内容をsheet1に転記したいということでしょうか。だとすると、ご質問はそれを「記入する端から」転記したいというイメージをお持ちでしょうか。だとしたら正直、それはいろいろな面で難しいです。

ですので、こういう処理では、記入するシート(このばあい、仮にsheet2だとします。)に「転記」あるいは「登録」というボタンを作成して、記入後にそのボタンを押したときにVBAで、sheet2の内容を転記させるのが一般的です。転記する処理については、それほど難しい処理とは思わないので説明しませんが、これでご参考になりますでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/01 16:13

    ご回答ありがとうございます。sheet1からsheet2は抽出といっても、別作成です。ど素人なもので転記さえもよくわかりません。すみません。

    キャンセル

0

VLOOKUP関数ではなくVBAで処理する方法を教えてください。

VLookup関数なら出来るんですよね?
VBAでもVlookUp関数が使えます。
なのでそれを使ってみてはいかがでしょう?
ただしデータ数が大量にあると重いかもしれません。
が、手動でやるよりは全然速いし、入力間違いをしません。

作業の流れ的には
1行毎に見て行って
CountA関数でデータ数を数え、
もし、データ数が既定の数なければ、
Vlookup関数で検索して補完する
というのを繰り返せばいいと思いますが、
コードを書けそうですか?

Web上に情報は大量にありますので、調べてみて書いて見てはいかがですか?
その結果、こうやったけど、期待した結果にならない。
どうしてもエラーが出て動かないなど、
書いてみたコードとともにどんなことをやってみたかを、
教えてもらえれば、また、アドバイスが貰えると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/04 22:03

    ご回答ありがとうございます。参考にさせていただきます。

    キャンセル

同じタグがついた質問を見る

  • VBA

    1906questions

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