• 締切済み

vlookupで2番目の登録データを検索表示したい

w7、OFFICE2007の初心ユーザーです。 PCの画面に1カ月カレンダーを描き、各日付の下のセルにその日の予定を書きこむことを考えております。 1)7×5の月間カレンダー(日付、予定表示欄1、予定表示欄2)と、予定記入表(当月日付とその日の予定事項の2列)を作ります。 2)カレンダーの月指定セルをB5、範囲の名前をevent1 、予定を第2列としてカレンダー内の予定表示欄1には、 「=IFERROR(VLOOKUPB5,event1,2,FALSE),"")」 と書き込みました。週の毎日の日付の記入欄にも複写します。 3)予定記入表には、日付の順序によらず、ランダムに書き足すように思いつく順に記入します。 4)vlookup 関数の検索方法を 2 と指定したので日付順序は気にしなくて良いのですが、同じ日に2個以上重要な予定がある場合などは、2番目以降の日付と予定は 無視されてしまします。  そこでお尋ねします。予定表示欄1には最初に登録した予定を、予定表示欄2 には後日付け足した予定を、3番目以降では表示欄に*印なり「予定記入表を見よ。」とでも表示したいのです。よろしくお願いします。

みんなの回答

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.13

>予定表示欄2 B4=IF(COUNTIF(date,B2)>1,INDEX(event,MAX(INDEX((date=B2)*ROW(date),0))),"")の部分が難解ですが、その部分をもう少し勉強します。 この数式の一部は誤りです。 正しくは次の数式になります。 予定表示欄2 B4=IF(COUNTIF(date,B2)>1,INDEX(event,LARGE(INDEX((date=B2)*ROW(date),0),COUNTIF(date,B2)-1)),"") 名前の定義を変えてあることは理解できていますよね? dateの範囲にB2と同じ日付が1より多い(2以上)ときINDEX関数で2番目に一致する予定事項を抽出します。 LARGE関数の第1引数はINDEX関数で前処理を行ってその結果を配列のままLARGE関数へ渡し、COUNTIF関数で2番目に検出した位置(行番号)を算出しています。 例えばC4の数式で前処理部分は次の数式になります。 INDEX((date=C2)*ROW(date),0) → {0;2;0;4;0;0;0;0;0;・・・・・・} このINDEX関数の第2引数を0または無指定にすると配列全体を返しますので論理式の(date=C2)に配列のROW(date)を乗ずることでdateの日付がC2と一致する位置の行番号と不一致の日付は0となる配列が返されます。 LARGE関数の第2引数は配列の値から大きい順の何番目か指定するものであり、COUNTIF関数で日付が一致する個数を調べてそこから1を減ずれば2番目に見つかった位置になります。 C4の例ではCOUNTIF関数の戻り値が2ですから1を減じて配列の値で1番大きい値の行番号(4)を外側のINDEX関数の第2引数へ返します。 C4へは配列名eventの4行目(予定C)が返ることになります。 これらの論理をあなたが理解できなければ仕様変更したときに数式を変えることができなくなります。 丸写しの流用は慎むようにして頂ければ幸いです。

sinko-sa
質問者

お礼

アフターケア付きで感激です。 解説も付けていただき多謝。 私の数少ない知り合いに見せるものですから、公開というまでにも達しない (せいぜい娘に見せる程度でしょう)から、ご心配は御無用ですし、ご趣旨も了解です。ありがとうございました。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.12

済みません 早速、間違えてました お詫びの上 訂正させて、ください 誤記 B5に =IF(CHOOSE(WEEKDAY(DATE($B$2,$C$2,1),2),"月","火","水","木","金","土","日")=B$4,1, IF(ISNUMBER(A$5),A$5+1,"") ) B6に =IF(B5<>"",IFERROR( HLOOKUP(B$5,予定表!$A$3:$AE$6,2,FALSE()),""),"") B7に =IF(B6<>"",IFERROR( HLOOKUP(B$5,予定表!$A$3:$AE$6,2,FALSE()),""),"") B8に =IF(B7<>"",IFERROR( HLOOKUP(B$5,予定表!$A$3:$AE$6,2,FALSE()),""),"") 正記 B5に =IF(CHOOSE(WEEKDAY(DATE($B$2,$C$2,1),2),"月","火","水","木","金","土","日")=B$4,1, IF(ISNUMBER(A$5),A$5+1,"") ) B6に =IF(B5<>"",IFERROR( HLOOKUP(B$5,予定表!$A$3:$AE$6,2,FALSE()),""),"") B7に =IF(B6<>"",IFERROR( HLOOKUP(B$5,予定表!$A$3:$AE$6,3,FALSE()),""),"") B8に =IF(B7<>"",IFERROR( HLOOKUP(B$5,予定表!$A$3:$AE$6,4,FALSE()),""),"") 済みませんでした

