• ベストアンサー

VBAでの年齢計算がうまくいきません。

失礼いたします。  VBAで年齢の計算を行いたいのですがなかなかうまくいきません。 =sub Dim 開始日付 As String Dim 終了日付 As String Dim 年齢 As String 開始日付 = "S54/4/1" 終了日付 = "H22/4/1" 年齢 = "=DATEDIF(開始日付,終了日付,""Y"")" =endsub としても、DATEDIF関数は引数をうまく処理してくれないのです。 エクセル関数を使わずに、年齢を算出するか。 エクセル関数内に引数を代入する方法があれば教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kybo
  • ベストアンサー率53% (349/647)
回答No.3

そういう場合は、Evaluateを使います。 Sub macro() Dim 開始日付 As Date Dim 終了日付 As Date Dim 年齢 As String 開始日付 = "S54/4/1" 終了日付 = "H22/4/1" 年齢 = Application.Evaluate("=datedif(""" & Format(開始日付, "yyyy/mm/dd") _   & """,""" & Format(終了日付, "yyyy/mm/dd") & """,""y"")") MsgBox 年齢 End Sub

kulokunier
質問者

お礼

おお、ありがとうございます。 提示された式の意味はまったくわかりませんが^^; 問題は解決いたしました。

その他の回答 (2)

  • kybo
  • ベストアンサー率53% (349/647)
回答No.2

VBAのは「DateDif」ではなく、「DateDiff」と記述します。 VBAのDateDiff関数のヘルプを見ておいて下さい。 Sub macro() Dim 開始日付 As Date Dim 終了日付 As Date Dim 年齢 As String 開始日付 = "S54/4/1" 終了日付 = "H22/4/1" 年齢 = DateDiff("yyyy", 開始日付, 終了日付) MsgBox 年齢 End Sub

kulokunier
質問者

お礼

datediffを使用すると、アクセスのdatediffのように数え年の扱いになるようです。 たとえば、 開始日付="2008/12/31"  終了日付="2009/1/1" とすると 年齢 = DateDiff("yyyy", 開始日付, 終了日付) この場合、年齢が1歳になります。 なのでdatediffは使いたくないのですが・・・

  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

質問のコードでは、開始、終了日付が文字列のままなので、 DateValueで、日付シリアルに直してから計算する それと、Dateiffの引数の使い方も間違い。 また、年齢は数値ですから、  >Dim 年齢 As String この宣言もIntegerなどに変えるべきです。 年齢 = DateDiff("yyyy", DateValue(開始日付), DateValue(終了日付))   以上です。    

kulokunier
質問者

お礼

勉強になりましたありがとうございます。

kulokunier
質問者

補足

とおもいましたが、上記の問題が発生しました、どうしたものか・・

関連するQ&A

  • エクセルVBA、年齢計算について質問です

    失礼いたします、生年月日、基準日をテキストボックスに入力し、年齢を算出するマクロを作成してるのですが質問です。 以下のようなマクロを組んでいるのですが。 Dim 生年月日 As String Dim 開始日付 As String Dim 年齢 As String 生年月日 = "H" + UserForm1.TextBox1.Value + "/" + UserForm1.TextBox2.Value + "/" + UserForm1.TextBox3.Value 年齢基準日 = "H" + UserForm4.TextBox1.Value + "/" + UserForm1.TextBox5.Value + "/" + UserForm1.TextBox6.Value 年齢 = Application.Evaluate("=datedif(""" & Format(生年月日, "yyyy/mm/dd") _ & """,""" & Format(年齢基準日, "yyyy/mm/dd") & """,""y"")") 上記のようにそれぞれH”年”/”月”/”日”という形で取得しています。 この場合、適正な値が入力されると上手くいきますが、日付として成立しない値(例えば月に80など)を入力した場合にエラーが発生します。 エラーが発生した場合にエラー処理(例としてMsgBox+Goto処理)をしたいのですがどのようなコードを記入すればいいでしょうか?

  • VBA での日付の計算

    お世話になってます。 Access VBA 初心者です。 string型変数に日付(YYYYMMDD)がセットされています。 その日付に1日プラスした日付を算出したいのですが、 どうすればよいのかよく分かりません。 たとえば Dim w_Date As String w_Date = "20070726" としたならば、 w_Dateは"20070727"となるようにしたいのですが。。。 よろしくお願いいたします。

  • エクセルの年齢計算ができない(VBA)

    VBAでエクセル関数のDATEDIF関数を入力したいのですがうまくいきません。なにかいい方法はありませんか? 例)年齢基準値セルA1、終了期間B1でC1で年齢計算 Private Sub CommandButton1_Click() Range("C1").Value = "=DATEDIF(A1,B1,"y")" End Sub この記述でうまくいきません。 ようは、コマンドボタンクリックで、C1にDATEIF関数を入力したいのですが・・・

  • VBAでユーザー定義関数作りにチャレンジしてます。

    DATEDIF関数をなんとかユーザー定義関数に組み込んでみようと思い、VBAをはじめてみました。 標準モジュールでFunctionを使って書くところまでは何とかたどり着いたのですが、 DATEDIF自体の計算についてどうやって場合わけしていったらいいのか悩み始めてしまいました。 DATEDIF(開始日,終了日,単位)とした場合、 単位="D"もしくは"d"ならば、(開始日-終了日)/ 1 と、適当ではありながらも考えてみました。 そこからが問題で、月数、年数を数えるときに日付の違う月数をどうやって数えるのか、とか、うるう年の計算をどうしたらよいのかとか。。。 単にシリアル値を取り出して割るだけじゃだめですよね? 検索でユーザー定義関数についても、DATEDIF関数自体に関してもしてみたのですが、どうしても理解に苦しんでいます。 直接の答えでなくてもいいので、関連サイトや関連書籍でいいものがあったら教えてください。 本当は本は人に言われて買うものではないと思っているのですが、自分の踏み込んだことのない分野なのでちょっと手のつけようがなくて困っています。。。 どうかお願いします。

  • VBAのプログラムとシートでの計算の速度

     現在、エクセルVBAでマクロを組んでいます。 マクロで算出した値を、セルを指定して、シートに代入しています。シートの代入する理由は、途中の計算結果の確認とエクセル関数を利用し、マクロの簡便化を図りたいためです。  代入した値を基にして、エクセル関数を使った結果の値を、他のセルに表示(代入)していますが、VBAで、その結果の値を、利用しています。  お聞きしたいのは、最初にシートに代入してから、エクセル関数の結果を得られる前に、VBAが、値を取得しないかどうか心配です。  素人考えでは、同じエクセル上で動作しているので、エクセル関数の計算終了後に、VBAが動くと思いますが。どうでしょうか?

  • VBAにて計算式をセルへ代入できなくて困っています

    計算式を変数QRdataへ代入し その変数から指定のセルへ入力するとき、実行時エラー1004となってしまい マクロを実行できずに困っています。 Cells(3, 6).ValueもRange("F3").Fourmulaと変えたりしたのですが解決方法が解らなく どうか御教授下さい。 Dim コードナンバー As String Dim 品名1行 As String Dim QRdata As String QRdata = "=("& Chr(34) & コードナンバー & 品名1行 & Chr(34) & ",1)" Cells(3, 6).Value = QRdata  ←ここでエラーとなってしまいます。

  • エクセルVBAでの時間計算方法

    エクセル2000のVBAで時間の計算をしていますが、0:00を超えたデータの計算がうまくいきません. 例えば dim a as date 開始時間 dim b as date 終了時間 dim xas date 使用時間 x = b - a 例えば 終了時間(25:10:00)ー開始時間(23:15:00)の場合,終了時間が1:10:00になっているようなのですが、24:00以降セットする方法はありますか? 他にVBAを使用してなにか簡単な方法がありますか?

  • Excel2000で年齢計算したいのですが

    WindowsMeでExcel2000を使用しているものです。基準日と生年月日を入れると満年齢が自動計算されるようにしたいのですが、うまくDATEDIF関数が入力できず困っています。どなたかわかりやすく教えて頂けませんか?

  • vc++のAPI(dll)の引数をVBAでうけとる

    Excelで開発しなければならない事情があり、 vc++のAPIが持っている関数を ExcelVBAでコールしておりますが、エラー1041でExcelが強制終了してしまいます。 VBAからVisual C++にchar*型で渡し、ByRef String型でVBAにて受け取ります。 VCの関数の第四引数「char* 型/attribute_value」をVBAの「String 型/sValue」で受け取る際にエラーになっているようです。 VBAでcharに相当する変数型がないためと思われますが、何かよいアイデアがありましたらご教授願います。 --VC-- XDW_GetDocumentAttributeByName(h, attribute_name, &attribute_type, attribute_value, size, NULL); --VBA-- <宣言部> Public Declare Function XDW_GetDocumentAttributeByName Lib "C:\Users\○○○\Desktop\dwsdk710jpn\XDWAPI\DLL\xdwapi.dll" (ByVal lnghandle As Long, ByVal sName As String, ByRef lngType As Long, ByRef sValue As String, ByVal lngSize As Long, ByVal reserved As String) As Long <呼び出し部> Dim lngHandle As Long Dim sName as String Dim lngType As Long Dim sValue As String Dim lngSize as Long Dim tmpSize as Long lngSize = 0 sName = "keiyaku" tmpSize = XDW_GetDocumentAttributeByName(lngHandle, sName, sType, sValue, lngSize, vbNullString) XDW_GetDocumentAttributeByName lngHandle, sName, sType, vbNullString, tmpSize, vbNullString degug.print sValue

  • EXCELで年令計算するDATEDIF関数

    EXCELで年令計算する関数DATEDIFを使って、生年月日の記入をすると年令を表示しますが、 記入がないと 111才 になってしまいます。生年月日の記入がないときには 0才 にしたいのですが、わかりません。   たとえば、生年月日のセルを         B12         基準日(関数TODAY()を使用 )を E3         年令表示セルを           B11 にして、セルB11に次の関数を入力します。     =DATEDIF(B12,E3,"Y") & "才" すると、生年月日がセルB12に入っていれば、年令を表示しますが、生年月日の記入がない(空欄)と111才と表示されてしまいます。空欄では0才などにしたいのですが、ご教示をお願いします。 セルの西暦・和暦やTODAY関数が影響するのかわかりません。

専門家に質問してみよう