プロが教えるわが家の防犯対策術!

エクセルで納期管理をしたいと考えています。

1つの案件について、報告が3回程度ありますが、
案件のそれぞれで納期が違う為、多くの案件を抱えると優先順位が立てづらく、
納期遅れを起こしてしまいます。

シート1(画像の上段部分)に受付日、実施日、納期1、納期2、納期3、情報などのコメントなどをエクセルで記しておき、別シート1(画像の下段部分)で本日の納期1や本日の納期2という具合にリマインドとして使いたいと思っています。
できれば、ピックアップさけたデータに回答日を追記するとシート1の一覧表に書き込まれるともっと良いですが、無理でしょうか。

エクセルが詳しい方よろしくお願いします。

「エクセルで納期管理をしたいのですが(画像」の質問画像

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

  • >できれば、ピックアップさけたデータに回答日を追記するとシート1の一覧表に書き込まれるともっと良いですが、無理でしょうか。

    とは、画像下段のI4の連絡3部分に連絡をした日付を入力すると画像上段の一覧表に転記されるようにしたいということです。

      補足日時:2017/04/23 15:12

A 回答 (4件)

こんにちは



あるデータを加工して管理用のデータ等を作成しようという場合、元のデータの作り方(記入の仕方)や加工の方法(複数の種類の加工をしたりするので)等をあらかじめ考慮した上で、全体の構成を考えた方が良いと思います。
(エクセルで行いやすい処理と、そうでないものがありますので)

ご質問なさっている処理も、実現するのにいろいろな方法があるとは思いますが、何かあるたびに(ちょっとした修正とか)、掲示板で質問する羽目になったりすることのない方法を採用なさった方がよろしいと思います。
仮に質問してみたとしても、適切な回答がもらえるとも限りませんので。


ご質問は、リマインドのために指定日(あるいは指定期間)に該当する項目を一覧で把握なさりたいということだと解釈しました。
また、リストアップした内容に記入すると、自動で元のシートにも反映なさりたいとのことだと思います。

シート内の件数にもよりますが、両方を満足できる簡単な方法は、元のデータをそのまま利用することだと思います。
ANo2様がすでに、必要なものだけをリスト化して表示(他は非表示)する方法をご提示なさっていますが、このような方法であれば、追加記入の内容は自動的に反映されます。(元データなので当然です)


項目数にもよりますが、フィルターをかけたりボタンを押すという一手間も面倒であるならば、自動的にマーキングする方法も考えられます。

添付の図では、D、F、G列の範囲に「=D2=TODAY()」のような条件付き書式を設定しておくことで、該当する部分を強調表示させています。
この方法だと、リスト表示(他は非表示)にはならないものの、自動的に「今日」に該当する日付を強調表示することが可能です。
「今日」以外でも、「特定のセルにある日付」とか「指定した期間内」とかであっても、条件をそのように設定しておくことで実現が可能です。
添付の例では、該当セルのみに色を付けていますが、該当する行全体を強調表示のようなことも可能ですし、追加記入も直接できることは同様です。

条件付き書式やフィルタによる方法であれば、理解しやすいと思いますので、変更や修正もご自身で比較的簡単にできるものと思います
「エクセルで納期管理をしたいのですが(画像」の回答画像4
    • good
    • 0

こんにちは!



お示しの画像で上側が「Sheet1」、下側が「Sheet2」だとします。

>できれば、ピックアップさけたデータに回答日を追記するとシート1の一覧表に書き込まれるともっと良いですが、無理でしょうか。

Sheet2に数式を入れて表示させると、Sheet2のデータ変更の時点で数式そのものが消えてしまいますので
関数での処理は無理だと思います。
VBAであれば可能です。

一例です。
配置が画像通りだという前提で・・・

まず、Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペーストしてください。

Sub Sample1() '//この行から//
Dim i As Long, j As Long
Dim lastRow As Long, lastCol As Long, myRow As Long
Dim c As Range, wS As Worksheet
Set wS = Worksheets("Sheet2")
Application.ScreenUpdating = False
With Worksheets("Sheet1")
lastRow = wS.Cells(Rows.Count, "A").End(xlUp).Row
lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column
If lastRow > 3 Then
Range(wS.Cells(4, "A"), wS.Cells(lastRow, lastCol)).Clear
End If
myRow = 3
For j = 4 To 8 Step 2 '//←D・F・H列//
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
If Format(.Cells(i, j), "yyyy/m/d") = Format(wS.Range("B1"), "yyyy/m/d") Then
Set c = wS.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
myRow = myRow + 1
.Cells(i, "A").Resize(, lastCol).Copy wS.Cells(myRow, "A")
End If
End If
Next i
Next j
If wS.Cells(Rows.Count, "A").End(xlUp).Row < 4 Then
MsgBox "該当日なし"
End If
wS.Range("A3").CurrentRegion.Sort key1:=wS.Range("A3"), order1:=xlAscending, Header:=xlYes
End With
Application.ScreenUpdating = True
End Sub '//この行まで//

次に、画面左下のシート見出し上の「Sheet2」のところで右クリック → コードの表示 → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト

Private Sub Worksheet_Change(ByVal Target As Range) '//この行から//
Dim c As Range, wS As Worksheet
Set wS = Worksheets("Sheet1")
With Target
If .Count = 1 Then
If .Address = "$B$1" Then
If IsDate(.Value) And .Value <> "" Then
Call Sample1
End If
ElseIf .Row > 3 Then
Set c = wS.Range("A:A").Find(what:=Cells(.Row, "A"), LookIn:=xlValues, lookat:=xlWhole)
.Copy wS.Cells(c.Row, .Column)
End If
End If
End With
End Sub '//この行まで//

最後にVBE画面を閉じて
Sheet2のB1セルの日付や表示されているデータ変更をしてみてください。m(_ _)m
    • good
    • 0

別のシートに該当するものを全て抽出するとなると、条件設定が面倒で、さらにそちらに入力したデータを元の表に反映させるとなると、VBAに頼らざるを得ません。


(関数によってデータを参照しているだけなので、そこにデータを上書きしても、参照に使っていた式が上書きされるだけです)

そのような事をせずとも、フィルタで条件指定すればよいのでは?
元の表を変更できないのであれば、
表のデータを全て=で別のシートに表示させ、そちらでフィルタを使いましょう。
ただし、別のシートにした場合は元の表に変更を反映できませんので、
それに関してはVBAの回答してくれる人を待ってください。

条件がいまいち分からないのですが、セルに入力した日付を含む行のみを表示させるとすれば、
仮にK1に日付を入力するとして、
K2=IF(COUNTIF(B2:J2,K$1)=0,"","○")
これをデータの数だけコピーしてください。
これでその行のB~J列にK1と一致するデータがなかった場合には空白、あった場合には"○"を表示します。
K列が○のもののみ表示するようにフィルタをかければ、K1の日付を含む行の一覧が完成です。
抽出条件が思っているものと違っている場合は、K2の式を修正してくださいね。
    • good
    • 0

状況が把握しづらいんだけどちょっと書いてみます



別のシートであっても”=シートなんとかI4”
で参照することが可能なので
上のシートと下のシートで1:1の関係で済むなら
上のシートのI6をクリックして”=”を入力してから下のシートのI4をクリック
しかしこれだと1セルずつやらないとダメなので
上下で1:1にするとあとはコピペというか、セルの右下にカーソルを合わせて
ひっぱったら全部埋まりますよね。

1:1ではないんですよ、という話なら
もう1枚シートを作って、そこで
例えば直近の日付を選択して返す関数であるとか
そんな処理をしてI6に返すのがいいんでしょうね
    • good
    • 0

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