電子書籍の厳選無料作品が豊富!

Excel VBA で入社日から今日迄の在籍日数を、年月日に分けて表示したいのですが上手くいきません。
DATEDIF関数で、年(yyyy)月(my)日(md)で求められますが
VBAでDateDiff関数で記述しますが、1ヶ月未満の月数、日数が抽出出来ません。

A 4 入社日 B1 今日の日付 
求めたい場所
B 4 在籍年数  C 4 月数(1年未満) D4日数(1ヶ月未満)

このように求めたいです。
ご教授をよろしくお願いします。

A 回答 (10件)

No4です。


>ご教授いただいた通りに記述しましたが、
>戻り値は、#VALUE! でした。
>A 4 2021/1/2. B1 =TODAY() B4 #VALUE!
こちらでは、正しく動作しています。なぜ、#VALUEになるかはわかりませんが、別の方法を提示します。

No7のかたが提示された、
https://ka-zublog.com/2017/08/08/excel-datedif/
のktDATEDIFを使用する方法です。


文字数オーバーの為、下記URLに提示しました。
https://ideone.com/akVk8F

実行結果は添付図の通りです。
「Excel VBA で入社日から今日迄の」の回答画像10
    • good
    • 1
この回答へのお礼

何度もご教授いただきありがとうございます。
素晴らしいです。求めていた結果が表示されました。
ありがとうございました。
私では一生掛けても解けませんでした。
大変感謝致します。

私もこれからも励んで頑張りたいと思います。

本当に皆様大変ご教授いただきありがとうございました。

お礼日時:2021/06/14 16:50

ああ、「〇年〇ヵ月〇日」という形で表示したいという事でしたか。


そうなると、ちょっと面倒ですね。

自分なら
 DatePart関数 
で「年」「月」「日」の数を値として引っ張り出して、
入社日と今日の日付で、それぞれ演算させます。
桁上げとか桁下げの考え方をしないと正しく結果を得られませんから注意しましょう。
ちょっと面倒ですよ。
(1か月は何日……なんて前提条件を用意しなきゃいけない)
    • good
    • 0

全ての場合を検証したわけではありませんが、No7さんのご指摘のうるう年の問題は、VBAのdatediff関数を使用する限り、少なくとも365では問題ないような気がします。


A4に入社日、B1に今日の日付があると仮定した場合の、365の環境で一応動作するサンプルは以下のようなものです。
他のバージョンではうるう年問題が発生するかも知れません。

Sub sample()
'Years of enrollment
Dim d1 As Long
Dim d2 As Long
Dim d3 As Long
Dim m1 As Long

Range("B1").Value = Date '本日の日付をシステムから取り込む場合。手入力ならコメントアウト。
d1 = Range("A4").Value
d2 = Range("B1").Value
m1 = DateDiff("m", d1, d2)
d3 = DateAdd("m", m1, d1)
If DateDiff("d", d3, d2) < 0 Then m1 = m1 - 1
d3 = DateAdd("m", m1, d1)
Range("B4").Value = Int(m1 / 12)
Range("C4").Value = m1 Mod 12
Range("D4").Value = DateDiff("d", d3, d2)
End Sub
    • good
    • 0
この回答へのお礼

ご教授ありがとうございます。
記述して実際やりましたが、求めている結果と違いました。

沢山の方々にご教授いただきありがとうございます。
VBAで運用するのは難しい事がよく理解出来ました。
組み立て方を今一度考えて作りたいと思います。

皆様大変ありがとうございました。

お礼日時:2021/06/14 12:58

あと問題なのは



https://ka-zublog.com/2017/08/08/excel-datedif/

うるう年の存在についてはどちらを用いても面倒かも。

先の
>DATEDIF関数については質問者さんは既にVBAで使われているのですよね?

は DateDiff でしたね。f が1個抜けてました。
    • good
    • 0

No5様


問題点を整理すると
VBAで提供されている関数:DateDiff
Excelで提供されている関数:DATEDIF
であり、両者の関数は関数名が異なります。(かつ機能も多少違っています)

今回の要件を解決するために使える関数は、excel提供のDATEDIFになります。(VBAのDateDiffを使った場合は、月数(0~11)、日数(0~30)を算出するために、かなりの労力が必要になります)

