質問: ### スプレッドシート(excel)の関数についてです。 スプレッドシートでタスク管理表を作っています。 その際にプルダウンメニューで「Doing」「Done」の枠を設けました。 Doingにしたら隣の列にその時刻が開始時刻として表示され、 Doneにしたらその時刻が終了時刻として開始時刻の隣に表示されるようにしたいです。 IF関数を使って試してみて、 Doingにしたらその時刻が表示される Doneにしたらその時刻が表示される ようにはできました。 しかし、IF関数を使ってるため どちらかを表示したらどちらかがFALSEになってしまいます。 これを両方表示させたままにしておきたいです。 やり方があるならなんでも教えて欲しいです。 一応自分の仮説では、 式が入力された瞬間に値に変更される関数などがあれば解決するな、と思っていますが正しいでしょうか? 回答よろしくお願い致します。
回答: A列に入力時刻、B列にDoing/Done、C列に開始時刻、D列に終了時刻を記載するものとします。 この時、B列の状態によって表示内容を変化させたいのはC列とD列ですので、式はC列とD列のセルに記述することになります。 判断条件は、こう考えるとわかりやすいかもしれません。 ``` C列はB列が"Doing"の時にA列の値を表示したい。 また"Done"になっても消したくない(表示したい)。 D列はB列が"Done"の時にA列の値を表示したい。 ``` これを式にすると、例えば2行目なら ``` C2セル =if(B2="Doing",A2,If(B2="Done",A2,"")) D2セル =if(B2="Done",A2,"") ``` のようになります。 C2セルの式はもう少しスマートに、 `=if(OR(B2="Doing",B2="Done"),A2,"")` と記述しても同じ結果が得られます。 お試しください。 追記 参考までにVBAで処理する場合のサンプルです。 対象シートのシートモジュールとして以下のような処理を記述すれば、B列の変更時にA列の値をC/D列に写すことができます。 ``` 'シート内に変更があった場合のイベント Private Sub Worksheet_Change(ByVal Target As Range) Dim lRow As Long 'B列を変更した場合 If Target.Column = 2 Then '対象行取得 lRow = Target.Row '変更後のB列の値 Select Case Target.Value Case "Doing" 'A列の値をC列に設定 Cells(lRow, 3).Value = Cells(lRow, 1) Case "Done" 'A列の値をD列に設定 Cells(lRow, 4).Value = Cells(lRow, 1) End Select End If End Sub ``` 今回はVBAでの質問ではありませんでしたし、環境によってはマクロは私用したくない場合もあるかと思いますが、興味があればお試しください。 ※ExcelではなくGoogleSpreadSheetなのでVBAは使用できませんでした。すみません。m(_ _)m