Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


13419 / 13644 ツリー ←次へ | 前へ→

【5444】DateDiff が どうしてもできない 123 03/5/14(水) 12:37 質問
【5445】Re:DateDiff が どうしてもできない Taka-mk2 03/5/14(水) 12:48 発言
【5446】Re:DateDiff が どうしてもできない 123 03/5/14(水) 13:43 質問
【5447】Re:DateDiff が どうしてもできない Taka-mk2 03/5/14(水) 14:40 回答
【5448】追記! Taka-mk2 03/5/14(水) 14:41 回答
【5467】Re:DateDiff が どうしてもできない 123 03/5/15(木) 11:10 質問
【5478】Re:DateDiff が どうしてもできない Taka-mk2 03/5/15(木) 13:19 回答
【5483】Re:DateDiff が どうしてもできない JuJu 03/5/15(木) 15:11 回答
【5490】Re:DateDiff が どうしてもできない りん 03/5/15(木) 17:09 回答
【5512】これで ひとつ 仕事が終わりました。 123 03/5/16(金) 17:51 お礼

【5444】DateDiff が どうしてもできない
質問  123  - 03/5/14(水) 12:37 -

引用なし
パスワード
   みなさま こんにちは
またまた 困っています。

DateDiffがどうしてもエラーになってしまいます。

シート上にある 文字列の日付と
TextBoxに入力した日付の差(年)を出したいのです。

以下はサンプル的に書きましたが、全然だめです。
どなたか お助けください。

Sub Test()

Dim tdate as Variant
Dim ddate as Variant

tdate = TextBox1.Value

For i = 1 to 10
ddate = Cells(i,1).Value

Cells(i,2).Value = DateDiff("yyyy",tdate,ddate)

Next i

End Sub

【5445】Re:DateDiff が どうしてもできない
発言  Taka-mk2  - 03/5/14(水) 12:48 -

引用なし
パスワード
   こんにちは!
天気が下り坂の東京から!

サンプルコード、実行させていただきました。
が、私の方ではエラーなく動きました。
サンプルコード、定義エラーがいくつかありましたが、そこを修正(iの宣言やTextBoxの定義ですね)すると、問題なく動きました。

ちなみにどのようなエラーが起きたのでしょうか?
どんなエラーが起きたのかわかれば、原因もわかりやすいかと存じます。

というわけで、よろしくですー。

【5446】Re:DateDiff が どうしてもできない
質問  123  - 03/5/14(水) 13:43 -

引用なし
パスワード
   ▼Taka-mk2 さんこんにちは!

>が、私の方ではエラーなく動きました。
あれ〜

>サンプルコード、定義エラーがいくつかありましたが、そこを修正(iの宣言やTextBoxの定義ですね)すると、問題なく動きました。
>
>ちなみにどのようなエラーが起きたのでしょうか?
>どんなエラーが起きたのかわかれば、原因もわかりやすいかと存じます。
>
>というわけで、よろしくですー。

ちなみに以下のコードです。(UserForm1にて)
(だいぶ簡略化して書いてますが、同様にエラーになってしまいます)


Dim tdate As Variant
Dim ddate As Variant

Private Sub CommandButton1_Click()

tdate = TextBox1.Value

For i = 1 To 10
ddate = Cells(i, 1).Value

Cells(i, 2).Value = DateDiff("yyyy", tdate, ddate)

Next i

End Sub


Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

TextBox1.Value = Format(TextBox1.Value, "gee.mm.dd")
tdate = TextBox1.Value

End Sub

【5447】Re:DateDiff が どうしてもできない
回答  Taka-mk2  - 03/5/14(水) 14:40 -

引用なし
パスワード
   ▼123 さん:
新緑の季節の昼下がり。
まだまだお昼の東京から。

問題は、以下の部分。

>TextBox1.Value = Format(TextBox1.Value, "gee.mm.dd")
>tdate = TextBox1.Value

ここでテキストボックスの日付表示をgee.mm.dd形式に変更していますよね。
この形式の文字列を、VBAは日付型として認識しません。
IsDate関数を使用して調べてみると、Falseが返ってきます。
DateDiff関数は日付型の変数を扱うので、日付型ではないgee.mm.dd(おそらくString型として扱われている)が引数になると、「型が一致しません」というエラーが出ますよね。
これが原因です。

なので、
>TextBox1.Value = Format(TextBox1.Value, "gee.mm.dd")
この部分をなくして、yyyy/mm/dd形式などで入力してもらうようにするのがベストかと思います。

もしくは、以下のように