excel提供のDATEDIFを使用する場合、通常は
Application.WorksheetFunction.DATEDIF
とすれば良いのですが、残念ながら
WorksheetFunctionにDATEDIFは登録されていないので、
Application.WorksheetFunction.DATEDIFとすることはできません。
(エラーになります)

その為、対策案としては、
1案:VBAのDateDiffを使い、月数(0~11)、日数(0~30)を算出するために、かなりの労力を使う。
2案:Evaluate関数を使う。
があり、私は2案を提示させていただきました。
    • good
    • 0

No.2です。



DATEDIF関数については質問者さんは既にVBAで使われているのですよね?

http://officetanaka.net/excel/vba/function/DateD …

VBA向けに関数として存在しているので頭にあれこれは付けなくても良いのかもですが。
    • good
    • 0

VBAのサンプルです。


Public Sub 経過年月日設定()
Range("B4").Value = Application.Evaluate("DateDif(A4, B1, ""Y"")")
Range("C4").Value = Application.Evaluate("DateDif(A4, B1, ""YM"")")
Range("D4").Value = Application.Evaluate("DateDif(A4, B1, ""MD"")")
End Sub

worksheetfunctionではdatedifは使えないようです。
Evaluateで強引にdatedifを使ってみました。
evaluateについては下記URLを参照ください。
https://www.excel-chunchun.com/entry/excel-vba-e …
    • good
    • 0
この回答へのお礼

ありがとうございます。
参考ページまでありがとうございました。

ご教授いただいた通りに記述しましたが、
戻り値は、#VALUE! でした。

A 4 2021/1/2. B1 =TODAY() B4 #VALUE!

大変丁寧にご教授頂きましたがだめでした。
構文が間違っていないか確かめて、参考ページも確認して見ます。

出来の悪い私に引き続きご教授いただければ助かります。

お礼日時:2021/06/13 14:09

年数 DATEDIF(入社日,今日,"Y")


月数 DATEDIF(入社日,今日,"YM")
日数 DATEDIF(入社日,今日,"MD")
ではいかがでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます。
関数は理解出来ますが、セルに直接関数を入力しないで、コマンドボタンに VBAで記述したいと思っています。

開始日 A 4 今日 B 1 求める年数 B4 のセル

VBA記述
Range(“B4”)=Application.WorksheetFunction.DATEDIF(Range(“A4”),Range(“B1”),”Y”)

このように記述しますがエラーが起きてしまいます。
レベルが低くてすいません。
解決方法を引き続きご教授いただければ助かります。

お礼日時:2021/06/13 12:28

初級レベルなジジィですので間違っているかもですけど。



No.1様の方法では月と日はトータル数が得られるのではないでしょうか?
結果としては入社日から現在までのトータルでの年数・月数・日数になるのではないかと。

方法としては金種表に類似するのかなって思いましたが、そもそも月の中の日数って何を基にするのだろう?としわを寄せて考えて熱だしそうです。
1ヶ月の日数についての定義とは何なのかなぁと。

変に考えすぎてる愚かなジジィの戯言かもしれませんけどね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
入社日から今日までの在籍日数を求めたいと思っています。

入社日が2001/1/2 今日が2021/1/1の場合
19年11ヶ月30日と求めたいと思っています。

ご教授いただければ助かります。

お礼日時:2021/06/13 12:50

年 DateDiff("yyyy", "2021/01/01", "2021/06/13")


月 DateDiff("m", "2021/01/01", "2021/06/13")
日 DateDiff("d", "2021/01/01", "2021/06/13")

こんな感じで指定するだけなんだけど...。
    • good
    • 1
この回答へのお礼

早速ありがとうございます。
関数の記述は分かりました。ありがとうございます。説明不足かと思いますが、入社日から現在迄の年数と月数と日数に表示したいので、年数が1年に満たない場合は1を引いて、月数が12以上なら年に1を加算して日数も同じ様に、1を月に加算した表示の仕方が分かりません。引き続きご教授いただければ助かります。よろしくお願いします。

お礼日時:2021/06/13 10:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!