- 締切済み
VBAでユーザー定義関数作りにチャレンジしてます。
DATEDIF関数をなんとかユーザー定義関数に組み込んでみようと思い、VBAをはじめてみました。 標準モジュールでFunctionを使って書くところまでは何とかたどり着いたのですが、 DATEDIF自体の計算についてどうやって場合わけしていったらいいのか悩み始めてしまいました。 DATEDIF(開始日,終了日,単位)とした場合、 単位="D"もしくは"d"ならば、(開始日-終了日)/ 1 と、適当ではありながらも考えてみました。 そこからが問題で、月数、年数を数えるときに日付の違う月数をどうやって数えるのか、とか、うるう年の計算をどうしたらよいのかとか。。。 単にシリアル値を取り出して割るだけじゃだめですよね? 検索でユーザー定義関数についても、DATEDIF関数自体に関してもしてみたのですが、どうしても理解に苦しんでいます。 直接の答えでなくてもいいので、関連サイトや関連書籍でいいものがあったら教えてください。 本当は本は人に言われて買うものではないと思っているのですが、自分の踏み込んだことのない分野なのでちょっと手のつけようがなくて困っています。。。 どうかお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Nac
- ベストアンサー率63% (7/11)
補足ありがとうございます。 標準で用意されている関数をわざわざ自作して使用する ということにまだちょっと納得いかないんですけど、 この先オリジナルの関数を作成したいための勉強で作成されている と解釈しました。 とりあえず例です。 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 という具合に計算できます。 トライアンドエラーの繰り返しになると思いますけど、 失敗に負けないで頑張ってくださいね!
- Nac
- ベストアンサー率63% (7/11)
すみません、回答ではありません。 いくつか確認したいことがあります。 VBAを・・とありますが、これはACCESSのVBAですか?EXCELの?WORDの? 確かにEXCELにはDATEDIF関数があります。 知りたいのはこの関数のアルゴリズムですか? そうではなくてACCESSでEXCELのDATEDIF関数と同等のことがしたいということですか? というのであればDateDiff関数があります。 年、月、日だけでなく週、時間、分、秒の差もとれます。 見当違いのことを言ってるのであれば申し訳ないです。
補足
ごめんなさい。本当に初心者なもので、質問の仕方も心得ていませんでした。 EXCELのVBAで、ワークシート関数にユーザー定義関数としてDATEDIFを組み込んでみたいのです。 DATEDIF関数も普通に入力して使ってはいるので、使い方自体は理解してるのですが、自分で作るときにいったいどこから手をつければいいのか、場合わけに悩んでいます。 単位に入力された値によっては返す値を買えるということはIFで分けるわけですよね? それをどこからやっていくかで今とまっているところのです。 これで質問の内容がおわかりいただけたでしょうか? よかったら、またアドバイス下さい。
お礼
ありがとうございます! 確かに、もともと存在する関数なので、わざわざ作る必要もないのですけれど、 勉強しようと思ったきっかけがDATEDIF関数だったので、そこから始めてみることにしました。 いきなり難しいのに手をつけすぎかもしれませんが、やっていく中で 抑えなきゃいけない基本的なことももちろん勉強していくつもりなので、 また、何かあったらよろしくお願いします。 まずはいろいろやってみないとですね!!