sinko-sa
質問者

お礼

早速にご教示多謝です。 iferrorやchoose関数から勉強しますので、結果が活用されるのは大分先になると思います。ありがとうございました。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.11

済みません 思うより 全然、簡単… でしたね 此なら 万年カレンダー部を、省けば 公開して、十分 ですね https://1drv.ms/x/s!AjviygfJDgV_kWcEoySAkjefZXqh という データ構造の、時 B5に =IF(CHOOSE(WEEKDAY(DATE($B$2,$C$2,1),2),"月","火","水","木","金","土","日")=B$4,1, IF(ISNUMBER(A$5),A$5+1,"") ) B6に =IF(B5<>"",IFERROR( HLOOKUP(B$5,予定表!$A$3:$AE$6,2,FALSE()),""),"") B7に =IF(B6<>"",IFERROR( HLOOKUP(B$5,予定表!$A$3:$AE$6,2,FALSE()),""),"") B8に =IF(B7<>"",IFERROR( HLOOKUP(B$5,予定表!$A$3:$AE$6,2,FALSE()),""),"") 横に、フィルする 等で 工夫して、完成させます 末日処理は内緒です

sinko-sa
質問者

お礼

お世話様でした。小生はweekday関数で万年暦を作り、予定表から この万年暦にiferror関数で転記させました。第2予定が無視されるのは困ると注文されたのです。ありがとうございました。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.10

回答No.7の修正です。 誤 予定表示欄2 B4=IF(COUNTIF(date,B2)>1,INDEX(event,MAX(INDEX((date=B2)*ROW(date),0))),"") 正 予定表示欄2 B4=IF(COUNTIF(date,B2)>1,INDEX(event,LARGE(INDEX((date=B2)*ROW(date),0),COUNTIF(date,B2)-1)),"") 修正後の検証結果を画像で添付します。

sinko-sa
質問者

お礼

小生のカレンダーでは、横列に日~土まで、縦行に「日付、予定表示欄1,2、3」ワンセットで5週分です。貴殿の御作と同じイメージです。 ありがとうございました。 

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

補足していただいてありがとう。 まだじっくり読んでいないのですが、昨日考えて、取り急ぎ参考に。 データを横方向に流しているので、VLOOKUP関数でなく、 HLOOKUP関数利用が適当の問題ではないかと思った。 https://dekiru.net/article/4447/ HLOOKUP関数で範囲を横方向に検索する ーー 説明例 A1:E7  F列より右列は省略 A3に日付を利用者が入力、A4以下のセルに当日行事が出る <ーー関数で ー  2017/4/1  2017/4/2  2017/4/3  2017/4/4 2017/4/4  ppp  aaa   bbb     週間会議 週間会議  kk  bbb  xxx    A社売り込み A社売り込み    hhh   製品開発会議 製品開発会議       ポスター発注 ポスター発注 ーー A4セルに式を入れる  =HLOOKUP($A$3,$B$2:$X$20,ROW()-2,FALSE) 下方向に式を複写 結果 上記例の通り。 ーー 取り急いでいるので、また本筋を強調するため、 HLOOKUPの前につける関数は省略(余分な0を出さないための) 日付の問題(日付シリアル値で統一されているか?) も考慮から外した

sinko-sa
質問者

お礼

例題でやってみます。ありがとうございました。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.8

回答No.7の予定表示欄2の数式に誤りがありました。 時間が無いので訂正の数式を午後までお待ちください。

sinko-sa
質問者

