エクセルで指定した年の同日を扱う方法

このQ&Aのポイント
  • エクセル2010を使用していますが、指定した年の同日を扱う方法について教えてください。
  • 通常、エクセルで月日を入力するとパソコンに設定された年の同日として扱われますが、指定した年の同日をエクセル上で扱う方法を知りたいです。
  • セルを別に作って入力した日付から1年引いた同日を表示する方法以外で、自動で指定した年の同日を扱う方法を教えてください。
回答を見る
  • ベストアンサー

月日を入力して指定した年の同日にすることは可能?

エクセル2010を使っており、経理を担当している者です。 通常、エクセルで月日を入力すると、パソコンに設定された年の同日として扱われますが、 指定した年の同日としてエクセルに扱ってもらうことは可能でしょうか? 例えば、2013/12/26日と入力するつもりで、2014年になってから12/26と入力すると、 2014/12/26日としてエクセル上、扱われますが、自動で「このセル範囲に入力した月日は 2013年の同日」というように年を設定をすることは可能でしょうか? セルを別に作って、入力した日付から1年引いた同日が返されるように関数を組むのも手ですが、 そうではなくて、入力すると自動でそのようになると大変助かります。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.12

ぎゃっはっはぁ~! 質問の嵐ですね! (1) Private Sub Worksheet_Change(ByVal Target As Range) 'この行から '対象セルがA3~A10以外、または対象セルが複数セルならなにもしない If Intersect(Target, Range("A3:A10")) Is Nothing Or Target.Count <> 1 Then Exit Sub 対象セルが複数セルなら何もしない、とはどういう意味でしょうか? 複数のセルを一度に操作する場合(一括で複数セルの値・式などをデリート、同じ値をCtrl+Enterで入れるなどの場合を想定しているのでしょうか? ※ 簡単にいえばそういうコトです、何度も同じセルに入力する場合データ消去の作業もあるかと思います。 その場合、複数セルをまとめて消去という操作も考えられますので、 念のためのエラー回避です。 (2) また、セル範囲をA3からA10,だけでなく、A25からA30も対象になるとしたら、 のようにセル範囲が飛び飛びの場合は If Intersect(Target, Range("A3:A10,A25:A30")) Is Nothing Or Target.Count <> 1 Then Exit Sub のように カンマで区切ります。 (3) 「Value」とは何かの値を格納した変数ですか? .Value と必ず「.」がついているコトに注意してください。 >With Target とつながっています。 主語は Target になります。 何度も同じ○○・・・と入力せずに With ○○ とすれば○○部分が省略できます。 Withなしで書けば >If IsDate(Target.Value) Then のような感じになります。 (4) 「If IsDate(.Value) Then」が効いていなかったとしたら、どういう効果があるのでしょうか? ※ 数値はシリアル値として認識されますが、仮に文字列を入力した場合は日付として認識されませんので 何の変化もありません。 (5) 'イベントを無効にする(無限ループに陥らないようにするため) Application.EnableEvents = False 一度無限ループを経験されると判るはずです。 新しくExcelを立ち上げ↓のコードをコピー&ペーストしてA1セルに何らかの数値を入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) Range("A1") = Range("A1") / 2 End Sub 上記ではA1セルは入力した数値÷2 仮に100を入力すれば50という結果になってほしいのですが 無限ループに陥りとんでもない数値になります。 ワークシートChangeイベントですので、A1セルデータ変更があるたびにマクロが実行されますので これが無限ループになってしまいます。 これを Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Range("A1") = Range("A1") / 2 Application.EnableEvents = True End Sub というコードにすれば1度だけマクロが実行され、仮に100と入力した場合は50が表示されます。 最後に 今回の質問の場合、無限ループに陥らないのはたまたまだったと思った方が良いと思います。 >If Year(.Value) <> Range("A1") Then が一度実行されると、Targetの「年」の値とA1セルの数値が同じになるため 無限ループが回避されると思います。 前回も書いたように当方が投稿したコードは結構無駄が多かったかもしれませんが、 以上のようなコトを考慮してのコードでした。 じっくり検証すればもっと簡単なコードにできたかもしれませんが、 あの時点ではあの程度のコードしか思いつかなかった次第です。m(_ _)m

qazxcvfr4
質問者

お礼

大変ありがとうございます。 ようやくわかってきたと思います。 何度もお世話になりました。

その他の回答 (11)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.11

>印刷するたびに毎回手作業で年を修正するのは大変なので相談させていただきました。  別に、今年の日付が「入力されている可能性がある」セル範囲をまとめて範囲選択されてから、一括して置換するだけですので、大変な作業と言う程のものではない様な気が致します。  大変という事ではなく、単に煩わしいという事なのでしょうか? それならば解らなくも御座いません。  もしも、その様な事なのでしたら、マクロを使って日付を書き換えるというのも一つの手だとは思います。  但し、その場合には、いざ指定した年以外の年の日付を入力しようとしましても出来なくなる訳ですが、12月から1月にかけての日付を入力する場合の様に、途中で異なる年の日付を入力する必要が生じる事を、本件の場合においては心配する必要が無いという事なのでしょうか?  もしも、途中で入力しなければならない年が変わる事もありえるのでしたら、日付の入力作業を開始する際に、一々、西暦何年の年の日付として入力される様にするのかという事を設定してから、入力を開始しなくてはならない事になりますが、入力作業開始時に毎回年を設定する事については、煩わしくは無いのでしょうか?  或いは、どちらも面倒ではあっても、印刷時に訂正するよりは、入力作業開始時に毎回年を設定する方が、まだましという事なのでしょうか?  例えそうだとしましても、入力作業の開始時に、毎回年を設定するのであれば、入力作業を終了する際に、その日に入力したセル範囲内の日付に対して一括して置換を行うのと、労力的(煩わしさの程度)には大差が無い様な気も致します。  それに、指定した年の日付に自動で書き換える様なマクロを使った場合であっても、万が一、質問者様以外の人間が入力作業を行った際に、そのマクロがどの様なものなのかを理解出来ずに、書き換え後の年の設定を行わずに入力作業を行って、入力された日付がマクロによって誤った年の日付に書き換わってしまっている、という様な事態になる恐れもあるかも知れませんから、結局は、印刷前の確認作業か、又は年の部分の一括置換作業のどちらかが、必要になるのではないでしょうか?

qazxcvfr4
質問者

お礼

ご指摘ありがとうございます。 >もしも、途中で入力しなければならない年が変わる事 ~~或いは、どちらも面倒ではあっても、印刷時に訂正するよりは、入力作業開始時に毎回年を設定する方が、まだましという事なのでしょうか? 確かにややこしさはありますが、年を設定することが必要になるタイミングはあまりないので、マクロによって手作業で直接的には変更できなくなることのデメリットの方が少ないと思います。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.10

No.3・5・7です。 コードの内容を理解して動かしたい!というコトのようなので・・・ すべてを理解しようとすると結構時間がかかるかもしれませんが、 ネットで色々検索できますので、当方が文章で説明するより間違いない情報が得られると思います。 コードを記載する際、個人的には順調に動く!というのは当然ですが、 いかにエラーを出さないようにするか!という方に重点を置いています。 特に今回のようにワークシート・チェンジイベントは 入力(セルデータ変更) → マクロ実行 となりますので、ある程度のケースを考えてのコードにしています。 (場合によっては、動かすことよりエラー回避のコードの方が多いかもしれません) No.7のコードの質問のほとんどがエラー回避のコードになります。 >「Target.Count <> 1」とはどういう意味でしょうか。 >このプログラムを起動させない条件の1つにしていると思うのですが、理解できませんでした Changeイベントは単に入力 → Enter で発生するだけでなく、複数セル範囲指定 → データ消去 でも発生します。 それを回避するためのもので、今回の場合はたまたま >If IsDate(.Value) Then の部分がストッパー替わりで効いていますのでなくても大丈夫のようですね。 >Application.EnableEvents = False ・・・ >Application.EnableEvents = True の部分は無限ループを回避するためのものです。 これも今回は >If IsDate(.Value) Then がストッパーとして効いていると思います。 習慣として入力セルそのもののデータ変更をする場合は >Application.EnableEvents = False・・・を使用してしまいました。 以上のコトを踏まえて前回のコードにそのまま説明を加えておきます。 (実際は不要なコードもあるかもしれません) Private Sub Worksheet_Change(ByVal Target As Range) 'この行から '対象セルがA3~A10以外、または対象セルが複数セルならなにもしない If Intersect(Target, Range("A3:A10")) Is Nothing Or Target.Count <> 1 Then Exit Sub '対象セルの・・・ With Target 'データが日付データとして認識できる場合は If IsDate(.Value) Then 'データの「年」の数値がA1セル以外の場合は If Year(.Value) <> Range("A1") Then 'イベントを無効にする(無限ループに陥らないようにするため) Application.EnableEvents = False 'データを A1セルの「年」・入力データの「月」・入力データの「日」のシリアル値に置き換える .Value = DateSerial(Range("A1"), Month(.Value), Day(.Value)) 'イベントを有効に戻す Application.EnableEvents = True End If End If End With End Sub 'この行まで ※ 以上のような感じのコードにしています。 この程度でよろしいでしょうかね?m(_ _)m

qazxcvfr4
質問者

お礼

何度もご丁寧にお答えいただき、大変感謝いたします。 しかし、まだわからない点がございまして・・<(_ _)> >Private Sub Worksheet_Change(ByVal Target As Range) 'この行から '対象セルがA3~A10以外、または対象セルが複数セルならなにもしない If Intersect(Target, Range("A3:A10")) Is Nothing Or Target.Count <> 1 Then Exit Sub 対象セルが複数セルなら何もしない、とはどういう意味でしょうか? 複数のセルを一度に操作する場合(一括で複数セルの値・式などをデリート、同じ値をCtrl+Enterで入れるなどの場合を想定しているのでしょうか? また、セル範囲をA3からA10,だけでなく、A25からA30も対象になるとしたら、 「If Intersect(Target, Range("A3:A10"),Range("A25:A30")) Is Nothing Or Target.Count <> 1 Then Exit Sub」 で良いのでしょうか? >'データが日付データとして認識できる場合は If IsDate(.Value) Then 「Value」とは何かの値を格納した変数ですか? どこでもValueの値の定義をしていないようですが・・ >データの「年」の数値がA1セル以外の場合は If Year(.Value) <> Range("A1") Then 'イベントを無効にする(無限ループに陥らないようにするため) Application.EnableEvents = False ここも理解できませんでした。 「If IsDate(.Value) Then」が効いていなかったとしたら、どういう効果があるのでしょうか? 何度も申し訳ございませんが、お答えいただけると非常にありがたいです。 よろしくお願いいたします。

回答No.9

>……があるのですが、……に飛ぶようになっております。  そして、入力を終える度にその様式を印刷する、という使い方なので、入力した時点で日付けの年が自動で指定したものになっていてほしいのです。 印刷をしたいということと、処理すべきデータの概要については、分かりました。また、年を書き換えたいということも質問文で分かりました。 しかし「どこが問題になっているのか」という点を示してほしいのです。単に、自動で書き換わればラクだから、という意味ですか? 一回一回印刷したいということで、まとめての処理はしない分、置換はさほどの威力を発揮しないとしても、便利な関数もあります。それもダメな理由についても、説明がありません。 補助セル(A1:C1)を同じシート上の印刷範囲の外とか、あるいは別シート上に置けば(*)、当然それは印刷されません。次の数式を記入します。ユーザーが毎回書き換えるのは、B1、C1 セルのみです。 A1 2013 B1 12 C1 26 D1 =date(a1,b1,c1)  ……セルの書式として年を表示するものなどを指定 * 別シート上に置くには、いったん D1 の数式を上のとおりに記入してから、A1:C1 のセル範囲を「切り取り」により別シート上に貼り付けたほうが、数式を書くのがラクです。こうすると、数式中の参照が自動的に書き換わります。 少なくとも、Excel の一般機能で年を変えておく設定というのは、ありません。質問文の動作に最も近いのは、マクロです。 >……このマクロはマクロの実行などのボタンをクリックしなくてもブックを開いている間は自動で起動するのでしょうか? Worksheet.Change イベントなので、ユーザーがセルへの記入を終えた次の瞬間に、Excel が値を書き換えます。Excel のマクロあるいは VBA(Visual Basic for Applications)の入門レベルの知識です。No.7 さんのコードに Worksheet_Change と書いてありますね。 常時実行しているのではなく、イベント(セルの値の書き換えなど)が生じたときだけ自動的に実行されます。 処理に要する時間をこちらの環境で計測すると、1 ms(ミリ秒)もかからない感じですが、誤差を考えて、10 ms 未満と言っておきます。Enter キーを押したことによりカーソルがシート上で下に移動した瞬間には、もう値が書き換わっていることになるでしょう。 使い方としては、日付を記入するシートのシート見出しを右クリックして「コードの表示」をクリックすると、VBE(Visual Basic Editor)内のそのシートのコードウィンドウが開くので、そこに No.7 さんのコードを貼り付けます。 しかしただコピペするだけでなく、マクロがどんなものなのか、少し調べてから使ってください。また、No.7 さんのコードにはもちろん危険な記述などは含まれていませんが、どういった内容が書かれているのか、各単語の意味は何か、VBE のヘルプ(キーボードの F1 キー)なりインターネットでザッとでも確認してから使われることをお勧めします。Worksheet.Change についても、ヘルプで調べられます。 ところで、データを蓄積するということは考えなくても大丈夫なのでしょうか?必要なら、蓄積しておいて、それを 1 行 1 行、1 つの様式に転記し、印刷し、を自動的に繰り返すということも、マクロにより可能ですが。 この場合は大量のデータを一括で処理するわけですから、Worksheet.Change イベントではなくて、「マクロ」ダイアログなどから一括処理用のマクロを実行するほうがよいでしょう。質問者さんのおっしゃるように、ボタンを作っても構いません。

qazxcvfr4
質問者

お礼

ご丁寧にありがとうございます。 >しかし「どこが問題になっているのか」という点を示してほしいのです。単に、自動で書き換わればラクだから、という意味ですか? おっしゃるとおりです。千以上のレコードを扱うので大きなことになります。 >一回一回印刷したいということで、まとめての処理はしない分、置換はさほどの威力を発揮しないとしても、便利な関数もあります。それもダメな理由についても、説明がありません。 >補助セル(A1:C1)を同じシート上の印刷範囲の外とか、あるいは別シート上に置けば(*)、当然それは印刷されません。次の数式を記入します。ユーザーが毎回書き換えるのは、B1、C1 セルのみです。 date関数を紹介されていますが、「年」「月」「日」と3つのセルを使用してそれを足して日付として扱うものですよね。12/25のように月と日と1つのセルにいれたいので、マクロなど別の方法を使いたいのです。現状でも1行がかなりの幅になってしまっているので、これ以上幅を増やしたくないものでして。 VBAの説明もありがとうございました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.8

>単独のエクセルファイルではありますが、別のシートにデータを飛ばしています。  同一ファイル内の別シートにデータが反映されるという事は、別シートの方ではなく、元の入力欄の方のデータを訂正するだけで、再度データが飛ばし直されて、別シートに表示されるデータの方も自動的に訂正後のデータに書き換わると思うのですが、実際に試してみられた際にそうはならなかったという事なのでしょうか?  余程ひねくれたマクロが組まれてでもいない限り、元の入力欄のデータを訂正しても別シートには反映されないなどという事は無いと思いますので、一度、入力欄の方の日付データを2~3セル程度入力し直す事で、確認してみられては如何でしょうか?  そして、実際に試してみられた際に、もしも、別シートの方には訂正後のデータが反映されないなどという事になっていた場合には、回答No.4で述べました様に、例えマクロを使って入力欄の日付を1つのセルに入力した瞬間に修正したとしても解決策にはならない恐れが少なくないと思います。  もしも、その様な事になりますと、入力欄の日付だけではなく、データが飛ばされた先である別シートのデータの方も、後から2013年の日付に一括して置換されるか、或いは、マクロを使って入力欄と別シートの双方のデータを、後から書き直すしかないと思います。  回答No.4で述べました様に、入力した日付が前年の日付になる様にするだけのマクロを使っても、一旦入力されたデータを一瞬後に前年の日付に書き換えているだけであり、真の意味で >自動で「このセル範囲に入力した月日は2013年の同日」というように年を設定をすること にはなってはおりませんから、「全ての日付を入力し終えてから一括して置換する等の方法」と同様に解決策にはならない筈です。  おそらく実際にはその様な事は無く、「複数の日付を入力し終えてから一括して置換する方法」も「入力した日付が前年の日付になる(ようにに見える)マクロを使用する方法」も、どちらも有効な方法になると思いますので、兎に角一度試してみられる事を御勧め致します。 >マクロの実行などのボタンをクリックしなくても、ファイルを開いている間は自動で起動しているマクロといったものもあるのでしょうか?  私個人は作成した経験は御座いませんが、その様なマクロは存在します。 【参考URL】  Office TANAKA - Excel VBA Tips[自動実行マクロを名前で定義する]   http://officetanaka.net/excel/vba/tips/tips86.htm  よねさんのWordとExcelの小部屋 > Excel(エクセル)VBA入門 > 16.ワークシートのイベント > Change   http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html#change  動作を確認した訳では御座いませんが、回答No.3、5、7様のマクロも記述内容から考えてその一種であると思われます。

qazxcvfr4
質問者

お礼

ご回答ありがとうございます。 >同一ファイル内の別シートにデータが反映されるという事は、別シートの方ではなく、元の入力欄の方のデータを訂正するだけで、再度データが飛ばし直されて、別シートに表示されるデータの方も自動的に訂正後のデータに書き換わると思うのですが、実際に試してみられた際にそうはならなかったという事なのでしょうか? おっしゃるとおり、元の入力欄のデータを修正すれば、データを飛ばした先の様式の当該箇所も修正されます。元の入力欄は「12/25」のように月日のみを入力するようになっており、年が明けて2014年になってしまうと、2013/12/25日のつもりで入力しても2014/12/25日として扱われてしまい、印刷するたびに毎回手作業で年を修正するのは大変なので相談させていただきました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

No.3・5です。 (1)このマクロはマクロの実行などのボタンをクリックしなくてもブックを開いている間は自動で起動するのでしょうか? (2)また、「2013」などの年の指定、及び年を指定したいセル範囲の指定はどこですれば良いか教えていただけないでしょうか。 範囲指定は 「Range("A:A")) 」を変更すれば良いのでしょうか? 上記の質問について・・・ (1)前回のコードはChangeイベントですので、 コードを記載しているSheet上の指定した範囲データ変更があるたびに、マクロが実行されます。 すなわち単に範囲指定内セルにデータ入力のみでOKです。 (2)・(3)については具体的な表のレイアウトが判らないので、勝手にこちらで決めてやってみました。 A1セルに指定したい「年」の数値を入力しておきます。(2013など・・・) 次にイベントが発生するセル範囲をA3~A10セルとした場合のコードです。 A3~A10セルに数値データを入力すると、日付と判断して、A1セルに入力した年のシリアル値に置き替えます。 (A3~A10セルに 11/23 のように入力するだけでA1セルの年の11月23日のシリアル値にします) 前回同様、画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストし、A3~A10セルにデータを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から With Target If Intersect(Target, Range("A3:A10")) Is Nothing Or Target.Count <> 1 Then Exit Sub If IsDate(.Value) Then If Year(.Value) <> Range("A1") Then Application.EnableEvents = False .Value = DateSerial(Range("A1"), Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If End With End Sub 'この行まで ※ 余計なお世話かもしれませんが、 日付入力するセルは「入力規則」 → 日本語入力タブ → 「オフ」 にしておけば IMEのON・OFFの操作は不要で半角英数の入力が可能になります。 ※ 他の方のお礼を読ませてもらっても具体的にどのようなコトがしたいのかが はっきり見えてきません。 という訳で今回も外していたらごめんなさいね。m(_ _)m

qazxcvfr4
質問者

お礼

大変ありがとうございます。 VBAを使えば、自動で実行されるマクロを作れるということもわかり、勉強になりました。 しかし、記述していただいたVBAの意味が理解できませんでした。 教えていただけるととてもありがたいです。 >Private Sub Worksheet_Change(ByVal Target As Range) 'この行から With Target If Intersect(Target, Range("A3:A10")) Is Nothing Or Target.Count <> 1 Then Exit 「Target.Count <> 1」とはどういう意味でしょうか。 このプログラムを起動させない条件の1つにしていると思うのですが、理解できませんでした。 >If IsDate(.Value) Then If Year(.Value) <> Range("A1") Then Application.EnableEvents = False .Value = DateSerial(Range("A1"), Month(.Value), Day(.Value)) Application.EnableEvents = True End If End If 何かの条件を2つ付けて処理をしているようですが、ここも全体的に理解できませんでした。 IsDateやらValueやらApplication.EnableEventsやら単語ごとに調べたのですが、理解できませんでした。 教えていただけると幸いです。 お手数おかけしますがの、よろしくお願いいたします。

回答No.6

>そういった方法もございますが、今回はそれでは解決策にならないんです((+_+)) まずは、問題を示してください。それによって、対応の方法も変わってきます。

qazxcvfr4
質問者

お礼

日付けを含んだ1行、30列ほどで構成されたデータがあるのですが、そのデータが別のシートの様式に飛ぶようになっております。そして、入力を終える度にその様式を印刷する、という使い方なので、入力した時点で日付けの年が自動で指定したものになっていてほしいのです。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

No.3です! たびたびごめんなさい。 前回のコードでは入力間違いをした場合はエラーになってしまいますので、 前回のコードはすべて削除して↓のコードに変更してください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myDate As Date If Intersect(Target, Range("A:A")) Is Nothing Or Target.Count <> 1 Then Exit Sub With Target If IsDate(.Value) Then myDate = .Value If Year(myDate) <> Year(Date) Then Application.EnableEvents = False .Value = DateSerial(Year(Date), Month(myDate), Day(myDate)) Application.EnableEvents = True End If End If End With End Sub ※ これで入力間違いで文字列になったとしてもエラーにならないと思います。 検証せずに投稿してごめんなさいね。m(_ _)m

qazxcvfr4
質問者

お礼

作っていただき、感謝します。 しかし、このマクロはマクロの実行などのボタンをクリックしなくてもブックを開いている間は自動で起動するのでしょうか? また、「2013」などの年の指定、及び年を指定したいセル範囲の指定はどこですれば良いか教えていただけないでしょうか。 範囲指定は 「Range("A:A")) 」を変更すれば良いのでしょうか?

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

>今回はそれでは解決策にならないんです((+_+))  解決策にならないと仰る理由は何なのでしょうか?  後から一括して年を置き換える事が出来ないという事は、もしかしますと、その日付の入力欄は単なる単独のExcelファイルという訳ではなく、何らかのシステム上の入力欄の役目も担っていて、セルに入力する端から、どこかにデータが送られてでもいるのでしょうか?(まさかそんな間違いが一切許されない様なシステムは無いと信じたいですが)  もし、その様な話ですと、例えVBAを使って入力する端から年を書き換える様にしたとしましても、一旦は、セルに2014年のデータが入力される事に変わりは無いのですから、人間の目には2014年の日付が映る事は無くとも、データとしては2014年のデータがどこかに送られる事になりますので、解決策にはならないと思います。  兎に角、後から一括して年を置換する方法が解決策にならないと仰るという事は、何か特殊な事情があるものと思われますが、その理由が判らなければ、他の方法も解決策にならない恐れが御座いますので、その理由を御説明頂く訳には参りませんでしょうか?

qazxcvfr4
質問者

お礼

>解決策にならないと仰る理由は何なのでしょうか? 日付けを含んだ1行、30列ほどで構成されたデータがあるのですが、そのデータが別のシートの様式に飛ぶようになっております。そして、その様式を印刷する、という使い方なので、入力した時点で日付けの年が自動で指定したものになっていてほしいのです。 >もしかしますと、その日付の入力欄は単なる単独のExcelファイルという訳ではなく、何らかのシステム上の入力欄の役目も担っていて、セルに入力する端から、どこかにデータが送られてでもいるのでしょうか?(まさかそんな間違いが一切許されない様なシステムは無いと信じたいですが) 当たらずしも遠からずという感じですね。 単独のエクセルファイルではありますが、別のシートにデータを飛ばしています。 データの入力間違いに気がつけばそこで修正して印刷すれば良いので、 間違いが一切許されないというわけではございません。 >もし、その様な話ですと、例えVBAを使って入力する端から年を書き換える様にしたとしましても マクロの実行などのボタンをクリックしなくても、ファイルを開いている間は自動で起動している マクロといったものもあるのでしょうか?

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんにちは! VBAになってしまいますが、一例です。 A列に日付データを入力するとします。 尚、セルの表示形式は「標準」にしておいてください。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストし、A列にデータを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から Dim myDate As Date If Intersect(Target, Range("A:A")) Is Nothing Or Target.Count <> 1 Then Exit Sub With Target If .NumberFormatLocal = "yyyy/m/d" Then myDate = .Value If Year(myDate) <> Year(Date) Then Application.EnableEvents = False .Value = DateSerial(Year(Date), Month(myDate), Day(myDate)) Application.EnableEvents = True End If End If End With End Sub 'この行まで ※ 最初に書いたようにセルの表示形式を日付「yyyy/m/d」にしておくと 全く反応しません。m(_ _)m

qazxcvfr4
質問者

お礼

作っていただき、大変ありがとうございます。 しかし、言葉足らずで申し訳ないのですが、今回は「日付けを含んだ1行、30列ほどで構成されたデータを入力するごとに別のシートの様式に飛ばして印刷する」という使い方なので、入力した時点で日付けの年が自動で指定したものになっていてほしいのです。 マクロというと、ブックを開いた時点で作動するのではなく、ボタンをクリックするなどでワンアクション必要なのではないでしょうか?

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 先程の回答の中に、一部言葉足らずな表現が御座いました。 「御質問の趣旨とは少し異なりますが、日付を入力し終えてから、」 という部分を 「御質問の趣旨とは少し異なりますが、全ての日付を入力し終えてから、」 に読み換えて下さい。  後それから、言うまでも御座いませんが、カレンダーを調整しなくとも、「2013/12/26」という具合に年付きで日付を入力なされますと、自動で2013年の日付となります。(年から打ち込むのが煩わしいために質問したであろう事は承知しておりますが、念のために述べておきます)

qazxcvfr4
質問者

お礼

ありがとうございます。 >御質問の趣旨とは少し異なりますが、全ての日付を入力し終えてから、 承知しておりますが、今回はそれではダメなのです。 言葉足らずで申し訳なかったのですが、今回は「日付けを含んだ1行、30列ほどで構成されたデータを入力するごとに別のシートに飛ばして印刷する」という使い方なので、入力した時点で日付けの年が指定したものになっていてほしいのです。

関連するQ&A

  • エクセルで月日を入力すると1900年のものになってしまう。

    エクセルで月日を入力すると1900年のものになってしまう。  あるエクセルのワークシートのセルに月日を入力すると、1900年のデータになってしまいます。たとえば、5/12と入れると、1900/5/12が入力されます。それを2010年のデータに書き換える(年をつけて入力する)ことはできますが、同じセルにもう一度月日のみを入力するとやはり1900年のデータが入ります。  たぶん、どこかの設定を知らずに変えてしまったのだと思いますが元に戻すことができず困っています。  同じエクセルで新規ワークシートを開くと問題なく本年の月日で入力されます。  どなたか解決方法が分かる方の回答よろしくお願いします。

  • 月日の入力について

    エクセル2002にて 標準に設定されているセルに、”03年10月”と入力しましたが、表示は自動で”2003年10 月”変わってしまいました。 また、入力した文字は、自動で”2003/10/1”に変わってしまいました。 セルの設定を最初に文字列にしておけば問題ないのですが、一旦”2003/10/1”になっ てしまった文字を、自動で”03年10月”に戻す方法はありますか?

  • 前年の月日の入力設定

    確定申告の参考資料をエクセルでつくりました。日付だけ打ち込むと今年の日付になってしまうので、逐一月日の前に、「08/」を入れていました。 月日だけを入れると、前年(或いは特定の年)の月日になるような書式の設定とか、関数とか、方法とかを教えてください。先は長いですが、来年の申告書類の時に使いたいと思います。

  • エクセルで入力された西暦の月日の前ゼロを消す

    生年月日が西暦で入力されています。 1995/04/11という感じで何百もあります。 これを月日の前ゼロなしにしたいのです。 1995/4/11というように。 関数を教えてください。 今後は書式の設定をしますが 現在は文字列になっていてセルの書式設定で 日付に変えてもかわりません。 よろしくお願いします。

  • 月日の入力が微妙にずれてしまう

    office 2002を使っていますがエクセルで月日を入力するとセルによって微妙にずれが生じてしまいます。印刷をしても見づらくなってしまいます。直す方法を教えてください

  • エクセルでの月日、曜日の入力に関して

    こんにちは いつもお世話になっています。 エクセルで日付、曜日の入力に関して教えてください。  セルA1に西暦年月日を数字で入力してあります。表示形式は標準です。  例えば、2010年1月1日は20100101です。  これに対応させてセルB1に月日、例えば1月1日。セルC1には曜日を入力させたいです。  歴史年表を作っています。よろしくお願いします。

  • エクセルで月日と曜日一覧を自動的に入力させたい

    恐れ入ります。 エクセルについて質問します。 下記のような月日と曜日の入力をしております。     A    B    C       ーーーーーーーーーーーーーーーーー 1  7月1日|7月2日|7月3日|・・・・   ーーーーーーーーーーーーーーーーー 2    月 |  火 |  水 |・・・・   ーーーーーーーーーーーーーーーーー 3  たとえばどこかのセルに「  年」「  月」を入力するようにしたら、自動的に上記の一覧に月日と曜日を入力させるようにできませんでしょうか。  30日までの月の場合、31日にあたるセルがエラー表示にならないようにもしたいです。  お知恵をお貸しください。

  • Excel 前年月日の入力

    こんにちは Excelで日付を入力する際、月日だけをキーインすれば本年の月日で入力されます。 例えば"1/4"とキーインすれば2013年1月4日で入力されたことになります。 普通はこれで便利なのですが、例えば、本日(1月4日)に"12/31"とキーインすれば2013年12月31日になります。 2012年12月31日を入力したいときは"2012/12/31"とか"12/12/31"としています。 もっと便利に(キータッチを少なく)前年など本年以外の年月日を入力する方法はないでしょうか? Excel2010ですが、おそらくどのバージョンでも共通かと思います。

  • Excelの入力で

    Excelで A1のセルには日付を入力します。 A1に入力した日付が 1/1~1/31 の間の日付だったときは、B1のセルに自動的に「1月」と表示 2/1~2/28 のときは「2月」、3/1~3/31 のときは「3月」…と表示させたいです。 Excelの関数でできるかなと考えていたのですが、頭がパンクしてしまいました(^^; よろしくお願いします。

  • エクセル 日付自動入力?

    エクセル2000を使用しております。 例)セルA1に 8/1 と入力したら   セルB1以降には自動で 8/2 セルC1には8/3・・・・・ 以上のように連続2週間分の日付が入力されていく。 但し 土曜日、日曜日の日付は入力されないようにする。 以上のような自動入力をする関数、もしくはVBAにての 命令文を教えていただきたいのですが・・ よろしくお願いいたします。

専門家に質問してみよう