DATEDIF関数をなんとかユーザー定義関数に組み込んでみようと思い、VBAをはじめてみました。
標準モジュールでFunctionを使って書くところまでは何とかたどり着いたのですが、
DATEDIF自体の計算についてどうやって場合わけしていったらいいのか悩み始めてしまいました。
DATEDIF(開始日,終了日,単位)とした場合、
単位="D"もしくは"d"ならば、(開始日-終了日)/ 1 と、適当ではありながらも考えてみました。
そこからが問題で、月数、年数を数えるときに日付の違う月数をどうやって数えるのか、とか、うるう年の計算をどうしたらよいのかとか。。。
単にシリアル値を取り出して割るだけじゃだめですよね?
検索でユーザー定義関数についても、DATEDIF関数自体に関してもしてみたのですが、どうしても理解に苦しんでいます。
直接の答えでなくてもいいので、関連サイトや関連書籍でいいものがあったら教えてください。
本当は本は人に言われて買うものではないと思っているのですが、自分の踏み込んだことのない分野なのでちょっと手のつけようがなくて困っています。。。
どうかお願いします。
No.1ベストアンサー
- 回答日時:
すみません、回答ではありません。
いくつか確認したいことがあります。
VBAを・・とありますが、これはACCESSのVBAですか?EXCELの?WORDの?
確かにEXCELにはDATEDIF関数があります。
知りたいのはこの関数のアルゴリズムですか?
そうではなくてACCESSでEXCELのDATEDIF関数と同等のことがしたいということですか?
というのであればDateDiff関数があります。
年、月、日だけでなく週、時間、分、秒の差もとれます。
見当違いのことを言ってるのであれば申し訳ないです。
この回答への補足
ごめんなさい。本当に初心者なもので、質問の仕方も心得ていませんでした。
EXCELのVBAで、ワークシート関数にユーザー定義関数としてDATEDIFを組み込んでみたいのです。
DATEDIF関数も普通に入力して使ってはいるので、使い方自体は理解してるのですが、自分で作るときにいったいどこから手をつければいいのか、場合わけに悩んでいます。
単位に入力された値によっては返す値を買えるということはIFで分けるわけですよね?
それをどこからやっていくかで今とまっているところのです。
これで質問の内容がおわかりいただけたでしょうか?
よかったら、またアドバイス下さい。
No.2
- 回答日時:
補足ありがとうございます。
標準で用意されている関数をわざわざ自作して使用する
ということにまだちょっと納得いかないんですけど、
この先オリジナルの関数を作成したいための勉強で作成されている
と解釈しました。
とりあえず例です。
Function datedif2(dt1 As Date, dt2 As Date, tp As String)
'2つの日付の差を求める関数 datedif2(日付1,日付2,記号)
'記号の説明
' "d":日差を求めます
' "m":月差を求めます
' "y":年差を求めます
'変数の宣言
Dim tp_cv As String
Dim dt1_cv As Long
Dim dt2_cv As Long
'引数の変換
tp_cv = StrConv(tp, vbLowerCase) '記号を小文字に変換
dt1_cv = CLng(dt1) '日付1のシリアル値
dt2_cv = CLng(dt2) '日付2のシリアル値
'計算処理
Select Case tp_cv '記号によって処理分岐
Case "d" '日差の場合
datedif2 = tm2_cv - tm1_cv 'シリアル値の差をだして日数を計算
Case "m" '月差の場合
... '省略
Case "y" '年差の場合
... '省略
Case Else 'エラー処理
datedif2 = Null
End Select
End Function
*各関数などの詳細はHELPを参照してください。
HELPは読みにくいかもしれませんが、関連を追ってじっくり読みこみ、
使用例を参考にして理解していくと非常に強力な武器になります。
条件が多岐にわたる場合はIF文よりもSELECT CASEを使う方がすっきりします。
月差と年差に関しては単純に2000/12/31と2001/01/01の差が
1年または1月と計算してもよいのならばFormat関数などで
年と月を分離してそれぞれ計算すればいいかと思います。
上記の例で年差を出すなら2001-2000、
月差を出すなら(2001-2000)*12+1-12
という具合に計算できます。
トライアンドエラーの繰り返しになると思いますけど、
失敗に負けないで頑張ってくださいね!
ありがとうございます!
確かに、もともと存在する関数なので、わざわざ作る必要もないのですけれど、
勉強しようと思ったきっかけがDATEDIF関数だったので、そこから始めてみることにしました。
いきなり難しいのに手をつけすぎかもしれませんが、やっていく中で
抑えなきゃいけない基本的なことももちろん勉強していくつもりなので、
また、何かあったらよろしくお願いします。
まずはいろいろやってみないとですね!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- Excel(エクセル) Excelで、昭和の西暦換算 6 2023/03/23 11:29
- 大学・短大 大学 留年について 6 2023/06/21 20:17
- Excel(エクセル) Application.Volatile利用(excel2003) 1 2023/02/06 10:11
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
- Excel(エクセル) エクセルで2度にわたる休職期間を除いた勤務年数を算出したいです。 3 2022/05/11 14:11
- Excel(エクセル) ユーザー関数の自動計算(excel2003) 1 2023/02/06 06:46
- 国家公務員・地方公務員 公務員試験の数的処理で苦戦しています。 1 2023/01/30 08:56
- Excel(エクセル) Excelの関数 5 2023/07/07 05:26
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vb6.0で三角関数が使えない
-
変化させるセルが変化しない
-
やってみてもわからないので教...
-
C# 計算処理中に実行中ウィン...
-
MATLABの積分について
-
C言語で、漸化式を使ってパスカ...
-
スライムがつぶれていく様子を...
-
絶対ち
-
VBAの再計算が反映されない件に...
-
JavaScriptでSQLiteの値を使いたい
-
Excel VBAの残業時間の合計計算...
-
VBでReplace
-
Java 電卓の連続計算
-
あのコンピュータアーキテクチ...
-
60進数の四則計算
-
バッチファイルでウインドウを...
-
スパイダソリティアの問題
-
MathematicaのNDSolveで連立常...
-
65536は2の何乗なのでしょうか?
-
素数を自動的に作る
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
C言語の課題で、1年の秒数を計...
-
バッチファイルでウインドウを...
-
骨折リスク評価のFRAXについて...
-
変化させるセルが変化しない
-
CとFORTRANの計算速度はどちら...
-
なぜオーバーフローになるので...
-
数値計算の高速化 (cos, sin, exp)
-
モジュラス103の計算とは何でし...
-
C# 計算処理中に実行中ウィン...
-
モジュロ
-
引き放し法による除算アルゴリ...
-
60進数の四則計算
-
C言語についてです。 再帰を使...
-
Perlで時間の計算
-
CRC8を教えてください
-
傾いた四角形内の範囲の条件式
おすすめ情報