• 締切済み

Excelの関数で困っています。

以前にも質問させて頂いたのですが 今30日=一ヶ月として、日付の計算をしています。 例(12月1日+30=1月1日、2月1日+40=3月11日となるようにしたいのです。) 条件としてセルは三つまでしか使えません。 A1 起算日 B1 間の日数 C1 たされた結果の日付 今この関数を使って計算をしています。 A1+MATCH(B1,INDEX(DAYS360($A$1,$A$1+ROW(INDIRECT("A1:A"&B1+6))),,),1) この関数をもっと簡単にして欲しいと言われたのですが…。 色々調べてみたのですが、まったく分からなかったので また質問させて頂きました。 かなり困ってますのでよろしくお願い致します。

みんなの回答

noname#79209
noname#79209
回答No.16

#15です。 上司の方が間違っているのか、質問者さんが間違っているのか、非常に観念的に(論理的でない=規則性があやふや)なのか解りませんが、 1/1+30日が2/1 というコメントを見たので修正。 =EOMONTH(A1,INT(B1/30)-1)+MOD(B1,30)+(B1<=30) でしょう。 つまり、30日の時だけ特殊なんですね(観念的)。 ひょっとすると30の倍数の時もあやふやかも... これで「もっと簡単に」というなら、 「その要求は、言葉では簡単かも知れないが、裏に複雑なものが隠されているから」 としか言えません。 「簡単にしろ」の理由をはっきり言わないのは、#15の最後に書いたことの証拠かも...

全文を見る
すると、全ての回答が全文表示されます。
noname#79209
noname#79209
回答No.15

これじゃダメかな。 =EOMONTH(A1,INT(B1/30)-1)+MOD(B1,30) これだと、 1/1の59日後は、閏年なら2/29、そうでなければ3/1 1/1の60日後は、閏年なら2/29、そうでなければ2/28 になりますが... > もっと簡単に出来ないのかと言われてしまって 単に面倒くさいのか、式が長いと自分でうまく入れられないからだけだと思いますが...

全文を見る
すると、全ての回答が全文表示されます。
noname#52504
noname#52504
回答No.14