お礼

直しました。多謝。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.7

他の回答者へのお礼に提示されている模擬データを参考に回答させていただきます。 範囲の名前を日付の列と予定の列を区別すればVLOOKUP関数以外の抽出法が容易になります。 日付の列をdateとし、予定をeventにしたとき次のような数式で良いと思います。 予定表示欄1 B3=IFERROR(VLOOKUP(B2,date:event,2,FALSE),"") 予定表示欄2 B4=IF(COUNTIF(date,B2)>1,INDEX(event,MAX(INDEX((date=B2)*ROW(date),0))),"") 予定表示欄3 B5=IF(COUNTIF(date,B2)>2,"※","") 貼付画像はExcel 2013で検証した結果ですがExcel 2007でも再現できます。 尚、J列をdate、K列をeventと命名しました。 B3:B5セルを右へH列までコピーし、B3:H5を纏めてB7:H9へコピーしたものです。

sinko-sa
質問者

お礼

予定表示欄2 B4=IF(COUNTIF(date,B2)>1,INDEX(event,MAX(INDEX((date=B2)*ROW(date),0))),"")の部分が難解ですが、その部分をもう少し勉強します。ありがとうございました。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.6

失礼 崩壊、させる とは もう 何処に、でも 既に、転がっている 此の、様な 中では 大げさ、ですかね? 定番な事、しか して、ないし 僕も 此の、様な 場で 教わった、内容 詰まり ご好意で、頂いた スキル…、だし お求め、頂ける なら… 此の、式 一つ位、なら… 大丈夫、かな?

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.5

出来ました でも、解るかどうか… 此って プロの、難易度で 公開すると カレンダー業界を 崩壊させかねない ので ファイルでの、動作確認済み https://1drv.ms/i/s!AjviygfJDgV_kWOQ3LNpoBS43CwL ですが、 データ構造と、主たる式、 だけに しますね 解説も しない事に、します し、 申し訳、ないが 又著作権も、主張しないと まずい気が、します。 故に、 許可、無く 改ざん、引用、転用、其の他、 を、 一切、禁止します。 済みません、 迷惑が、掛かるので 堪えてください。 では、行きますね 添付の、ような データ構造の、時 =IF(B5<>"",IFERROR( OFFSET(予定表!$A$2, SMALL( INDEX( (B5=INDIRECT("予定表!"&CHAR(65-1+MATCH($C$2,予定表!$A$3:$W$3,0))&"$4:"&CHAR(65-1+MATCH($C$2,予定表!$A$3:$W$3,0))&"$103"))*ROW($A$1:$A$100) +(B5<>INDIRECT("予定表!"&CHAR(65-1+MATCH($C$2,予定表!$A$3:$W$3,0))&"$4:"&CHAR(65-1+MATCH($C$2,予定表!$A$3:$W$3,0))&"$103"))*999999999999999,,), ROW($A1))+1, MATCH($C$2,予定表!$A$3:$W$3,0), 1,1),""),"") 動作確認済み、です。

sinko-sa
質問者

お礼

一読して分るほど関数を勉強しておりません。新顔が多いので、勉強します。ありがとうございました。

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.4

>カレンダー内の予定表示欄1には、「=IFERROR(VLOOKUPB5,event1,2,FALSE),"")」と書き込みました。 数式に誤りがあります。(カッコが1つ抜けています) =IFERROR(VLOOKUPB5,event1,2,FALSE),"")      ↓ =IFERROR(VLOOKUP(B5,event1,2,FALSE),"") また、B5にはカレンダーの月指定の値と言っていますが日付の誤りではないでしょうか? >4)vlookup 関数の検索方法を 2 と指定したので日付順序は気にしなくて良いのですが、同じ日に2個以上重要な予定がある場合などは、2番目以降の日付と予定は無視されてしまします。 「検索方法を 2 と指定した」は誤りです。値を返す列番号を2と指定した」が正しい表現です。検索方法の指定はTRUEまたはFALSEです。 VLOOKUP関数の仕様なので検索値(第1引数)に一致する値が複数のときは行番号の小さい方のみが返り値になります。 >そこでお尋ねします。予定表示欄1には最初に登録した予定を、予定表示欄2には後日付け足した予定を、3番目以降では表示欄に*印なり「予定記入表を見よ。」とでも表示したいのです。 VLOOKUP関数の代わりにINDEX関数を使って2番目以降の予定を抽出すれば良いでしょう。 具体的な数式はevent1の模擬データを提示して頂けないと回答できません。 質問の文言には表現の誤りがあり、予定入力表の具体的な例や予定表示欄1、予定表示欄2とカレンダーの配置が示されていないので数式を提示することが困難です。

