アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

エクセルでA表とB表があります。

両表には、同一の固有のIDがふられており、それぞれ日付とデータがあります。順番は不同です。
A表にある日付(B列)とデータ(C列)の横(D列、E列)にB表のデータを取り込みたいです。
取り込み方法は、A表のA列にあるIDと同じB表のID(A列)を合わせて、かつA表B列の日付に一致もしくは近似日の日付をB表から抽出しA表D列に、その横にあるB列のデータをA表E列に入力したいです

質問が分かりにくかったら申し訳りません。
宜しくお願いします

質問者からの補足コメント

  • 関連画像を添付しました。
    分かりづらく、大変失礼しました。
    質問文だと表Aと表Bは別シート扱いにしていますが、
    添付画像は見やすさの為、一つにまとめています。

    分かる方、ご教授お願いします。

    「条件を合わせて2つの表を一つにまとめたい」の補足画像1
      補足日時:2018/11/07 19:29
  • 近似日の詳細が記載していませんでした。
    重ね重ね、すみません。

    近似日とは、日付1から1か月以内(30日以内)の日付です。
    後は求めていません。

    宜しくお願いします。

      補足日時:2018/11/08 09:28

A 回答 (8件)

今後、自分で解決できる実力をつけるためのヒントを簡単に関数一発!などと欲張らずに段階を追って、後でも見直しが容易なようにやってみましょう。



① IDをキーに、表2にDATEDIFとVLOOKUPを用いて両方の日付の差異を出してみましょう。
  注意点は、表Bの日付2と表Aの日付1のどちらを先に置くかを考慮すること。調べてね!
  その理由により、表Aの日付1以降の日数は、反映されないようになります。  
② 上記ができたら、IDと日付の差異の順番で昇降ソートしてみてください。
  少し見えてくると思います。
③ 次にIFを用いて、30日以前のデータのみを反映する列と同じくデータを反映する列を作ってみましょう。
  つまりこれが、結果になります。
④ 表Aと表BのIDをキーにVLOOKUPで拾えば完成。

あとで見直しも簡単にできると思いますし、修正もできると思います。 頑張って!
「条件を合わせて2つの表を一つにまとめたい」の回答画像7
    • good
    • 0
この回答へのお礼

色々とアドバイスを含め、ご回答ありがとうございました
DATEDIFの関数が見つかりませんでしたが、他のやり方で何とかやってみました。

お礼日時:2018/11/11 18:59

No.4です。



>近似日とは、日付1から1か月以内(30日以内)の日付です。

30日と限定してしまうと、大の月・小の月の兼ね合いもあると思いますので、
実質1か月以内としてみました。

前回のコードの
>If Abs(.Cells(i, "B") - FoundCell.Offset(, 1)) <= 3 Then '//←Sheet1、B列日付の前後3日以内★//
の行を
>If FoundCell.Offset(, 1) <= WorksheetFunction.EDate(.Cells(i, "B"), 1) Then

に変更してみてください。m(_ _)m
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

VBAはまだ不勉強ですが、やってみます。
ありがとうございました

お礼日時:2018/11/11 18:58

ということは、30日前までの近似値あり、それ以上前と後日は、対象外ということですね。


そこが、重要な情報。
    • good
    • 0
この回答へのお礼

おっしゃる通り、30日より前と後日は対象外になります。

お礼日時:2018/11/08 13:05

他の方も書かれている通り、近似値についての条件解説が、不足していますね。


既定日より、前の日なのか、後の日なのか?
もし、後を指定すれば、10日離れても、10日後なのか?例:3日前、1日前、10日後の場合
もし、前を指定すれば、10日離れても、10日前なのか?例:10日前、1日後、5日後の場合
3日前と4日後もあれば、1日前と1か月後もある、その逆もしかり。
つまるところ、1日前後の場合どっちなの?がポイントかな?
    • good
    • 0

こんばんは!



>近似日・・・
Excel的にはこんな曖昧な検索はできません。
こちらで「近似日」の範囲を決めてやる必要があります。
例えば、Sheet1のB列日付の「前後3日以内」のように!

VBAになりますが、一例です。
とりあえず前後3日以内のデータがあればSheet1のF・G列に表示するようにしてみました。
尚、Sheet1・Sheet2は↓の画像のような配置だという前提です。

標準モジュールです。

Sub Sample1()
 Dim i As Long, lastRow As Long, wS As Worksheet
 Dim FoundCell As Range, FirstCell As Range
  Set wS = Worksheets("Sheet2")
   With Worksheets("Sheet1")
    lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
     If lastRow > 1 Then
      Range(.Cells(2, "F"), .Cells(lastRow, "G")).ClearContents
     End If
    For i = 2 To lastRow
     Set FoundCell = wS.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
      If Not FoundCell Is Nothing Then
       Set FirstCell = FoundCell
       GoTo 処理
        Do
         Set FoundCell = wS.Range("A:A").FindNext(after:=FoundCell)
          If FoundCell.Address = FirstCell.Address Then Exit Do
