アプリ版:「スタンプのみでお礼する」機能のリリースについて

ExcelVBA初心者です。
下記プログラムを組んでいるのですがMyDateの戻り値が常に -1された数字になってしまいます。

たとえば、25を入力したら24になる。これはなぜなのでしょうか?
また、0だと30になってしまいます。

Sub hani()
Dim MyDate As Date

MyDate = Application.InputBox("報告する日を入力してください", "報告日", Format(Now, "dd"))

If Format(MyDate, "dd") > 0 And Format(MyDate, "dd") > 32 Then
MsgBox Format(MyDate, "dd")
MsgBox "範囲内"
Else
MsgBox Format(MyDate, "dd")
MsgBox "範囲外"
End If

End Sub

A 回答 (3件)

Excel関数の日付型シリアル値では0=1900/01/00ですが、VBAのDATE型では 0=1899/12/30 になります。


したがって、

00=1899/12/30
01=1899/12/31
02=1900/01/01
03=1900/01/02
:
25=1900/01/24

と、なります。このDATE型変数の日付部分だけを取り出しているので、25と入力すると24が返って来る事になりますし、00を入力すると30が返ってきます。
なぜ、起点日が1899/12/30なのかは知りませんが、Excel VBAだけでなく、Accessも同様だったはずです。
    • good
    • 0

計算ミスって勘違いした。

#1は無視してください。
    • good
    • 0

Application.InputBox関数の戻り値がVariant/String "26"になって,


これは数値として解釈できるからVariant/Long 26になって
このVariant/Longに対応するDate型の値が変数MyDateに格納されます。
つまり,シリアル値の考えから行くと,
http://www3.tokai.or.jp/excel/kansu/hiduke.htm
MyDateは1900/01/25です。1900/01/25に対して,
日を表示するので25になります。0を入力したときに30になる理由はわかりません

Sub hani()
MsgBox (CDate(26))
End Sub

とか

Option Explicit

Sub hani()
Dim i As Integer
'エラーにならない。Integerは整数だったはずで,
'3.1がそのまま代入できるわけじゃないから
'何らかの変換をして代入するはずだ。
'実際Msgbox関数で表示されたのは3.1じゃなかった。
i = 3.1
MsgBox (i)
End Sub

の結果を予測してみるといいかもしれませんね。
#VB.NET以降ではOption Strict Onをつけることで回避できるような仕組みがあったかと思いますが,VB6/VBAにはないでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!