- 締切済み
基準日から判断し値を表示するには
任意の日に複数ある会議室を誰が使う予定なのかを表示させたいです。 シート1には氏名と開始日と終了日を記録します。シート2は会議室フロアの平面図です。基準日(デフォルトはtoday)が開始日と終了日の範囲にある場合に氏名を表示させます。該当しなければ何も表示しません。 X1に入る関数を教えて下さい。 シート1 C列:名前 D列:開始日 E列:終了日 シート2 A1:基準日(基本today。任意に変更できる) X1:平面図の中にある会議室
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
#1です。#1では、「文章を書くだけ」だったので、当方で、「9割り方は質問内容を想像して」、VBAでやって見た。 ーー 言いたいことは、もしこんな課題なら、エクセル関数で出来ると思いますか?。 とてもできないと思う。 この質問課題は、何の課題だと思っているのかな?VBAのものだとは思っていないようだが。 ーー 私がやった例。 例データ Sheet1のA1:D15 1室の予約状況と考えてください。 月日 開始 終了 連絡先 2022/11/2 9:00 12:00 山田 2022/11/2 14:00 16:00 北側 2022/11/2 16:00 18:00 田路 2022/11/4 10:00 11:00 近藤 2022/11/4 13:00 14:00 館野 2022/11/4 16:00 17:00 石島 2022/11/5 9:00 10:00 刈谷 2022/11/5 12:00 14:00 田島 2022/11/5 16:00 16:00 山田 2022/11/5 18:00 18:00 総務 2022/11/6 9:00 9:00 人事 2022/11/6 12:00 13:00 斎藤 2022/11/6 16:00 16:00 人事 2022/11/6 17:00 18:00 今井 ーー A列は,日付シリアル値で、B,C列は時刻シリアル値で入力するとします。 (エクセルの入力としては、それが、普通ですから。) 利用者は、1日5者以内とします。 ー G1:Q1に 9:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 と入れておきます。これらデータは、文字列です(アポストロフィ+9:00(半角)のように、入力しておきます)。 こちらを(時刻シリアル値でなく)数字の文字列にする理由は略。 (指定時刻の入っているセル探索で、Findを使おうとしたが、うまく行かなかったので、VBAでMatch関数を使った。) ーー これをシートに図示してみる、とします。シートのセルG2:Q5の範囲に。 横棒グラフをシートに描くようなイメージです。 ーー エクセルにマクロの使用許可を設定して、 VBAで標準モジュールに ーー Sub test010() Set wf = Application.WorksheetFunction Dim st, ed As Range ct = Array(0, 4, 12, 24, 32, 44) ’色コードリスト(利用者は、1日5者以内) Set ws1 = Worksheets("Sheet1") ws1.Range("G2:Q5").ClearFormats ws1.Range("G2:Q5").Clear '---- k = 2 '色を付ける行の最初行 1日1行 c = 1 '色コードのスタート lr = ws1.Range("A100000").End(xlUp).Row 'データ最終行行番号 For i = 2 To lr '2行目からスタート '日付け一致か If ws1.Cells(i, "A") > ws1.Cells(k, "F") Then k = k + 1 c = 1 '色配列最初を指す ws1.Cells(k, "F") = ws1.Cells(i, "A") '日付けをセット Else End If If ws1.Cells(i, "A") = ws1.Cells(k, "F") Then '日付一致確認 ws1.Range("G1:Q1").Select x1 = Format(ws1.Cells(i, "B"), "h:nn") y1 = wf.Match(x1, ws1.Range("G1:Q1"), 0) sc = y1 + 6 x2 = Format(ws1.Cells(i, "C"), "h:nn") y2 = wf.Match(x2, ws1.Range("G1:Q1"), 0) ec = y2 + 6 Range(ws1.Cells(k, sc), ws1.Cells(k, ec)).Interior.ColorIndex = ct(c) Range(ws1.Cells(k, sc), ws1.Cells(k, ec)).BorderAround Weight:=xlThin '-- nc = Int((sc + ec) / 2) ws1.Cells(k, nc) = ws1.Cells(i, "D") ws1.Cells(k, nc).Font.Color = vbWhite c = c + 1 '次の色コードを指す Else '色づけ部の行ポインタ+1 k = k + 1 c = 1 '色コード色の配列最初を指す End If Next i End Sub ーー 実行結果は掲示省略。 == でも上記は「おもちゃ」のようなものです。機能などで、不十分がいっぱいです。 それでもVBAで相当多くのコード数を要します。 だから、エクセル関数などでは、対応できないでしょう。 上記では、 (1)日付の範囲のコントロールができてない。月替わりなどの問題も無視。 (2)時間単位にしか指定できない。10分単位などでは、表が大きくなり、複雑化するでしょう。 (3)入力チェック、データのチェックができてない (4)データの変更・削除に対応できてない (5)複数の室の管理には対応できてない なども思いつきますが、それらをやろうとすると、大変VBAコードが複雑、長大になる。 結局一般的な予約システムの1セットの処理が必要になり、小規模でも必要なものは最低限必要です。
- SI299792
- ベストアンサー率47% (774/1620)
該当日付が複数あったらどうするのですか。 1番上だけでよければ、 =IFERROR(INDEX(Sheet1!C:C,MATCH(1,INDEX((Sheet1!D1:D99<=A$1)*(A$1<=Sheet1!E1:E99),),0)),"") 99列までを想定しています。もっと多い場合増やして下さい。 複数あったら場合全部表示したい場合、どのようにするか (X1 X2 と下にするのか) それと、Excel のバージョン(スピルが使えるかどうか)補足に書いて下さい。
お礼
お礼が遅れてスミマセンでした。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
この質問の書き振りから、こんな問題を、質問者が、すぐ取り掛かれるとは思わない。 また本当は、別の問題を、会議室の利用に変えているのかもしれないが。 全体的に「丸投げ」志向であるように感じる。1から十まで説明しなくてはならなくて、回答者の手に負えない。普通は、疑問点を絞って質問すべきだ。 ーー データや仕組みの説明もなく、全体の利用場面の説明もなく、説明の書き方が、不十分で、よく判らない。必要と思う、最低限の機能が何か(目的)も書かれてない。 また、エクセル関数でやるのは複雑になると思う。 最低でVBAなどが必要(使わないと不便)と思う。 ーー 小生の思い付き(想像) シート1に 利用者氏名 日付 開始時刻 終了時刻 階 号室 山田 2022/12/1 9:00 11:00 2 1 これぐらいのデータ項目にして表を作る。 ・利用日が、連続2日以上に跨る場合は、別行として、1日ごとに、データを繰り返す。 ・利用者は代表で1名。課などで使うときは課名。連絡者・内線の列を作るのも必要かな。 ーー これのデータ入力は、入力用「ユーザーフォーム」を作り、どのパソコンからも、入力できるようにするべきかも。 1台のパソコンに入力しに来るのか。 ーー 質問の件は、日時や会議室を指定して、予約状況を検索することになろうが、エクセル関数では、検索そのものが、もともと簡単でない(複雑な式になる)ように思うが、作る自信あるのか。 近いかもしれないFILTER関数で出来るかな。エクセルバージョンも書いてないが。 ーー >シート2は会議室フロアの平面図です。 は何のために使うのか。 指定を文字でなく、図のクリックで行うのは、こういう図との連携は、高等技術だと思うが、心配ないのか?。 空き部屋の状況の表示などをやろうとすると、プロ級の技量が必要と思う。 == 以上を参考にして、質問補足や、再質問すべきというのが、小生の意見です。 ハッキリ言って、紙ベースの予約ノートで凌いだら。そこでの問題点を認識したうえで、こういうことを考えるべきだろう。 最低では、パソコンデータ化した、予約データを、利用日+部屋番号でソートするだけでも、1人か2人の利用なら役立つように思うが。あとは該当部分の付近を見るだけでも、役立つのでは。
お礼
お礼が遅れてスミマセンでした。 ありがとうございました。
お礼
お礼が遅れてスミマセンでした。 ありがとうございました。