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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

716閲覧

EXCEL VBAで、1回目に実施した日から2回目に実施する日までの経過日数をマクロを組んで正確に算出できるようにする方法を教えてほしいです。

study.vba-22_o

総合スコア2

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2021/12/13 14:56

■課題

ExcelVBAで、「1回目に実施した日にちから、2回目実施までに、”〇年●カ月●日経過した”」ということが、MsgBoxなどででるように、マクロを組みたい。

■現在の問題

色々ググってみたり、自分の浅い知識で組んではみたが、現状、1回目に実施した日にちから2回目実施するまで、〇年〇カ月〇日の、〇の部分が、すべて同じ数値の内容でしか表せていない。

例:1回目の実施日 2021/12/13
2回目の実施日 2022/02/10

であった場合、「1年2カ月60日」みたいな感じで、「〇カ月も、〇日も表記は違えど意味は同じ」となってしまい、〇年に関しては、1年経っていなくても、「1年」と表記されてしまう。

実際は、「0年1カ月28日」が正解だと思うし、目指す目標もまさに、「0年1カ月28日」のような、「今どれだけ経過したかがわかるようにしたい」

■私が書いたコード

Sub 実施の経過計算 ()

Dim Date1 as Date
Dim Date2 as Date

Date1 = Input("1回目の実施日を入力してください。yyyy/mm/dd形式")
Date2 = Input("2回目の実施日を入力してください。yyyy/mm/dd形式")

a = DateDiff("yyyy",Date1,Date2)
b = DateDiff("m",Date1,Date2)
C = DateDiff("d",Date1,Date2)

MsgBox a & "年" b & "カ月" & C & "日が経過しました"

End Sub

■伝えたいこと

VBAを学習して、まだ日が浅く、教材、ネットなどいろいろ拝見しても、
ヒントを得るてがかりが、見いだせずにいます。

間違いだらけだとは思いますが、ぜひみなさまに、ご教示いただきたく、
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

いろいろなロジックがあると思いますが、
下記のような考え方でどうでしょう。

まず、Date1からDate2までの経過月数を求める(Day(Date1) <= Day(Date2)の場合補正必要)。
Date1に経過月数を加算(DateAdd)する。
加算したDate1とDate2の経過日数を求める。これが日数。
経過月数を12で整数除算(\演算子)すると年数。
経過月数を12で除算した余り(Mod演算子)が月数。

vba

1Sub 実施の経過計算() 2 3 Dim Date1 As Date 4 Dim Date2 As Date 5 Dim m As Long, d As Long 6 7 Date1 = InputBox("1回目の実施日を入力してください。yyyy/mm/dd形式") 8 Date2 = InputBox("2回目の実施日を入力してください。yyyy/mm/dd形式") 9 10 m = DateDiff("m", Date1, Date2) + IIf(Day(Date1) <= Day(Date2), 0, -1) 11 12 Date1 = DateAdd("m", m, Date1) 13 d = DateDiff("d", Date1, Date2) 14 15 MsgBox (m \ 12) & "年" & (m Mod 12) & "カ月" & d & "日が経過しました" 16 17End Sub

投稿2021/12/14 00:46

hatena19

総合スコア34075

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

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

study.vba-22_o

2021/12/16 00:46

この度は、丁寧なご説明ありがとうございました。さきほどコードを打ってみたら、しっかり動きました。まさにほしかったのは、このご返事でした。よって、この度は、ベストアンサーに選ばさせていただきました。いろいろな考え方があるようで、今後の学習の参考にさせていただきます。ありがとうございました。
guest

0

a = DateDiff("yyyy",Date1,Date2)

b = DateDiff("m",Date1,Date2)
C = DateDiff("d",Date1,Date2)

は、「差は年単位で言うとどれだけですか?」「差は月単位で言うとどれだけですか?」「差は日単位で言うとどれだけですか?」という意味なので、その結果が正しいです。

お書きのような差を求めるなら、
日だけで引き算して日数を求める(必要があれば、月から繰り下がりして)。
月だけで引き算して月数を求め得る(日からの繰り下がりを考慮、必要があれば年から繰り下がり)。
年だけで引き算して年数を求める(月からの繰り下がりを考慮)。

「繰り下がり」はわかりますかね?

繰り下がりの例:
53 - 14 で、一の位同士を引き算しようとすると、3から4を引くとマイナスなので、十の位から10借りてきて、13から4を引いて9。十の位は 5 がさっき10貸したので 4 になってるので、そこから1を引いて3。

投稿2021/12/13 15:26

otn

総合スコア85901

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

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

study.vba-22_o

2021/12/16 00:43

ご返事が遅くなり、大変申し訳ありません。この度は、アドバイスをいただき、ありがとうございました。熟読し、一度試してみたいとおもいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問