sinko-sa
質問者

お礼

早速にお世話様です。index関数を勉強します。それで分らない場合には また質問しますのでよろしく。 ありがとうございました。

関連するQ&A

  • 色つき行を非表示にしたい。

    お世話になっております。 エクセル(2007)で悩んでいます。 月ごとのカレンダーをつくっているのですが、 A列は日付、B列はWEEKDAY関数で曜日を入れてあります。 C列以降は備考欄にしています。 土日祝日は日付と曜日を色つきセルにして、わかりやすいようにしてるのですが、この色つきセルの行を非表示にしてしまいたいのですが、どのようなマクロが使用できるのでしょうか、ご教示ください。

  • VLOOKUPの結果をすべて表示したいです。

    A1:B100にデータが入っていて、所々A3:B3のように空白セルがあるため、C列に関数を入れA列の空白セルと重複データを省いて表示しています。 C列を検索セルにして、表のようにD、E、F・・にB列のデータを順にすべて表示したいのですが、D列はVLOOKUPで一番目のデータだけ表示できてもE列以降のデータの返し方がわかりません。つたない説明で申し訳ありません。ご指導の程、宜しくお願い致します。

  • (EXCEL)在庫管理表で、直近にある入荷数量を表示させたい。

    (EXCEL)在庫管理表で、直近にある入荷数量を表示させたい。 在庫の個数を管理しているエクセル表があります。 一番左の列には、カレンダー式の日付が1日ずつ入力されています。 2008/02/14 2008/02/15 2008/02/16 . . . のようにです。 そして、日付と同じ行に、入荷のある日には、入荷予定の個数を入力しています。 この入荷予定個数の欄は、入荷のない日は空のセルになっています。 いま、やりたいとおもっていることは、今日から直近の日にちの入荷数量を表示させたいのです。 今日の日付をtoday()で表示させて、下のセルに、「直近の入荷数量」 「○○個」 と自動的に表示させるようにしたいのです。 よろしくお願い致します。

  • VLOOKUP関数??

    勤務予定表を作っています。 別のシートで月間勤務予定表は完成しています。 日付 16 17 18 19 20 21 22・・・ 名前 A   早 早 早 休 休 遅 早・・・ B   遅 遅 早 早 早 遅 休・・・  C   休 休 遅 遅 早 休 休 ・ ・ もうひとつ別のシートで、日付を指定すれば、その日付の列を検索して表示させたいのですが、どのような関数を使えばよろしいのでしょうか? 21 ←日付を指定 A 遅 B 遅 ←このように表示をさせたいです。 C 休 ・ ・ 質問がわかりづらくて申し訳ございませんが、よろしくお願いします。

  • excelで作ったカレンダーの指定の期間のセルに色を付けたい

    1行目に1日から30日までの日付が入っていて、二行目以降のAの列に項目が入っているカレンダーを作りました。2行目以降には日付を入れないで、その項目によって期間が分かるようにセルに色を付けたいと思います。入力欄は別に設けて、例えば、2004/6/20~2004/6/23と入力するとセルの色が変わるようにしたいです。 どうしたらいいでしょうか?

  • エクセル、同じ行の別の列の文字列を抽出する関数

    エクセル2010です。 例えば、図の上の表のように、担当ごとにある仕事をした日付を記入していく表があるとします。 そこに記入していくと、同時に別のカレンダー(図の下の表)に、日毎に誰が仕事をしたかまとめて書き出すような書類を作ろうとしてします。 日付を検索条件にして、その日付が書かれている同じ行のA列にあるセルの文字列を、ヒットするものだけ抽出して書き出す、という仕組みです。 カレンダーの日付はあらかじめ記入しているものとします。 こういう場合、どんな関数を使えばよいのでしょうか? 「この関数を使えばいい」というヒントだけでも結構です。どうぞよろしくお願いします。

  • VLOOKUP関数で、検索値の移動

    まねっこで関数を覚えたものです。 エクセルのシートに一年間の「予定表」を作りました。 A4~A65に1月の日にちが、B4~B65に曜日が、C4~C65は予定表の書き込み欄です。予定表は1行では書ききれないこともあり、2行にしました。 D4~D65に同じように2月の予定表を、G4~G65に3月と展開してあります。 新しく「カレンダー」というシートを作り、B7~H7に「曜日」、B8~H8に「日にち」、B10~H10に「予定表」に記載した文言を入れますから、下のように設定しました。 H10=VLOOKUP(カレンダー!H8,予定表!G4:I65,3,FALSE) これは3月を設定したものです。今年の3月1日は土曜日なので、H8となります。 ここから質問です。 カレンダーシートは1枚しかありません。B2に「年」、D2に「月」を入れると、日付、曜日が変わるようにしてあります。 たとえばD2を4月とすると、H10の文言が消えます。予定表!G4:I65と設定してあるので当たり前ですが。 これを月が変わったら、G4:I65 もその月に会うようにするにはどうすればいいのでしょうか。 「カレンダー」のD2に「1」と入れたら、A4:C65 としたいのです。 よろしくお願いします。

  • ExcelのVLOOKUPを使った検索について+α

    またまた質問させてもらいます・・・ VLOOKUPは本来検索範囲の左端の列を検索していくの ですが、それを他の列をキーにしたいのです。ですが、 元表の順番を変えることができないので、検索できずに 困っています。そこで質問なんですが、 ・元表を変えずに(コピー等を作らずに)、関数内だけで 表を擬似的に並べ替えて、左端の列以外の列を検索キーと した列検索は可能でしょうか?可能なら方法はどうやれば よろしいでしょうか。 ・もしそれがだめな場合他のアプローチはありますが? できれば方法も・・・ あと、もうひとつ質問なんですが、検索範囲を指定する 時に左上のセルの位置は固定で右下のセルが表の行数 によって変化する場合、汎用的に関数で指定することは可 能でしょうか? つまり、B4:H14という範囲指定がある場合、表の行数がひ とつ増えるとB4:H15と範囲指定を変えてくれるような方法 はありますか?ということです。 ということです。それではよろしくお願いします。

  • 日付28日、30日、31日、月ごとに自動表示させたい。

    日付28日、30日、31日、月ごとに自動表示させたい。 1、月によって28日、30日、31日と自動表示させたいです。 2、(添付画像:カレンダー)「D2」1日を基準に 「年」「日付」「曜日」「祝日」を自動表示とセルに条件つき書式を使って 色を付けたのですが、その下のセルにも月が変わるごと自動で色をつけたいです。 名前(1番~15番)の列(日付、曜日、祝日)です。 上記の2点教えて下さい。 よろしくお願いします。

  • エクセルの VLOOKUPで2番目の結果を参照

    先日ここで同じ質問をさせてもらって、その時にCOUNTIFを使う方法を教えていただいてこの方法なら何番目の値でも簡単に指定できると思い実際に試してみたのですが当初は2つ目までしか考慮していなかったのですが、シートによっては同じ値(A123)が2回以上入力されるケースもあることがわかりました。 そこで<表ー1>のC8にABC123と入力されたら左の列にC8&COUNTIF関数で何番目のABC123かを表示させて、この末尾2のセルの3列目(X123)を<表ー2>の該当する品名の横に表示させたいのです。 添付の場合A123の横にX123と入るようにしたいのです。 A123が2回しか出てこないなら、VLOOKUPで簡単に検索できそうなのですが、それ以上出てくることもあるのでハタと困ってしまいました。 ちなみに、VLOOKUP(F3&COUNTIF( ),B:D,3)のような使い方はできないのでしょうか? 上記の使い方ができなければ、表ー2にも補助カラムを追加してB列と同じ内容にすることは可能です。

専門家に質問してみよう