• 締切済み

エクセルマクロで日付検索について

エクセルのマクロで日付を検索するマクロについて質問です。 ブックAのシート1のA列に A1 2017/3/13 A2 2017/4/1 A3 2017/4/19 A4 2017/5/16 A5 2017/7/17 A6 2017/9/5 というような日付が入っています。 ブックBのシート1のA1セルに2017/6/3と入力してマクロを実行した際に その日付に一番近い一つ前の日付を探し、見つけた日付のB列のセルを ブックBのシート1のA2セルに表示したいです。 今回の例であれば2017/6/3に対してブックAのシート1のA列はA4セルが当てはまり その当てはまったA4セルの1つ横のB4セルの内容をブックBのシート1のA2セルに表示するということです。 よろしくお願いします。

みんなの回答

回答No.3

うん、まぁ・・なんというか・・ 「マクロでやりたい」理由は何かおありでしょうか? ワークシート関数のみで  ブックBのA2セル:  =VLOOKUP(A1,'ブックAのフルパス\[ブックA]シート1'!$A$1:$B$6,2,TRUE) でいけると思うんですが。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

VBAをやるということだが、エクセルの「日付セルの値」は、セルの値が「日付シリアル値」という整数であることを、質問者は知っていて質問しているのかな。知らなければ、Googleで「エクセル 日付シリアル値」で照会。 表示形式を「数値」にしてみると セル 日付シリアル値 A1 42807 A2 42826 A3 42844 A4 42871 A5 42933 A6 42983 である。 ーー 一応A列データは昇順に入力されていると考えてよいらしい。質問に明記すべき点だ。 一方2017/6/3は、日付シリアル値は、42889だ。 だから42889が、A列のどの行の間の値に該当するか、を調べればよい。 >一番近い は直前と直後の値との間の差(日数差)の少ない方を探索することになるのかな。 Sub test01() For i = 2 To 7 Cells(i, "B") = Abs(Cells(i, "A") - 42889) Next i m = WorksheetFunction.Min(Range("b2:B7")) MsgBox m mr = Range("b2:B7").Find(m).Row MsgBox mr MsgBox mr - 1 End Sub これを拡張して、あとは質問者で考えて。 ・範囲の流動化 ・データ最下行7行目を.End(xlup)でとらえる。 ・2017/6/3の変数化 など ーー >ブックBのシート1のA2セルに表示したいです。 の部分は省略。この部分など質問のメインではないだろう。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.1

こんな感じで。 Dim WR As Range Set WR = Workbooks("BookA.xlsx").Worksheets("Sheet1").Range("A1:B6") With Worksheets("Sheet1")     .Range("A2") = WorksheetFunction.VLookup(.Range("A1"), WR, 2, True) End With この処理の前に、BookAが開いていなければ開く処理を入れてください。

yyrd0421
質問者

補足

ありごうございます。目的の動作が行えました。 ちなみにVLookupでは複数の条件の検索などは行いのでしょうか? シート作成中にもうひとつ条件をいれなくてはいけない状況になってしまいました。 同じ日付が数個あり ブックAのシート1のC列に完了・未完了という言葉があるので ブックBのA2セルに完了・未完了を入力して 1個目の条件の日付と、2個目の条件の、完了・未完了の一致する方の B列のセルを抜出せればと考えております。 もしご存じであれば教えてください。

関連するQ&A