処理:
          If Abs(.Cells(i, "B") - FoundCell.Offset(, 1)) <= 3 Then '//←Sheet1、B列日付の前後3日以内★//
           .Cells(i, "F").Resize(, 2).Value = FoundCell.Offset(, 1).Resize(, 2).Value
          End If
        Loop
      End If
    Next i
   End With
    MsgBox "完了"
End Sub

※ Sheet2のIDに重複があるというコトなので、条件に合致するデータが複数ある場合は
最終行のデータが反映されます。

※ コード内の「★」の行で前後○日としていますので、
仮に前後1週間まで範囲を広げたい場合は「3」を「7」に変更してください。m(_ _)m
「条件を合わせて2つの表を一つにまとめたい」の回答画像4
    • good
    • 0

こんにちは



レイアウトは把握していませんが、どうやらA列の値がIDとして使えるような感じなので、

A表に関数を設定するものとして、
1)A表と同じIDの行をB表から検索し、その行の値を参照する関数
 (A表のD、E列に設定)
を設定すれば、ほぼ実現できるものと思います。

B表にだけ存在するID(=A表には記載がない)が出現する可能性がある場合は、1)だけでは全てをピックアップできませんので、
2)A表にないIDの行をB表から検索して、A表のA列に転記(追記)する関数
 (A表のA列に設定)
 (A列に追加のIDを表示できれば、後は1)を利用して検索すれば良い)
の2種類を考える必要がありそうな気がします。

2)のようなケースの可能性がないことがわかっている場合は比較的簡単です。
VLOOKUP関数を利用するだけで1)に相当するものが作成可能と想像しますので、この関数に関して調べてみることをお勧めします。
(ID欄がA列にない場合は、Match + Index関数など)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ご回答いただいた1)のパターンです。
VLOOKUPを用いようとは考えたのですが、近似日のデータ抽出ができずに困ってしまいました。

お礼日時:2018/11/07 19:43

関数無視して、せめてベタ打ちのイメージか、手書きでもいいのでイメージを描いてくれるとわかりやすいのにといつも思います。


伝える技術が身につけば、回答も増えるはず!
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
画像を添付しました

VLOOKUPでできるかとは考えたのですが、近似日の抽出がうまくできずに困っています。

お礼日時:2018/11/07 19:42

この手の問題は、紙の上で鉛筆片手に手作業で処理を行う手順をそのまま再現すれば良い。



まず、B表のA列のデータを上から順番に、A表のA列に同じデータがあるかを調べますよね。
次に、その見つけた行の日付を確認して最も近い日付を選びますよね。
そして最も近い日付のデータをB表に書き写す。
ではありませんか。

この手順を関数を使って行うかマクロ(VBA)を使うかは質問者さん次第。
関数もマクロも分からないのであれば、手作業で一つ一つ拾ってくることになると思います。
意外とそのほうが早かったりすることもありますよ。


・・・注意・・・
どのようにして「同じ日付」か「もっとも近い日付け」かの判断をするのかもよく考えましょう。
ちゃんと条件を決めて判断しないといけないことは分かると思います。
質問文にはそれが明記されていません。
(例:11月5日に対して、11月4日と11月6日のデータがあったらどちらを採用するか…など)

ちなみに疑問を解決することが目的ですので、
「代わりに作ってください」
とか
「参照先を変えるだけで使えるテンプレートを寄こせ」
と言うのは質問ではなく依頼ですのでこの場にふさわしくありません。
てかルール違反なんだな。

「どんな関数を組み合わせればいいのか、どんなコードを使えばいいのか、アドバイスをください」
「自分はこんなやり方をしたけど、意図する結果ではなく、こうなった。何を間違えているのか教えてください」
のような質問をすることを勧めます。


・・・余談・・・

ごめんよ。
他人に頼ってばかりでは、目の前にある疑問を先送りにすることになる可能性があるんだ。
自分で問題を解けるようにならないと解決ではありませんよね。
愚痴っぽくなりましたが、それを理解できない質問者さんが多いのです。
ご理解ください。
    • good
    • 1
この回答へのお礼

意図しない内容で失礼しました。
関数でもわかればよいのですが、VLOOKUPを使用しようと考えたのですが、近似日の抽出に困難をしています。
近似日は、表Aの日付より表Bの日付が前のものを探します。
作って欲しいというわけではなく、どんな関数を用いればよいのかを教えていただきたく投稿させていただきました。

お礼日時:2018/11/07 19:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!