『日付を○/○と入力すると来年の日付にする。』(JACKY)Excel2007 書類の更改日を見ながらA1セルに日付を入力しています。 その更改日は4ヶ月先までの日付になっています。 10月ならば来年2月までの日付になっています。 書類の更改日が12月31日までの日付なら問題ないのですが、来年1月1日〜だと 1/1と入力すると今年の1月1日になってしまいます。 日付は11月分だったり2月分だったり書類によって違います。 年をまたぐときには、自動的に来年の日付になるように出来たらよいのですが。 ---- 例えば、A1に日付が入力されているとして A2=DATE(YEAR(A1),MONTH(A1)+4,DAY(A1)) のような事でしょうか? (SS) ---- SSさん こんばんは ありがとうございます。 A1に日付が入力されていて「11/17」なら2013年11月17日  で、「2/23」なら「2014年2月23日」...にしたいです。 今は10月なのであるとしても来年の2月末までの日付になります。 解かりにくい説明で申し訳ありません。 よろしくお願いします。JACKY ---- 入力時に自動で来年にしたいと言うことでしょうか。 よく使われるのはオートコレクトで..と入力したら2014/となるように 登録しておいて、来年の日付入力時だけ..1/1と入力する などの方法でしょうか。 ..を:になるように登録している方もいらっしゃるので、 その場合は別のキーを使わないといけませんが… (コナミ) ---- =DATE(IF(AND(MONTH(A1)>=1,MONTH(A1)<=4),YEAR(A1)+1,YEAR(A1)),MONTH(A1),DAY(A1)) MONTH(A1)>=1,MONTH(A1)<=4 の >=1 や <=4 の部分を適当に変えてください。 (se_9) ---- こんばんは コナミさん se_9さん ありがとうございます。 se_9さん 来年の1月頃には来年5月の日付の更改日を入力します。来年2月には来年6月の日付... この先もずっと入力することになるのですが、自動的に年の部分を変更できますか? 当月から数えて4ヶ月以内に年をまたげば翌年の日付にしたいのです。 またがなければ当月と同じ年の日付になります。 これが自動的に出来ればいいな...と思っています。 よろしくお願いします。JACKY ---- こういうこと? シートモジュールへ Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "A1" Then Exit Sub With Target If (Not IsEmpty(.Value)) * (IsDate(.Value)) Then If Month(.Value) < 4 Then Application.EnableEvents = False .Value = DateAdd("yyyy", 1, .Value) Application.EnableEvents = True End If End If End With End Sub (seiya) ---- おはようございます。 seiya様 ありがとうございます。 試してみました。 はい、解決することができました。 これで年の部分をいちいち変更することもなく作業がはかどります。JACKY ---- 解決したようですが、来年の1月になったら困りませんか (現在の日付を考慮する必要がありませんか?) 2014/1/3 に 2/3 と入力すると 2015/2/3 になりませんか 2014/2/3のままでいいのでは? By ---- こんばんは...Byさん 実は...それを試したかったのですが、来年にならないと結果がどうでるのか わからなくて。 2014/1/3 に 2/3 と入力すると 2015/2/3 になりませんか 2014/2/3のままでいいのでは? ...はい、おっしゃるとおりです。 ぜひ!教えてください。 よろしくお願いします。JACKY ---- これ年の部分も入力するの? >1/1と入力すると今年の1月1日になってしまいます。 じゃなかったの? わからん... (seiya) ---- 9月以降で欲しい機能だから、こんな変更でいいのでは? >If Month(.Value) < 4 Then ↓ If Month(.Value) < 4 And 8 < Month(Date) Then (半平太) 2013/10/12(Sat) 22:40 ---- > A1に日付が入力されていて「11/17」なら2013年11月17日  >で、「2/23」なら「2014年2月23日」...にしたいです。 A1に入力された日付(更改日)が対象なんだよね? 1月から3月末日までが対象になるんじゃないの? 今日の日付は対象外じゃないの? なんかごちゃごちゃになってきたな... (seiya) ---- > 10月ならば来年2月までの日付になっています。 あれ? これからすると、 12月ならば来年4月までの日付になるから、      こっちは5ですね。 ↓ If Month(.Value) < 5 And 8 < Month(Date) Then (半平太) 2013/10/12(Sat) 22:56 ---- 余計なお世話をして申し訳ありません 閏年の前年11,12月に2/29の入力がありそうですね このような配慮も必要かな? By ---- (seiya)さんへ 今日の日にちが 10/13であれば 2013/10/14から2014/2/13の日にちを入力 このとき年を省略して入力(例 11/3とか2/4)のため翌年の日にちの場合年がずれるので 翌年の日にちの場合1年加算する 今日が2014/2/2の場合であれば 2014/2/3から2014/6/2の日にちを入力 この場合年を省略しても同じ年なので 加算する必要はない ということなのではないでしょうか ちなみに > If Month(.Value) < 4 And 8 < Month(Date) Then If Month(.Value) < Month(Date) Then だけでもいいのかな(月を求めなくても日付で比較できるかな) 関数でするなら IF(A1 書類の更改日を見ながらA1セルに日付を入力しています > その更改日は4ヶ月先までの日付になっています。 単純にA1に4ヶ月先の更改日を入力する、という意味ではないの? そうだとすれば、1月に2月の日付を入力することは有り得ないと判断しましたが? 閏年の2/29日の処理は必要だと思いますが... (seiya) ---- > If Month(.Value) < Month(Date) Then > だけでもいいのかな(月を求めなくても日付で比較できるかな) これだと、自月より前の月は常に翌年にされるので、やり過ぎになる恐れがあるので止めた。 > If Month(.Value) < 5 And 8 < Month(Date) Then 尤も、この案でも不徹底で、もう少し慎重にやるなら 「当日が9月以降」「入力日付が当日より4ヶ月以内」かつ「月番号差がマイナス」 で限定することになるだろうと思いましたが、いくら配慮したところで 危なっかしい入力方法であることには変わりないので、そこまで拘るのは止めた。 ※何らかの事情で日付を修正する必要が出たとき、上手く対処できるのかなと思っています。 いま思いついたのですけど、こう云う特殊な入力方式を使うと云う意思表示を どこかにさせるようにするといいかも知れません。 例えば、B1セルに「年跨ぎ補完モード」と表示されている時のみこれを実行する。 > 閏年の前年11,12月に2/29の入力がありそうですね > このような配慮も必要かな? これについては全く気が付いていませんでした。流石ですね。 (けど、私は何か案を出す気はないです。) (半平太) 2013/10/13(Sun) 10:51 ---- (seiya)さんへ >単純にA1に4ヶ月先の更改日を入力する、という意味ではないの? なるほど、そのような解釈もできそうですね (半平太)さんへ >自月より前の月は常に翌年にされるので、やり過ぎになる恐れがあるので止めた。 一般的に 旧更改日<入力日<新更改日 だと思っています・・ また、そのような入力がある場合(1月に12月の日付を入力する場合前年にする)も考慮しなくてはなりませんね いずれにしろ、憶測ですので、質問者のコメントによりますね 余計なことばかりコメントして申し訳ありません By ---- > (半平太)さんへ くどい。 (半平太) 2013/10/13(Sun) 20:02 ---- こんばんは、お世話になっております。 >単純にA1に4ヶ月先の更改日を入力する、という意味ではないの? 4ヶ月先までの間の更改日を入力する...とう意味なのです。 なので途中で年が変われば表示年も変わってほしいな...と。 9月以降で欲しい機能だから、→ これです!こうゆうことなのですが、 うるう年は...ちょっと考えていませんでした。 なので 年/月/日 と入力させるようにしようかなと考えています。 申し訳ありません、とっても簡単に考えていました。皆様にご迷惑をおかけしましたこと 本当にごめんなさい。JACKY ---- ごちゃごちゃ書く気もしませんし、深入りする気もないですけど、 こうしておけばまず大丈夫です   ↓ If Month(.Value) < 5 And 8 < Month(Date) Then 9月以降の操作で、1月から4月の日付を入れたら、翌年の日付と解釈するやり方です。 もし、日付の修正や閏年の2/29を入れたりして、理解できない事態に陥ったら、 そのマクロを止めて(※1)、普通に年月日を入力をすればいいです。 (そんな頻繁に起きることじゃないでしょうから) ※1 マクロを全部削除してしまうのが一番簡明だと思います。 (半平太) 2013/10/13(Sun) 20:57 ---- 半平太さん ありがとうございます。 年/月/日 と入力させるようにしようかなと言っておきながら実は面倒くさくて。 教えていただいたマクロを使わせてください。 皆さん、本当にありがとうございました。JACKY ---- 解決後に余計なお世話ですが 入力日より前の日にちを入力することがないなら If .Value < Date Then で十分かと思います 入力日より前の日にちを入力することがあっても If .Value < Date -130 Then くらいで十分かな(入力日前4ヶ月〜入力日より先7ヶ月間のデータであれば問題と思います ただし、閏年の件は除く・・閏年の件の場合は 年を省略せずに入力のこと) 1月に12月の日付を入力する場合前年にするということは考慮していません By ---- 簡単に入力したい、が目的ならオートコレクトみたいに、何かの文字を置き換えればいいんじゃないかと提案。 Private Sub Worksheet_Change(ByVal Target As Range) '//A1="1/1" ・・・2013/1/1 '//A1="1/1+" ・・・2014/1/1 Dim D As String Dim App As Object Set App = Application With Target If .Address(0, 0) <> "A1" Then Exit Sub If .Value = "" Then Exit Sub If IsError(App.Find("/", .Value)) = True Then Exit Sub App.EnableEvents = False D = App.Substitute(Year(Date) + IIf(IsError(App.Find("+", .Value)), 0, 1) & "/" & .Value, "+", "") Select Case True Case IsDate(D) .Value = D Case IsDate(App.Substitute(D, "2/29", "3/1")) .Value = App.Substitute(D, "2/29", "3/1") Case Else MsgBox (D & "は日付になりません") .ClearContents End Select App.EnableEvents = True End With Set App = Nothing End Sub (稲葉)2013/10/14(月曜日) 13:44