私自身、上の無茶な要求に往生することもしばしばですし、 質問者さんに対しては同情するんですが、実際問題として、  >> 複雑で例外の多い規則を簡潔に記述することはできない << のです。当たり前っちゃ当たり前ですが。 この課題の難点は、 「どのように計算するか」ではなく 「どのような結果を得たいか」がはっきりしていない点です。 例えば、(#7さんの数式に較べて"簡単"かどうかは別にして)  =DATE(YEAR(A1),MONTH(A1)+INT((DAY(A1)+B1)/30),MOD(MIN(DAY(A1),30)+B1,30)) とすれば、次のように結果が返ります。 01/01 [+] 30 [=] 02/01 01/31 [+] 30 [=] 02/28 02/01 [+] 30 [=] 03/01 02/01 [+] 40 [=] 03/11 02/17 [+] 45 [=] 04/02 02/28 [+] 30 [=] 03/28 02/28 [+] 60 [=] 04/28 04/30 [+] 30 [=] 05/31 10/31 [+] 30 [=] 11/30 12/01 [+] 30 [=] 01/01 あるいは、 (以前のご質問では月末に対して加算するケースもあるようですが) 今回のご質問に関して、 >月末の日からの計算はしません。 >月初(1日)に30を足して一ヵ月後になるようにしたいのです。 というのが事実であれば  単に  =DATE(YEAR(A1),MONTH(A1)+INT(B1/30),MOD(B1,30)+1) とすれば、 01/01 [+] 60 [=] 03/01 02/01 [+] 30 [=] 03/01 02/01 [+] 40 [=] 03/11 12/01 [+] 30 [=] 01/01 という結果が得られます。 これらの結果は、 >12月1日+30=1月1日 >2月1日+40=3月11日 >2月1日+30=3月1日 >1月1日+30日=2月1日 という要求については充たしますが、 #7さんの数式とは挙動が違いますし(要件がそもそも前回と違う) 【上司さんの脳内ルール】に合致するかどうかは神のみぞ知る、といったところですね。

全文を見る
すると、全ての回答が全文表示されます。
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.13

年の計算=YEAR(A1) 月の計算=MONTH(A1)+INT((MIN(DAY(A1),30)+B1)/30) 日の計算=MOD(MIN(DAY(A1),30)+MOD(B1,30),30) で計算できるので C1=DATE(YEAR(A1),MONTH(A1)+INT((MIN(DAY(A1),30)+B1)/30),MOD(MIN(DAY(A1),30)+MOD(B1,30),30)) ※ただし結果がうるう年でない2月29日の場合のみ3月1日になります。

全文を見る
すると、全ての回答が全文表示されます。
  • higekuman
  • ベストアンサー率19% (195/979)
回答No.12

#1、#4、#8、#9、#10です。 > 1月1日に59を足した場合は、うるう年ならば、2月29日になります。 > 違うならば3月1日になります #6さんの式だと、 1月1日に58を足した場合は、うるう年ならば2月29日、違うならば3月1日になりますが、 1月1日に59を足した場合は、うるう年ならば3月1日、違うならば3月2日になりますね。 これ以上は、私には、IF文を使った式しか思い浮かびません。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.11

#7の回答者です。みなさんのために、補足しておきます。 DAYS360 の逆関数だと私は解釈しました。だから、DAYS360を応用するのがもっとも楽だと思ったのです。つまり、出された結果が、DAYS360関数で、取れれば成功しているといえるのではないでしょうか? 顕著な例としては、以下のような場合があります。 A1:2007/2/1 B1:30 なら、2007/3/1 しかし、  B1:29 なら、1ヶ月に満たないのですから、 それより、増えたら、矛盾してしまいます。そのために、単に、数式では、Mod関数を使うのはやめました。 C1:(数式の結果) これを、検証するために、 =DAYS360(A1,C1) このような数式をおきました。 ご質問者さんがお決めになることですが、 1月1日に59日を足すなら、2ヶ月に1日足りないわけですから、2007/1/1 なら、2007/2/28 では?2008/1/1なら、2008/2/29 となればよいのではありませんか? 同じ内容の、ユーザー定義関数を書いておきます。 数式の使い方。 =DaysAdd30(A1,B1) '------------------------------------------------------ '標準モジュールに登録のこと '------------------------------------------------------ Public Function DaysAdd30(rng As Range, AdDate As Integer) As Long   Dim orgDate As Date   Dim endDay As Date   Dim i As Integer   Dim j As Integer   Dim v As Date   If rng.Value2 > 0 Then     orgDate = CDate(rng.Value2)     i = Int(AdDate / 30)     j = AdDate Mod 30          endDay = DateSerial(Year(orgDate), Month(orgDate) + i + 1, 0)          If Day(orgDate) + j > Day(endDay) Then       v = endDay     Else       v = DateSerial(Year(orgDate), Month(orgDate) + i, Day(orgDate) + j)     End If       DaysAdd30 = v   End If End Function

全文を見る
すると、全ての回答が全文表示されます。
  • higekuman
  • ベストアンサー率19% (195/979)
回答No.10

#1、#4、#8、#9です。 特殊な例になりますが、1月1日に59日を足した場合は、どんな結果になれば良いのでしょうか?

thugs13
質問者

補足

1月1日に59を足した場合は、うるう年ならば、2月29日になります。 違うならば3月1日になります

全文を見る
すると、全ての回答が全文表示されます。
  • higekuman
  • ベストアンサー率19% (195/979)
回答No.9

#1、#4、#9です。 29日を足すことは無くても、40日や45日を足すことはあるんですね。 条件の理解に苦しみます。 まだ隠されている条件があったりしませんか? それはともかく、30の倍数以外でも足すことがあるのであれば、#6さんの回答が最適だと思います。

thugs13
質問者

補足

すいません。もうないです。 一番下の値は30です。それを下回ることはないです。 分かりにくくてすいません。

全文を見る
すると、全ての回答が全文表示されます。
  • higekuman
  • ベストアンサー率19% (195/979)
回答No.8

#1、#4です。 ほとんど#6さんの回答と同じです。 ・A1は必ず月初 ・B1は必ず30の倍数 と言う条件であれば、 =DATE(YEAR(A1),MONTH(A1)+B1/30,1) と簡単にすることもできます。 質問で、 > 例(12月1日+30=1月1日、2月1日+40=3月11日となるようにしたいのです。) というように、40を足していますが、40を足すことは無いのでしょうか? 必ず30の倍数を足すのであれば、日数を足すのではなく、月数を足すようにしたほうが解りやすいと思うのですが・・・

thugs13
質問者

補足

分かりにくくてすいません。 40を足す事もあるみたいです。 今この注文をしている上司に詳しく条件をちゃんと 明確にしてもらいました。 一ヶ月を=30日で考えるので、40=一ヶ月+十日となります。 45=一ヶ月+15日になります。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

私が書いたものです。 >この関数をもっと簡単にして欲しいと言われたのですが…。 どういうご事情なのですか?ご質問の趣旨に驚いてしまいます。 簡単にと言われても、ひとつのロジックを持ったものが、数式として、その過程を端折るようなことは、無理ではないかと思います。 後は、ユーザー定義関数として、ひとつの関数を作り上げることになると思います。 ユーザー定義関数を作るというのなら、お話は承りますが、それ以外は、私は、もう思いつきません。あれダメ、これダメと、結局、手詰まりになってしまうと思います。 私のようなものが、あれこれ述べても、現実は、関数の天才的な人は一杯いらっしゃるかとは思いますから、私などが口を挟むべき余地はないかもしれません。 次の発言の方のために、今までの経緯を残しておきます。 http://oshiete1.goo.ne.jp/qa3496893.html http://oshiete1.goo.ne.jp/qa3491040.html

thugs13
質問者

補足

事情は良く分かりませんが、仕事でもっと簡単に出来ないのかと言われてしまって。理由などを聞いたりしたのですが、とりあえずやってみてとしか言われないので、自分自身も何で出来てるのに簡単にする必要があるのだろうか?となっている状況なのです。 すいません

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 前にも質問させて頂いたのですが…。大変困っています。

    前に質問をして、解決したので一回締め切らせて頂いたんですが、 まだ解決していなかったので、もう一度質問させて頂きます。 30日=一ヶ月として、日付の計算をしたいんですがうまくいかなくて…。 例(12月1日+30=1月1日、2月1日+40=3月11日となるようにしたいのです。) 条件としてセルは三つまでしか使えません。 A1 起算日 B1 間の日数 C1 たされた結果の日付 =A1+MATCH(B1,INDEX(DAYS360($A$1,$A$1+ROW(INDIRECT("A1:A"&B1))),,),1) という数式を以前教えて頂いて、解決したと思ったんですが 間の日数を60で計算すると、日付がずれてしまいます。 30=一ヶ月なので、60=二ヶ月、90=三ヶ月、というように 加算されるように計算したいのですが、全然分からなくて悩んでいます。 ヒントだけでも、教えて頂けないでしょうか? 同じ質問ですいませんが、よろしくお願い致します。

  • エクセル関数について

    A列とB列に氏名を入れてA列にあってB列にないものを取り出す為に=IFERROR(INDEX($A$2:$A$8,SMALL(IF(ISNA(MATCH($A$2:$A$8,$B$2:$B$8,0)),ROW($A$2:$A$8)-1),ROW()-1),1),"")の関数をⅮ列に入れ下にオオートフィルしたのですが、思うように表示されません。  関数が間違っているのか判りません。 何か良い方法はあれば教えてください。

  • match関数とindex関数について

    B列に空白を含む連続した数値の配列において、空欄と空欄の間の数値の個数を数える式として、以下の式を見たことがあります。 =IF(AND(B9<>"",B10=""),IF(ROW(B9)=COUNT($B$1:B9),ROW(B9),ROW(B9)-MATCH(1,INDEX(0/($B$1:B9=""),0))),"") 確かにこの式で求める答えが出るのですが、式の最後の「MATCH(1,INDEX(0/($B$1:B9=""),0)」の意味がよく分かりません。 ・MATCH関数の範囲としているINDEXの内容はどういう意味なのか ・MATCH関数の検査値としている「1」はどういう意味なのか ご教授願います。

  • EXCELでの日付計算(一番簡単な方法)

    こんにちは。 EXCELでの一番簡単な日付の計算を教えてください。 知りたいのは例えば起算日から6ヵ月後の日付です。 例えば起算日が6月1日なら6ヶ月後が12月1日となるように したいのですが・・・ 自分で作った式は B2に起算日、B3に6ヶ月後の日付を表示させるとして =YEAR(B2)&"/"&MONTH(B2)+6&"/"&DAY(B2) (2007/12/1)と表示 これよりもっと簡単な方法がありますか? 教えてください。

  • エクセル関数 SUMPRODUCTについて

    エクセル関数でSUMPRODUCTについて質問させていただきます。 ↓A1 コーラ  A ポカリ  A 珈琲   A 石鹸   B 洗剤   B ポカリ  A 食パン  C 菓子パ  C 洗剤  B   3←C11(Aの数を数えています。) と、入力されているデータにおいては、 =SUMPRODUCT((MATCH($A$1:$A$9&$B$1:$B$9,$A$1:$A$9&$B$1:$B$9,0)=ROW($A$1:$A$9))*($B$1:$B$9="A")) の関数で求めるデータが出ることはわかりました。 (Aの数は4個ですが、ポカリがダブっているので3個として数えるように設定したいのです。同じ様にBの数は洗剤が2つあるので2個として計算します。) しかし、A1~C11のデータをすべて切り取りして 例えばA11からC21に貼り付けた場合はC21の計算結果が”0”になってしまいます。 その際のC21の関数は =SUMPRODUCT((MATCH($A$11:$A$19&$B$11:$B$19,$A$11:$A$19&$B$11:$B$19,0)=ROW($A$11:$A$19))*($B$11:$B$19="A")) になっています。 この場合だと具体的にどのように関数を変化させればいいのでしょうか? ご指導いただければありがたいです。よろしくお願いします。<m(__)m>

  • 【できれば至急で】エクセル関数の式で教えてください

    画像では、1つのシートに(シート1)(シート2)と記載していますが、実際は、別々のシートになります。 シート1に画像上記のような集計表があり、日々更新をしているのですが、その時に自動的にシート2にある内容が入力されるような関数が入っています。ただ、2010年は問題なく反映されていたのですが、2011年になり入金日を「例:2011/1/4」と入力をすると、シート2の日付部分には「1/0」と表示され、「シート1」の入金日が過去未入力のものが反映されてしまいます。シート1の入金日に「例:2011/1/4」と入力したら、自動でシート2の表が完成するような式を入れるにはどのようにしたら良いのでしょうか?実際に、2010年12月末まで問題なく使われていた関数を下へ書き出します。ちなみに、シート1の入金日は、2010年、2011年が区別されて入力しています。 (シート1) H2には、 =IF(AND(F2<>"",MONTH(G2)=シート2!$A$1),G2+ROW()/1000,"") (シート2) B3セルには、 =IF($B$1="","",IF(ISERROR(INDEX(Sheet1!G:G,MATCH(SMALL(Sheet1!H:H,ROW(B1)),Sheet1!H:H,0))),"",INDEX(Sheet1!G:G,MATCH(SMALL(Sheet1!H:H,ROW(B1)),Sheet1!H:H,0)))) C3セルには、 =IF($B3="","",INDEX(Sheet1!D:D,MATCH(SMALL(Sheet1!$H:$H,ROW(B1)),Sheet1!$H:$H,0))) D3セルには、 =IF($B3="","",INDEX(Sheet1!F:F,MATCH(SMALL(Sheet1!$H:$H,ROW(G1)),Sheet1!$H:$H,0))) の数式が入っています。 12/1~12/31まではシート2の表が反映されていたのですが、シート2のB1に「1月」を入力したところ、画像のように、シート1で入金日が空白(未入金状態)の場合も、シート2に反映されてしまいました。

  • エクセル参照リンクについて

    先日質問しました内容ですが、「KURUMITO」さんよりすばらしい解答をいただきましてありがとう ございます。 (投稿日時 - 2013-06-21 13:45:07) あと一つご指導ください。 Sheet2にはA20行から次の1週間分があります。 この場合、下のどの部分を変更してB21に張り付ければいいのかよくわからず困っています。 ご指導ください 「KURUMITO」様の前回のご指導内容 例えばシート2のA1セルには楢崎、岡などの文字が、B1セルから右横に日付が、A2セルから下方には9:00-10:30などがA19までの範囲に入力されているとしてB2セルには次の式を入力して右横方向にドラッグコピーしたのちに下方の行番号の19までドラッグコピーします。 =IF(COUNTIF(INDEX(Sheet1!$A:$BS,MATCH(INDEX($A:$A,ROUNDUP(ROW(A1)/3,0)*3-1),Sheet1!$A:$A,0)+MOD(ROW(A1)-1,3),MATCH(B$1,Sheet1!$A$2:$BS$2,0)):INDEX(Sheet1!$A:$BS,MATCH(INDEX($A:$A,ROUNDUP(ROW(A1)/3,0)*3-1),Sheet1!$A:$A,0)+MOD(ROW(A1)-1,3),MATCH(B$1,Sheet1!$A$2:$BS$2,0)+9),$A$1)=0,"",INDEX(Sheet1!$B$4:$M$4,MATCH($A$1,INDEX(Sheet1!$A:$BS,MATCH(INDEX($A:$A,ROUNDUP(ROW(A1)/3,0)*3-1),Sheet1!$A:$A,0)+MOD(ROW(A1)-1,3),MATCH(B$1,Sheet1!$A$2:$BS$2,0)):INDEX(Sheet1!$A:$BS,MATCH(INDEX($A:$A,ROUNDUP(ROW(A1)/3,0)*3-1),Sheet1!$A:$A,0)+MOD(ROW(A1)-1,3),MATCH(B$1,Sheet1!$A$2:$BS$2,0)+9),0)))

  • エクセル2000 の関数について

    お世話になります。 NETWORKDAYS関数を使って、土日・祝日を除く日数をカウントするのは、過去の質問から分かったのですが、 その他の条件として、土曜出勤の日が含まれている場合には、 プラスして計算したい場合は、どうすればよろしいでしょうか? エクセル2000のバージョンを使っています。 A列に開始日  B列に終了日  C列に日数 ※E列の日付が含まれていたら除く ※F列の日付が含まれていたら1日プラスする。  A列      B列      C列     E列      F列 1 開始日    終了日    日数    祝日      土曜出勤日 2 2006/08/01  2006/08/11  **     2006/07/17   2006/07/22 3 2006/08/11  2006/08/18  **     2006/08/14   2006/08/19 4 2006/08/14  2006/08/25  **     2006/08/15 5 2006/08/17  2006/08/25  **     2006/09/18 よろしくお願いします。

  • ExcelセルにVBAでINDEX関数を入力

    ExcelでINDEX関数とMATCH関数で"B11:E13"セルに以下の数式データがあります。 数式は "B11"=IF(ISERROR(INDEX($A$1:$A$9,MATCH(1,B$15:B$23,0))),"",INDEX($A$1:$A$9,MATCH(1,B$15:B$23,0))) "B12"=IF(ISERROR(INDEX($A$1:$A$9,MATCH(2,B$15:B$23,0))),"",INDEX($A$1:$A$9,MATCH(2,B$15:B$23,0))) "B13"=IF(ISERROR(INDEX($A$1:$A$9,MATCH(3,B$15:B$23,0))),"",INDEX($A$1:$A$9,MATCH(3,B$15:B$23,0))) "C11"==IF(ISERROR(INDEX($A$1:$A$9,MATCH(1,C$15:C$23,0))),"",INDEX($A$1:$A$9,MATCH(1,C$15:C$23,0))) "B15~B23"に数値1~3を入力した場合イニシャルA~I が入力される式ですが、列を連続で入力できるような処理をVBAのWorksheetFunctionで行うにはどのようにコードを記述すればよいのでしょうか。 ご回答のほどよろしくお願いします。

  • Excelの関数で悩んでいます。

    Excel の関数で悩んでいます。 預かっている物があるとして、年間の管理簿において預かり日から経過日数は計算できています。 預かり日から経過日数が35日以内の預かり期間が月において何日あるか。また35日を超える預かり期間が月において何日あるかを計算したいです。 例えば9月分を集計する場合、A列は預かり日、B列はこれまでの経過日数、C列に9月の内35日以内の預かり期間が何日あるか、D列に9月の内35日を超える預かり日数が何日あるか表示したく、 A列  B列 C列 D列 6/2  121 0  30 8/3  59  6  24 9/1  30  30  0   上記となるようなC列、D列の関数がわかりません。良い方法をご存じの方、よろしくお願いいたします。

このQ&Aのポイント
  • 入院中に誤ってACアダプターを捨てられてしまい、代わりのACアダプターを購入したいのですが、適切な案内を得られません。
  • ideacentreAIO520-24IKLで本体側には20V-4.5Aとあり90Wとは分かるのですが、接続部分であるスリムチップのサイズが判らず、適切なACアダプターを教えて頂ければ幸いです。
  • Lenovoデスクトップ(IdeaCentre・Lenovo等)のACアダプターを購入したいです。入院中にACアダプターを失くしてしまったため、代わりのACアダプターを購入したいのですが、適切な案内が得られません。ideacentreAIO520-24IKLの本体側には20V-4.5Aとあり、90Wであることは分かるのですが、接続部分であるスリムチップのサイズがわからず困っています。ご協力お願いします。
回答を見る

専門家に質問してみよう