- ベストアンサー
セルの検索方法を御教授願います。(見難くてすいません)
毎々皆様の御教授感謝しております。 さて、題記の件、月間予定表なるを作成中しているのですが・・・ 予定リスト カレンダー | | | | 1日 | 2日 | | | | |---- |---- | | | | | | | | | |予| 予 | 作|予| 予 |予| 予 | |定| 定 | 業|定| 定 |定| 定 | |番| 内 | 者|番| 内 |番| 内 | |号| 容 | A|号| 容 |号| 容 | | | | | | | | | | | | |-----|-----| | | | | | | | | | | | 作|予| 予 |予| 予 | | | | 業|定| 定 |定| 定 | | | | 者|番| 内 |番| 内 | | | | B|号| 容 |号| 容 | | | | | | | | | | | | |-----|-----| 上記のような形で、カレンダー部の予定番号を入力し、「VLOOKUP」で予定リストを参照し予定内容をカレンダーに反映させています。 ここでカレンダー部へ予定番号の入力漏れの無いように予定リストの横にチェックを入れる為に =IF(A3=I3,"入力済み",IF(A3=I4,"入力済み",IF(A3=I4,"入力済み",IF(A3=I5,"入力済み",IF(A3=I6,"入力済み",IF(A3=I7,"入力済み",IF(A3=I8,"入力済み",IF(A3=L3,"入力済み"・・・,"未入力")・・・))) と考えましたが「IF」は7つまでなんですね。何か良い関数は無いものでしょうか? 可能であれば「入力」「未入力」を表示させるのでなく、カレンダー部へ入力した日付を表示させたく考えております。 長くなってしまいましたが宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
A B C I J K L 1 予定リスト 1日 2日 2 予定番号 予定内容 予定番号 予定内容 予定番号 予定内容 3 1010 あああ102 <式> 5010 えええ999 4 1020 あああ103 入力済み 3990 えええ777 5 9990 あああ201 1020 あああ103 6 9980 あああ205 入力済み 9980 あああ205 7 5010 えええ999 入力済み 8 4010 えええ888 9 3990 えええ777 入力済み 上のような表を想定します。 カレンダー部は31日まであって、I列からBR列とします。 J3セルには =VLOOKUP(I3,$A:$B,2,0) が入ります(既にこうなっている?) C3セルには =IF(COUNTIF($I:$BR,A3)<>0,"入力済み","") として、必要な行数、下方向にコピーします。 質問には書いてありませんが、予約番号には重複はないだろうとの予測で、 入力範囲内の該当予約番号をカウントしています。1つでもあれば入力済みにしています。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
問題の細部まで理解できたかどうか分かりませんが、一部は想像で (1)この程度(と言うかちょっとビジネス向け)のことを処理しようとすると、VBAを使わないとどうしようもないと日頃思っているので、VBAで考えて見ました。 こちらもセル探し(Cell(X,Y)のX、Yの割り出し方のこと)にパズル的なところがありますが。 (Sheet2)A1:C9の当初データ。 予定内容を入力するフェーズ。 予定番号 予定内容 人数 1 会場下見 0 2 主催者へ挨拶 0 3 出演者案内 0 4 会場片付け 0 5 機器移動 0 6 出演者リハ立会い 0 7 出演交渉 0 8 精算 0 (Sheet3) 担当者と予定番号を日別に入力。 予定内容は=IF(B2="","",VLOOKUP(B2,Sheet2!$A$2:$B$30,2))を入れて、縦方向に複写。 C,E,G,I、・・列でも複写して、下方向へ複写は同じ。 作業者 1日 2日 3日 4日 山田 1 会場下見 2 主催者へ挨拶 5 機器移動 秋山 3 出演者案内 久保 4 会場片付け 久保 5 機器移動 本田 6 出演者リハ立会い 山田 7 出演交渉 山田 8 精算 (VBAコード) VBEの標準モジュール画面に Sub test02() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("sheet2") Set sh2 = Worksheets("sheet3") d1 = sh1.Range("a2").CurrentRegion.Rows.Count d2 = sh2.Range("a2").CurrentRegion.Rows.Count For i = 2 To d1 sh1.Cells(i, "c") = 0 Next i '------------ For i = 2 To d2 For j = 2 To 62 Step 2 If sh2.Cells(i, j) <> "" Then MsgBox sh2.Cells(i, j) If sh2.Cells(i, j) > d1 Then GoTo err x = sh2.Cells(i, j) 'Sheet2の行事番号 z = sh1.Cells(x + 1, 3) '従事人数 sh1.Cells(x + 1, z * 2 + 4) = sh2.Cells(1, j) '第1行は日付 sh1.Cells(x + 1, z * 2 + 5) = sh2.Cells(i, "A") 'A列は担当者 sh1.Cells(x + 1, 3) = sh1.Cells(x + 1, 3) + 1 End If Next j Next i '------------- Exit Sub err: MsgBox "予定番号エラー" End Sub Set sh1 = Worksheets("sheet2") Set sh2 = Worksheets("sheet3") の””の中は、本番のシート名でそれぞれ置き変えること。 これをショートカットかボタンかメニュに登録して 予定を増やしたり、担当者を増やしたりした時に実行する。 (結果)Sheet2のC1:G9 人数 日 担当者 日 担当者 1 1日 山田 1 2日 山田 1 2日 秋山 1 3日 久保 2 4日 山田 4日 久保 1 4日 本田 1 4日 山田 1 4日 山田 となりました。 関数で出来ないことはないかも知れませんが、人数の可変に対処など難しそう。
補足
回答ありがとうございます。 やはりVBAが必要になってくるのでしょうか・・・。 カレンダー部へ予定番号の入力の重複は無いとしても無理なものでしょうか。 お手数をおかけしますがご指導願います。
- SAKURAMYLOVE
- ベストアンサー率30% (162/533)
発想を変えて1行1レコードではだめでしょうか。 1行にカレンダーも作業者もごっちゃにはいると一見やりにくそうですが、後から並び替えはできますし、オートフィルタをつけておけば、抽出も可能です。 一般的にデータベースは、1行1レコードが原則ですし、その他の処理もやりやすくなります。 その前提で、以下のような表を想定します。 A B C D I J K L 作業番号 予定内容 作業者 予定日 | 作業者 予定日 予定番号 予定内容 A AAAAA 田中 04/07/18 | 田中 04/07/18 A AAAAA B BBBBB 佐藤 04/07/20 | 松本 04/07/19 C CCCCC C CCCCC 松本 04/07/19 | 佐藤 04/07/20 B BBBBB (上記表はずれてますが、ノートパッドに貼り付けると整列します) L列は、VLOOKUPで作業内容を参照していますが、 それぞれCおよびD列には、以下の関数が入ります。 C3=IF(COUNTIF($K$2:$K$1000,$A2)=0,"予定なし",INDEX($I$2:$K$1000,MATCH($A2,$K$2:$K$1000,0),1)) D3=IF(COUNTIF($K$2:$K$1000,$A2)=0,"予定なし",INDEX($I$2:$K$1000,MATCH($A2,$K$2:$K$1000,0),2)) とすれば、右の表から該当する作業者名と作業日を引っ張ってきます。 また、該当がない場合は、予定なしと表示します。
お礼
度々の御教授ありがとうございます。 しかしながら見たままを印刷してカレンダーにしてしまいたいのでこの方法では難しいかと存じます。(しかも私以外の人が) せっかくの御教授いただいたのに申し訳ありません。
- SAKURAMYLOVE
- ベストアンサー率30% (162/533)
ORを使って、 =IF(OR(A3=I3,A3=I4,A3=I5,A3=I6,A3=I7,A3=I8,A3=L3,...),"入力済み","未入力") では、いかがですか。
補足
早速の回答ありがとうございます。 しかしながら 作業者が4人、1人の作業者に対して10行の予定欄、これが30日分となると数式の長さが・・・ 申し訳ございませんが何か方法は無いものでしょうか?
- zero-fighter
- ベストアンサー率30% (155/507)
私の場合、力技ですが、別シートを使いました。 つまり、 IF(Sheet1!A3=Sheet1!I3,1,0) IF(Sheet1!A3=Sheet1!I4,1,0) IF(Sheet1!A3=Sheet1!I5,1,0) としておいて、これらの数字を合計する。そして IF(Sheet2!A10>0,'入力済み','未入力') (A10に合計が入っているとして) セルがずれているので、どれが日付か判りませんが、 IF(Sheet1!A3=Sheet1!I3,Sheet1!C0,"") (c0が日付として) としておいて、文字列をconcatenateで結合。 そして、 IF(Sheet2!A10="",'',Sheet2!A10) …力技ですね。
補足
見難くて申し訳ございません。 早速の回答ありがとうございます。 しかしながらせっかく回答いただきましたがシートを月ごとに作成しているもので、これ以上シートは増やすのは・・・。
お礼
ありがとうございます! バッチリでした。 後は、入力した列に該当する日付が問題です。 私もがんばって考えてみます。