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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
継承元と継承先での変数
-
VBA 九九 Do While
-
ExcelのマクロVBA動作を軽くす...
-
matlabで計算終了
-
VBAの再計算が反映されない件に...
-
タクシー料金の問題です
-
VBでReplace
-
60進数の四則計算
-
0xf0=256?
-
EXCELなどで「返す」という表現
-
切り上げたい
-
傾いた四角形内の範囲の条件式
-
エクセルで特定のセルのみを任...
-
三菱シーケンサー works2 の日...
-
アドオン利率を実質年率に変換
-
BASICでモンテカルロ法
-
VB6.0でのバイナリデータの扱い...
-
fortran dlog2
-
排他的論理和 BCC(水平パリテ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
排他的論理和 BCC(水平パリテ...
-
VBAの再計算が反映されない件に...
-
バッチファイルでウインドウを...
-
変化させるセルが変化しない
-
EXCELなどで「返す」という表現
-
傾いた四角形内の範囲の条件式
-
エクセルで特定のセルのみを任...
-
CとFORTRANの計算速度はどちら...
-
Visual C++でdebugとreleaseで...
-
モジュラス103の計算とは何でし...
-
なぜオーバーフローになるので...
-
VB6で正確なミリ秒を計測したい...
-
VBでReplace
-
引き放し法による除算アルゴリ...
-
matlabで計算終了
-
CRC8を教えてください
-
VBAで関数をつくる
-
Excel VBAの残業時間の合計計算...
-
等高線を計算したい
おすすめ情報