質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

12339閲覧

VBAマクロで年度計算をする方法についてです

hoka

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/09/03 02:37

編集2019/09/03 03:06

C列にある日付をF列に年度で表示させたいのですが、エラーが出てしまい処理が出来ません。
どのように変えればよいか方法はあるでしょうか。
プログラミング初心者のためお力お貸し頂ければ幸いです。

追記
年度は4/1始まり3/31に終わりです。
例)
C列     F列
2007/1/18 → 2006
2008/6/2  → 2008
2009/6/8  → 2009
2009/6/22 → 2009
2012/3/19 → 2011
2004/6/23 → 2004
2013/3/6  → 2012

と表示されるようにしたいです。

↓ネットにあるものを参考に作成したものです。

Sub 年度() Dim n As Date, i As Long i = Cells(Rows.Count, "C").End(xlUp).Row n = Cells(i, 3) Cells(i, 6) = nendo(n, 3) End Sub Function nendo(n, x) nendo = Year(DateAdd("m", -x, n)) End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2019/09/03 02:58

年度とは、具体的にどのような値がほしいのですか。 2019/1/1の年度 2019/3/31の年度 2019/4/1の年度 2019/12/31の年度 について、求める年度を提示してください。(新年度の始まりは4/1からですか?)
tatsu99

2019/09/03 04:08

提示されたマクロで望んだ結果が得られると思いますが、 具体的にどのようなエラーがでたのでしょうか。 具体的にエラーの内容を提示してください。
guest

回答4

0

nendo関数の考え方が間違っていると思います。

年度は、次のようにして決められます。
1) 4月~12月なら、年の値が、そのまま年度になる。
2019年9月3日は、月が4月~12月の範囲に入っているので、2019年度。
2) 1月~3月なら、年の値から1を引いたものが年度になる。
次の元日(2020年1月1日)は、月が1月~3月の範囲に入っているので、2019年度。(2020-1 = 2019)

 nendo関数の引数として必要なのは、日付だけです。
日付から、year関数で年を、month関数で月を求めて、上記の年度の決め方をプログラムにすれば良いです。
if文で月が4以上か否かで分岐させ、年から年度を求める(年のままか、年-1を研鑽するか)だけです。

投稿2019/09/03 03:05

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoka

2019/09/03 05:09

ご回答ありがとうございました 参考にさせて頂きます!
guest

0

ベストアンサー

nendo関数自体に問題はないです。(別の方法もありますが)

エラーになるとしたら、C列の最終行の値が日付になっていないことぐらいしか思いつかないですね。
その場合、「型が一致していない」というエラーになります。

あと、そのコードだとC列の最終行だけが変換されますが、それでいいのかな?

前行変換したいなら For Next でループ処理するか、m6uさんの回答のように関数を設定するのがいいと思います。

追記

日付以外が入力されていてもエラーにならないようにするには、下記のコードで。

vba

1Sub 年度() 2 Dim n As Variant, i As Long 3 4 i = Cells(Rows.Count, "C").End(xlUp).Row 5 n = Cells(i, 3) 6 Cells(i, 6) = nendo(n, 3) 7End Sub 8 9Function nendo(n, x) 10 If IsDate(n) Then 11 nendo = Year(DateAdd("m", -x, n)) 12 Else 13 nendo = Null 14 End If 15End Function

n をDate型にするとセルに日付以外に入力されていた場合エラーになります。
Variant型にしておいてどの型でも許容するようにして、nendo関数側でIsDate関数で日付かどうか判断して分岐処理すればいいでしょう。

年度の求め方としては、If文で月が3以下なら-1するようにするというのが素直な方法だと思いますか、日付を-3か月して年を求めれば年度になるという考え方も式がシンプルになるのでありだと思います。

投稿2019/09/03 04:37

編集2019/09/03 04:49
hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoka

2019/09/03 05:04

ご回答ありがとうございました。 hatena19さんの回答していただいた通りFor Next 文がないと全行処理が出来なかったので無事教えていただいたコード+For Nextで動きました!
guest

0

なんか小難しく考えすぎでは。
年度というのは、本年4月から来年3月末までです。
つまり4月~12月ならその年、1月~3月なら-1した年です。
これを素直にコードに直すとこうなります。

VBA

1function nendo(n) 2 If Month(n) >= 4 And Month(n) <= 12 Then 3 nendo = Year(n) 4 Else 5 nendo = Year(n) - 1 6 End If 7End Function

ちなみにですがセルにはシリアル値で入れていますでしょうか?
文字列で日付を入れていると正しく処理できません。
.

投稿2019/09/03 04:31

編集2019/09/03 05:08
ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoka

2019/09/03 05:06

ご回答ありがとうございました! まだまだ始めたばかりで不慣れなばかりに難しく考えすぎていたかもしれません… 参考にさせて頂きます
guest

0

ワークシート関数で=YEAR(EDATE(C1,-3))で出るような話に思えるけど。

投稿2019/09/03 04:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoka

2019/09/03 05:08

ご回答ありがとうございました。 次回は関数で出してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問