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

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

ただいまの
回答率

88.03%

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,432

score 8

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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tatsu99

    2019/09/03 11:58

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

    キャンセル

  • tatsu99

    2019/09/03 13:08

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

    キャンセル

回答 4

+2

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 14:09

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

    キャンセル

checkベストアンサー

+1

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

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

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

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

追記

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

Sub 年度()
    Dim n As Variant, 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)
    If IsDate(n) Then
        nendo = Year(DateAdd("m", -x, n))
    Else
        nendo = Null
    End If
End Function

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 14:04

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 14:08

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

    キャンセル

+1

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 14:06

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

    キャンセル

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

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る