
Excel VBA で入社日から今日迄の在籍日数を、年月日に分けて表示したいのですが上手くいきません。
DATEDIF関数で、年(yyyy)月(my)日(md)で求められますが
VBAでDateDiff関数で記述しますが、1ヶ月未満の月数、日数が抽出出来ません。
A 4 入社日 B1 今日の日付
求めたい場所
B 4 在籍年数 C 4 月数(1年未満) D4日数(1ヶ月未満)
このように求めたいです。
ご教授をよろしくお願いします。
No.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
実行結果は添付図の通りです。

何度もご教授いただきありがとうございます。
素晴らしいです。求めていた結果が表示されました。
ありがとうございました。
私では一生掛けても解けませんでした。
大変感謝致します。
私もこれからも励んで頑張りたいと思います。
本当に皆様大変ご教授いただきありがとうございました。
No.9
- 回答日時:
ああ、「〇年〇ヵ月〇日」という形で表示したいという事でしたか。
そうなると、ちょっと面倒ですね。
自分なら
DatePart関数
で「年」「月」「日」の数を値として引っ張り出して、
入社日と今日の日付で、それぞれ演算させます。
桁上げとか桁下げの考え方をしないと正しく結果を得られませんから注意しましょう。
ちょっと面倒ですよ。
(1か月は何日……なんて前提条件を用意しなきゃいけない)
No.8
- 回答日時:
全ての場合を検証したわけではありませんが、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
ご教授ありがとうございます。
記述して実際やりましたが、求めている結果と違いました。
沢山の方々にご教授いただきありがとうございます。
VBAで運用するのは難しい事がよく理解出来ました。
組み立て方を今一度考えて作りたいと思います。
皆様大変ありがとうございました。
No.7
- 回答日時:
あと問題なのは
https://ka-zublog.com/2017/08/08/excel-datedif/
うるう年の存在についてはどちらを用いても面倒かも。
先の
>DATEDIF関数については質問者さんは既にVBAで使われているのですよね?
は DateDiff でしたね。f が1個抜けてました。
No.6
- 回答日時:
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案を提示させていただきました。
No.5
- 回答日時:
No.2です。
DATEDIF関数については質問者さんは既にVBAで使われているのですよね?
http://officetanaka.net/excel/vba/function/DateD …
VBA向けに関数として存在しているので頭にあれこれは付けなくても良いのかもですが。
No.4
- 回答日時:
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 …
ありがとうございます。
参考ページまでありがとうございました。
ご教授いただいた通りに記述しましたが、
戻り値は、#VALUE! でした。
A 4 2021/1/2. B1 =TODAY() B4 #VALUE!
大変丁寧にご教授頂きましたがだめでした。
構文が間違っていないか確かめて、参考ページも確認して見ます。
出来の悪い私に引き続きご教授いただければ助かります。
No.3
- 回答日時:
年数 DATEDIF(入社日,今日,"Y")
月数 DATEDIF(入社日,今日,"YM")
日数 DATEDIF(入社日,今日,"MD")
ではいかがでしょうか。
ありがとうございます。
関数は理解出来ますが、セルに直接関数を入力しないで、コマンドボタンに VBAで記述したいと思っています。
開始日 A 4 今日 B 1 求める年数 B4 のセル
VBA記述
Range(“B4”)=Application.WorksheetFunction.DATEDIF(Range(“A4”),Range(“B1”),”Y”)
このように記述しますがエラーが起きてしまいます。
レベルが低くてすいません。
解決方法を引き続きご教授いただければ助かります。
No.2
- 回答日時:
初級レベルなジジィですので間違っているかもですけど。
No.1様の方法では月と日はトータル数が得られるのではないでしょうか?
結果としては入社日から現在までのトータルでの年数・月数・日数になるのではないかと。
方法としては金種表に類似するのかなって思いましたが、そもそも月の中の日数って何を基にするのだろう?としわを寄せて考えて熱だしそうです。
1ヶ月の日数についての定義とは何なのかなぁと。
変に考えすぎてる愚かなジジィの戯言かもしれませんけどね。
ありがとうございます。
入社日から今日までの在籍日数を求めたいと思っています。
入社日が2001/1/2 今日が2021/1/1の場合
19年11ヶ月30日と求めたいと思っています。
ご教授いただければ助かります。
No.1
- 回答日時:
年 DateDiff("yyyy", "2021/01/01", "2021/06/13")
月 DateDiff("m", "2021/01/01", "2021/06/13")
日 DateDiff("d", "2021/01/01", "2021/06/13")
こんな感じで指定するだけなんだけど...。
早速ありがとうございます。
関数の記述は分かりました。ありがとうございます。説明不足かと思いますが、入社日から現在迄の年数と月数と日数に表示したいので、年数が1年に満たない場合は1を引いて、月数が12以上なら年に1を加算して日数も同じ様に、1を月に加算した表示の仕方が分かりません。引き続きご教授いただければ助かります。よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel2019のデータ入力に便利な関数について 4 2023/07/06 05:42
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/01/10 09:15
- Excel(エクセル) Excelの関数 5 2023/07/07 05:26
- その他(Microsoft Office) Excel2019と365、2021 2 2023/07/08 06:22
- Excel(エクセル) Excel2019、2021の売り上げなどの集計表について 4 2022/11/29 14:03
- Excel(エクセル) Excelで、昭和の西暦換算 6 2023/03/23 11:29
- Excel(エクセル) 至急です><Excelの関数を教えてください。 2 2022/03/22 17:56
- その他(データベース) Accessフォームにて指定のフィールドの平均値を小数点第一位で表示できない 2 2022/08/30 17:19
- Excel(エクセル) Excelへのデータ入力作業 4 2023/07/01 18:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
完全一致の検索
-
DataGridViewでyyyy/MM/dd
-
コンボボックスに日付を表示する
-
ノートパソコン タスクバー 日付。
-
該当の日付以外を消去するプロ...
-
ユーザーフォームのラベルに日...
-
VB.net 登録されている日付の連...
-
JSPからYYYYMMDDで日付入力する
-
【VBA】土日をスキップして日付...
-
Eclipseの対応する括弧の強調表...
-
1970年1月1日からの現在時間...
-
エクセルのVBAで日付を検索し転...
-
日別集計(その2)
-
システム日付とは?
-
「eclipseで作るカレンダー(ス...
-
ExcelVBAでSQLサーバの日付時刻...
-
3人のじゃんけんのプログラム
-
ミリ秒の取得の仕方について
-
EXCEL VBA マクロ 日付
-
VB6.0 のformat関数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Eclipseの対応する括弧の強調表...
-
人をはめた人は 自分に返ってく...
-
DataGridViewでyyyy/MM/dd
-
エクセルのVBAで日付を検索し転...
-
ユーザーフォームのラベルに日...
-
VisualBasic6.0のFormat関数で...
-
コンボボックスに日付を表示する
-
テキストボックスにカレンダー...
-
1本あたり○円と表示する時どの...
-
指定した日付が、その月の第何...
-
VBAで当月の1日を表示するには...
-
VBA 日付・時刻の判別 時刻を認...
-
今日より前の書き方 マクロ
-
テキストボックスに今日の日付...
-
システム日付とは?
-
DateTimePickerを西暦表示にす...
-
JSPからYYYYMMDDで日付入力する
-
C++で日付判定を行いたい!!
-
ExcelVBAでSQLサーバの日付時刻...
-
VBでDate型の大小比較がうまく...
おすすめ情報