- ベストアンサー
セルの文字色の変更
- EXCEL2010で作成している入退院台帳のC列に退院年月日を入力すると自動でフォントの色が変わる方法はあるか
- C列のフォント色を手動で変えなければならない問題を解決する方法を教えてください
- C列に=today()関数を入れない方法で退院年月日を入力しても入院日数が動き続ける不具合が発生しています
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
回答No.3です。 >ただ、年齢のところで計算式を貼り付け、[誕生日が入力されているセル]をセル番号に変えてたのですが、エラーが出てしまいました。 >引数が足りないとか多いとかです。 申し訳御座いません。 =IF([誕生日が入力されているセル]="","",IFERROR(DATEDIF([誕生日が入力されているセル],TODAY(),"Y"),"(入力値無効)")) とすべきところを「)」が1つ抜けておりました。 >また、この場合、退院した時点で年齢は止まりますでしょうか? いいえ、患者の「現在の年齢」を表示させる事が目的だと思って考えた関数ですので、止まりません。 退院した時点で年齢のカウントを止めるのでしたら、次の様な形式の関数として下さい。 =IF([誕生日が入力されているセル]="","",IFERROR(DATEDIF([誕生日が入力されているセル],IF(OR(SUM([C列のセル])<1,[C列のセル]>"9999/12/31"+0),TODAY(),[C列のセル]),"Y"),"(入力値無効)")) >お願いなのですが、 >>「DATEDIF関数の『後ろの方の日付』の所で参照する値を、『C列に日付が入力されている場合』にはその日付を、『C列に日付以外の値が入力されている場合や、何も入力されていない場合』には、TODAY関数の結果を、それぞれ参照する様にする」という関数にしてしまった方が良いと思います。 >の部分の考え方は良くわかりましたが計算式のどの部分にあたるのか、教えていただけませんでしょうか? 「DATEDIF関数の『後ろの方の日付』の所で参照する値」とは、 DATEDIF(B174,C174,"D") の中で「C174」と記述されている箇所の事です。 一方、「『C列に日付が入力されている場合』にはその日付を、『C列に日付以外の値が入力されている場合や、何も入力されていない場合』には、TODAY関数の結果を、それぞれ参照する様にする」というのは、前述の「C174」と記述されている箇所を、次の様な形式のIF関数に差し替えるという事です。 IF([C列に日付が入力されている場合にTRUEを返す判定式],[C列のセル],TODAY()) 或いは IF([C列に日付が入力されていない場合にTRUEを返す判定式],TODAY(),[C列のセル]) 回答No.3で提示させて頂いた関数 =IF($B174="","",IFERROR(DATEDIF($B174,IF(OR(SUM($C174)<1,$C174>"9999/12/31"+0),TODAY(),$C174),"D")+1,"(入力値無効)")) の中で上記の「『C列に日付が入力されている場合』にはその日付を、『C列に日付以外の値が入力されている場合や、何も入力されていない場合』には、TODAY関数の結果を、それぞれ参照する様にする」に該当するのは IF(OR(SUM($C174)<1,$C174>"9999/12/31"+0),TODAY(),$C174) という箇所です。 このIF関数の判定式は OR(SUM($C174)<1,$C174>"9999/12/31"+0) というものになっております。 C174セルに何も入力されていない場合や、「入院中」などの様な何らかの文字列データが入力されている場合には、SUM($C174)の部分の計算結果は0になりますから、 SUM($C174)<1 の判定結果はTRUE(「条件に合う」という結果)になりますので、OR( )の部分の判定結果もTRUEとなるため、IF関数の[真の場合]の所に記述されている TODAY() の結果が返されます。 又、Excelでは日付を扱う際にはシリアル値という概念が用いられており、通常では整数値の1を日付の1900年1月1日として扱い、1900年1月2日は数値の2、1900年1月3日は数値の3・・・という具合に日付や時刻のデータを1899年12月31日の午前0時から経過した日数に対応させた数値を使って処理しております。(例えば2016年5月1日の午前6時のシリアル値は42491.25になります) マイナスの数値や西暦9999年よりも後の日付はExcelでは日付として扱う事が出来ません。 そこでその様な日付として扱う事が出来ない様な数値がC174セルに入力された場合には、 SUM($C174)<1 か $C174>"9999/12/31"+0 のどちらかの判定結果がTRUEとなりますから、その様な場合にはOR( )の部分の判定結果もTRUEとなるため、IF関数の[真の場合]の所に記述されている TODAY() の結果が返されます。 一方、C174セルに日付が入力されている場合とは、C174セルに1以上で「西暦9999年12月31日に該当するシリアル値」以下の数値が入力されている場合なのですから、 OR(SUM($C174)<1,$C174>"9999/12/31"+0) の判定結果はFALSE(「条件に合わない」という結果)になりますので、IF関数の[偽の場合]の所に記述されている $C174 の結果が返されます。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
#2です。 入院日数は、today()から入院日付(人が入力する)を引けば自動的に出るように思ったのでしょうが、退院して退院日が決まった段階(その日の当日に限る)で、VBAでも使わないと、自動的に日付を固定するのがむつかしい。 ーー 参考 PC21 / セルの計算式を消して結果の値だけを残す https://www.google.co.jp/#q=%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB+%E9%96%A2%E6%95%B0%E5%BC%8F%E3%82%92%E6%B6%88%E3%81%99 ーー したがって (1)入院日ーー>入院日に入力(B列とする) (2)入院中は、「述べ入院中日数」ということで、=TODAY()=入院日のセル -->=TODAY()ーB1 書式を数値に設定 入院日数は、退院日―入院日の日数の引き算に+1が正しいかも業界の慣習や常識で対処)。 (3)退院したときに、退院日を、退院日列に入力する。これは避けられないと思う そして ーー>C列に入力 (4)(2)の式を =IF(D1="",TODAY()-B1,D1-B1) のように(始めから)しておく 例 A1:B4 氏名 入院日 入院日数 退院日 田中 2016/4/1 33 2016/5/4 入院日の入力が遅れると、その間中は、間違った入院に数を表示してしまう。 入力したら正しい入院に数になるが、間違った期間中の弊害はないのかどうか、職場や個のデータの使い方によるだろう。 ーー 退院した人の行の一部か全部の列を、色図けするなら、退院日が空白でなければ、その行に色を付ければよい。 これは典型的な「エクセル 条件付き書式」の機能でできる(設定操作はご存じだろうから略)。
- kagakusuki
- ベストアンサー率51% (2610/5101)
入院中の患者、即ち「まだ退院してもいない患者」の退院年月日欄に=today()関数で、今日の日付を入れているのでは、その患者は入院中であるのにもかかわらず今日退院した事になってしまいますので、それはおかしな話です。 ですから、「C列に=today()関数が入っている場合には文字色を使って今日の日付が見えない様にする」のではなく、文字色は変えずに「DATEDIF関数の『後ろの方の日付』の所で参照する値を、『C列に日付が入力されている場合』にはその日付を、『C列に日付以外の値が入力されている場合や、何も入力されていない場合』には、TODAY関数の結果を、それぞれ参照する様にする」という関数にしてしまった方が良いと思います。 ですから、D174セルに入力する関数を次の様にされると良いと思います。 =IF($B174="","",IFERROR(DATEDIF($B174,IF(OR(SUM($C174)<1,$C174>"9999/12/31"+0),TODAY(),$C174),"D")+1,"(入力値無効)")) 因みに、上記の関数では、C列に入力されている日付よりもD列に入力されている日付の方が古い日付となっている場合や、D列に日付が入力されていない状態でC列に未来の日付(TODAY関数の結果よりも後の日付)が入力されている場合には、「(入力値無効)」と表示される様になっております。 それと、 >(ちなみにC列を参照してG列で年齢も計算しています) の件に関しましても、その場合参照する値として必要になるのはC列の「退院日」などではなく、「現在の日付」なのであり、現行ではC列のどのセルを参照した場合でも「=today()関数の結果」という全く同一の値を参照しているのですから、態々、C列の値を参照する必要は無く、単純にそのG列の関数において参照先としてC列のセルのセル番号が記述されている箇所を、TODAY()に置き換えてしまった方が良いと思います。 =IF([誕生日が入力されているセル]="","",IFERROR(DATEDIF([誕生日が入力されているセル],TODAY(),"Y","(入力値無効)"))
お礼
kagakusukiさん、ご回答ありがとうございます。 計算式や図まで入れて頂き、とても分かりやすい説明に感謝いたします。 入院日数に関してはkagakusukiさんのおっしゃる通り、計算式をそのまま拝借してセル番号を変えたらうまくいきました。 ありがとうございます。 ただ、年齢のところで計算式を貼り付け、[誕生日が入力されているセル]をセル番号に変えてたのですが、エラーが出てしまいました。 引数が足りないとか多いとかです。 また、この場合、退院した時点で年齢は止まりますでしょうか? 再度の質問で恐縮ですが、よろしくお願いします。 それと、とても厚かましいお願いなのですが、 >「DATEDIF関数の『後ろの方の日付』の所で参照する値を、『C列に日付が入力されている場合』にはその日付を、『C列に日付以外の値が入力されている場合や、何も入力されていない場合』には、TODAY関数の結果を、それぞれ参照する様にする」という関数にしてしまった方が良いと思います。 の部分の考え方は良くわかりましたが計算式のどの部分にあたるのか、教えていただけませんでしょうか?
- imogasi
- ベストアンサー率27% (4737/17069)
質問に答える前に、 >C列には =totay() という関数が入っていて入院日数を計算しています。 の箇所がおかしいように思いますが。 TODAY()関数は、明日になれば、明日の日付が入る(に変わる)関数のはずで、この値を使って計算しておくと、明日になると、自動的に1日増えてしまいませんか? 私の質問の読みの勘違いだったらすみません。 退院した日で、入院日数は固まるはず。翌日には+1されるようではおかしいのでは。 TODAY()関数を使う必要なケースも、もちろんありますが。 参考までに、今日現在で入院が何日になるかを表示しているのですか?。 ーー それとある患者1人のデータは1行にまとまっているのですか。これは肝心な点です。 それなら、本当の退院日がどこかに入るなら、その行のその実際退院日の列が入力されたら (空白セルでないなら)、考えている列の1セルのフォント色を黒色やその他色に設定すれば仕舞い。条件付き書式の機能でできそうに思う。 ーー しかしセルの数式として、TODAY()関数が入っているかどうかは、(条件付き書式の「式が」で)エクセルの関数で判定出来る関数は無い。エクセル関数は、セルの「値!」しか有無・比較・判定や加工ができない。書式や数式(本件はこれ?)やコメントなどは対象外。だから条件付き書式は使えないと思う。VBAなら書式判定できるが、その後変化したときに、自動的に、常時自動変更反応がむつかしいと思う。 この点(エクセル関数は書式を相手にしない)の認識があいまいなままの、エクセル関数遣いの人が多いように思う。 ーー また質問例に=IF(B174=0,"",DATEDIF(B174,C174,"D")+1) などと第174行の例を挙げているが、その必要ないでしょう。1-10行目などの例にすべきだ。 ーー 普通は ・」退院日付を入れる列と ・現在までの在院日数(TODAY()関数を使う)は 別列とするとおもう。 これが解決策ではないか。 そうすべきと思う。そうすれば退院日の空白かどうかを、条件付き書式の条件にできると思う。
補足
imogasiさん、ご回答いただきありがとうございます。 説明が下手で申し訳ありません。 入院日はB列、退院日はC列、入院日数はD列になります。 そこで、退院した日付をC列のtoday関数の入っているところに入力すると、today関数が消えて日付が入るので、退院した時点で入院日数のカウントはとまり、退院までの入院日数がでます。 また、入院日数の数字を表示するのはD列になるので、 D列に =IF(B174=0,"",DATEDIF(B174,C174,"D")+1) という関数を入れて計算しています。 ちなみに、174行の例を挙げたのは、表の最後に入力されている部分を使ったため、このような例になってしまいました。 説明がわかりずらくて申し訳ありません。 現在入院している人と退院した人の両方の日数を計算しています。 現在入院中の人は現在の日数。退院した人は退院した時点での入院日数が表示されるようにしています。 また、患者1人のデータは1行にまとまっています。
条件付き書式を使えば良いのでは? 解説 http://www.becoolusers.com/excel/conditional-formatting.html これを使ってC列が空欄かそうでないかでフォントの色を変えるわけです。
お礼
randensai2さん、さっそくの回答ありがとうございます。 条件付き書式はあまり使ったことがないので詳しいことはわかりませんが、C列にはすでにtoday関数が入っているので、条件付き書式だと空欄にならなずに文字が見えてしまうんです。 回答、ありがとうございました。
お礼
kagakusukiさん、ご丁寧な返答本当にありがとうございます。 厚かましいお願いにも関わらず、丁寧な返答をいただき、感謝いたします。 とても分かりやすく勉強になりました。 年齢の計算式もそのまま貼り付けて使用することが出来ました。 お陰様ですべて解決することが出来ました。 >申し訳ありません とんでもないです。 こちらこそ厚かましいお願いをしたりして、大変に申し訳ありませんでした。 本当にありがとうございました。