• 締切済み

VBA dateの戻り値

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

みんなの回答

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.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も同様だったはずです。

回答No.2

計算ミスって勘違いした。#1は無視してください。

回答No.1

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にはないでしょう。

関連するQ&A

  • エクセルVBA Inputboxについて教えてください。

    InputBoxの使い方について教えてください。 テストで下記のように書いてみました。 Sub input_test2() ans = InputBox("質問!適当に数字を入れてね") MsgBox Application.WorksheetFunction.IsNumber(ans), vbInformation, "入力判定" If Application.WorksheetFunction.IsNumber(ans) Then If ans = 0 Then MsgBox "入力されたのは、 0", vbInformation, "回答" If ans = 1 Then MsgBox "入力されたのは、 1", vbInformation, "回答" If ans = 2 Then MsgBox "入力されたのは、 2", vbInformation, "回答" If ans = 3 Then MsgBox "入力されたのは、 3", vbInformation, "回答" If ans >= 4 Then MsgBox "入力されたのは、 4以上", vbInformation, "回答" Else MsgBox "入力は数字でしてください!", vbExclamation, "お願い" End If End Sub 1.入力が数値ならTRUEがかえると思ったのですが、何を入れてもFALSEしかかえりません。どこがまずいのでしょうか? 2.表示されるInputBoxのサイズが随分横に長いのですが、サイズを変える方法はあるのでしょうか? 3.MsgBoxの"入力判定"や”回答”ようにInputBoxにも最上行に日本語を表示させる方法はないでしょうか? 以上、よろしくお願いいたします。

  • エクセルVBA(初心者)

    Sub 練習() a = InputBox("だれ") MsgBox a End Sub 「a =」よりも「InputBox("だれ")」が最初に実行されるのは、どのような文法の決まりからでしょうか? Sub 練習() InputBox "だれ" a = InputBox("だれ") MsgBox a End Sub この場合、InputBox が2回でてきてしまうのですが・・・?

  • エクセルVBA、入力しないと閉じないInputBox

    必ず何かを入力しないと閉じないInputBoxを作ろうと思います。 以下のコードで入力がなければ閉じないというか、Line:に戻るので、何度でも現れるInputBoxになるようですが、このやり方は正しいですか? 通常はどうやるのでしょうか? Sub test() Dim a line: a = Application.InputBox("必ず入力して下さい。", "Input!") If Len(a) = 0 Or a = False Then GoTo line MsgBox "有難う。" & a & " ですね。", , "(o。_。)oペコッ" End Sub

  • 初心者です。エクセルVBAの質問なのですが・・・

    エクセルのVBAで 例えば・・・IF関数を使いたい時に Public Sub 練習() 年齢 = InputBox("あなたは何歳ですか。数字だけを入力して下さい。") If 年齢 < 20 Then MsgBox "未成年ですね" ElseIf 年齢 < 30 Then MsgBox "20代ですね。" Else MsgBox "その他の年代ですね" End If End Sub                            のようなものを作って、実行をしたときに、数字を入れてOKボタンではなく、ダイアログボックスのキャンセルや閉じるボタンを押したときに、「その他の年代ですね」が出てきますが、それを出てこないようにすることはできますか?(例えば、キャンセルボタンのような役割をさせるなど・・・)  結構難しいですかね? 教えて下さい。お願いします。

  • 「戻り値」ですか?「返り値」ですか?

    例えば Sub test1() MsgBox WorksheetFunction.Sum(Range("a1:a3")) End Sub でMsgBoxに表示される値の事は、「戻り値」ですか?「返り値」ですか? いまいちプログラミング用語がわからないので教えて下さい。 よろしくお願い致します。

  • VBAのinputboxで何もいれずに[OK]を押した時エラーになります

    よろしくお願い致します。 EXCELのVBAで「inputbox」を使ってセルを選択させたいと考えております。 下記のコードだと「キャンセル」や「×」で閉じられた時はmsgbox「キャンセル」が出てExit subするのですが、何も入力しないで「OK」を押した場合がどうしてもエラー(入力した数式は正しくありません)になります。 いろいろ調べて試したのですがどうしてもできず困っています。 どなたか教えてください。 Sub test() Dim myAns As Range On Error Resume Next Set myAns = Application.InputBox(Prompt:="セルを選択してください。", Title:="セル選択", Type:=8) On Error GoTo 0 If myAns Is Nothing Then MsgBox "キャンセル" Exit Sub ElseIf myAns = "" Then MsgBox "最低1つは選択してください" Exit Sub Else MsgBox myAns.Address(0, 0) End If End sub

  • このプログラムの説明の解説お願いします(`´)

    生年月日を入力して、自分の生まれた日の曜日を調べるプログラムです。 Sub 例1456() Dim w As Integer Dim week As Variant week = Array("日", "月", "火", "水", "木", "金", "土") hia = InputBox("「年/月/日」を入力して下さい") If IsDate(hia) Then hi = CDate(hia) hi = Format(hi, "yyyy""年""mm""月""dd""日""") Else MsgBox "「年/月/日」を入力して下さい" Exit Sub End If w = WeekDay(hi) MsgBox hi & " は " & week(w - 1) & "曜日です" End Sub 今週発表があります。構文の意味など詳しく説明しなければいけません。week(w - 1)のところなど解説いただきたいです<m(__)m>

  • EXEL VBAで印刷の指定をしたいのですが

    VBA初心者、勉強中です。 sheet1に2つの表がありまして下記のとおりボタンをクリックしたらインプットボックスが立ち上がって2つの表の1か2を指定したら範囲がぷれびゅーするということなんですが、1を入れても、2を入れてもMsgBox "1か2を入力して!しか表示しません。 さんざん調べまくりましたが、どなたかご教授お願いします。 Sub 印刷() Dim SentP As Integer On Error Resume Next SentS = InputBox("どちらを印刷?1売上 2材料") If SentP = 1 Then Range("a1:g32").Select Selection.printpreiew ElseIf SentP = 2 Then Range("j1:n41").Select Selection.PrintPreview Else MsgBox "1か2を入力して!" End If End Sub

  • 作成したVBAの改善点をお願いします(初心者)。

    こんばんは。VBAを勉強中ですが、参考書等を見ながら簡単なプログラムを作ってみましたが、もっと簡単な記述やベテランの方から見た改善点等があれば教えていただければと思います。(EXCEL2000を使用しています)。 ★内容 ・inputboxを使用し印刷枚数を入力し、印刷するものです(印刷枚数は1枚以上31枚以下)。 ・(K23)のセルには通し番号が入っており、印刷した枚数分だけ通し番号に1ずつ足していく。 Sub 印刷() Dim aaa As Integer aaa = InputBox("印刷枚数を入力してください", "印刷枚数", "") If 1 <= aaa And aaa <= 31 Then MsgBox "印刷を開始します" ElseIf aaa = "" Then MsgBox "キャンセルされました" ElseIf IsNumeric(aaa) = False Then MsgBox "入力内容が違います" ElseIf aaa <= 31 Then MsgBox "31日までの範囲で入力してください" Else For i = 0 To aaa Worksheets(1).PrintOut Worksheets(1).Range("k23").Value = Range("k23") + 1 Next i End If End Sub 一応、動きますが、勉強中なのでご教授をお願いいたします。

  • VBAについて

    こんばんは、VBA初心者で勉強をはじめたばかりで、自分で例題を作り調べながら途中まで作成しましたが、行き詰ったのでご教授をお願いします。ECXEL2000を使用しています。 ○やりたいこと。 ・INPUTBOXを表示させ、年齢を入力してもらう。 ・年齢が、18~64歳までならA2セルに入力年齢を表示させる。     17以下は「就職前」、65歳以上は「退職済」とBOXで表示させ、セルには表示させない。 ・A2セルに入力したら、A3セルをセレクトする。 ・INPUTBOXを表示させ、再度年齢入力をしてもらい、既にA2セルに年齢が入力済みであれば、A3に表示する。これをA10セルまで行えるようにする(その都度マクロの実行で実施) ○作成したマクロです。・・・やりたいことがすべて記述できていません。 Sub 年齢入力() 'INPUTBOXに入力される年齢の変数   Dim r As Integer 'データの最終行を代入する変数 Dim k As Long r = InputBox("年齢入力") k = Rows.Count Range("a2").Select If 17 < r And r < 65 Then MsgBox ("入力します") Range("a2") = r ElseIf r >= 65 Then MsgBox ("退職済") ElseIf r <= 17 Then MsgBox ("就職前") End If Cells(k, 1).End(xlUp).Offset(1).Select End Sub 以上のマクロのどこを変更すれば、私のやりたいことができるようになりますでしょうか?よろしくお願いします。

専門家に質問してみよう