Dim tdate As Variant
Dim ddate As Variant

Private Sub CommandButton1_Click()

For i = 1 To 10
ddate = Cells(i, 1).Value

Cells(i, 2).Value = DateDiff("yyyy", tdate, ddate)

Next i

End Sub


Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

tdate = TextBox1.Value
TextBox1.Value = Format(TextBox1.Value, "gee.mm.dd")

End Sub

このようにして、変換する前にテキストボックスの日付型をGetしてしまえば、問題はないと思われます(こっちはテストしてません^^;)。

以上、ご参考になれば!
それでは!

【5448】追記!
回答  Taka-mk2  - 03/5/14(水) 14:41 -

引用なし
パスワード
   あと、シート側の入力も日付型になっているか確認してくださいね!

以上ですッ。

【5467】Re:DateDiff が どうしてもできない
質問  123  - 03/5/15(木) 11:10 -

引用なし
パスワード
   ▼Taka-mk2 さん こんにちは。

ありがとうございました。解決です。

しかしながら、DateDiffで求められる「年の差」は
年のところしかみないようで、
「2001/12/1」と「2002/1/1」の差は、「1」となってしまいます。
(「0」となって欲しいのですが...)
つまり、2001と2002を比べているようなのです。

これって どうしょうようもないのでしょうか?

【5478】Re:DateDiff が どうしてもできない
回答  Taka-mk2  - 03/5/15(木) 13:19 -

引用なし
パスワード
   ▼123 さん:
>▼Taka-mk2 さん こんにちは。
>
>ありがとうございました。解決です。
>
>しかしながら、DateDiffで求められる「年の差」は
>年のところしかみないようで、
>「2001/12/1」と「2002/1/1」の差は、「1」となってしまいます。
>(「0」となって欲しいのですが...)
>つまり、2001と2002を比べているようなのです。
>
>これって どうしょうようもないのでしょうか?

↑ですが、以下ではまずいですか?

WorksheetFunction.Round((DateDiff("d", tdate, ddate) / 365), 0)

DateDiffの計算単位を日付に変えて、365で割り、それを小数点以下第1位で四捨五入しているだけですが(笑)。
これで一応、求められているものに近いものになっていると思います。

ただし、この計算方法は閏年を考慮していません。
よって、年月の差が大きくなればなるほど、誤差が出ます。
閏年を考慮するとなると、ちょっとややこしくなるかなぁ。

以上、ご参考になれば。
ではではぁ♪

【5483】Re:DateDiff が どうしてもできない
回答  JuJu E-MAIL  - 03/5/15(木) 15:11 -

引用なし
パスワード
   123さん、Taka-mk2さん、こんにちはぁ

>しかしながら、DateDiffで求められる「年の差」は
>年のところしかみないようで、

その方が便利なこともありますけど、この場合は不便なのかな。

>「2001/12/1」と「2002/1/1」の差は、「1」となってしまいます。
>(「0」となって欲しいのですが...)

こうするか、
 = DateDiff("yyyy", tdate, ddate) - IIf(DateAdd("yyyy", DateDiff("yyyy", tdate, ddate), tdate) > CDate(ddate), 1, 0)
年を無視してこうするとか、
 = DateDiff("yyyy", tdate, ddate) - IIf(DateSerial(0, Month(tdate), Day(tdate)) > DateSerial(0, Month(ddate), Day(ddate)), 1, 0)
好みの問題かな^^;

ではではぁ

【5490】Re:DateDiff が どうしてもできない
回答  りん E-MAIL  - 03/5/15(木) 17:09 -

引用なし
パスワード
   JuJu さん、123さん、Taka-mk2さん、こんばんわ。

>>「2001/12/1」と「2002/1/1」の差は、「1」となってしまいます。
>>(「0」となって欲しいのですが...)

12ヶ月経過しないと1年とみなさないのなら。

Sub test()
  tdate = DateSerial(2002, 12, 1)
  ddate = DateSerial(2004, 1, 1)
  MsgBox " 経過年 : " & ((DateDiff("m", tdate, ddate) - 1) \ 12), _
      vbInformation, "これでどう?"
End Sub

こんな感じです。

【5512】これで ひとつ 仕事が終わりました。
お礼  123  - 03/5/16(金) 17:51 -

引用なし
パスワード
   ▼りん さん、JuJu さん、Taka-mk2さん、こんばんわ。

みなさん ありがとうございました。
やはり 一工夫しなければできないものだったんですね。

大変助かりました。

これで ひとつ 仕事が終わりました。
本当にありがとうございました。

13419 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free