• ベストアンサー

VBでDate型の大小比較がうまく動作しないのですが

nenonenoです。こんにちわ Windows98,VB6SP5の環境でDate型の変数dtmNext,dtmToを比較しようとしたのですが、同じはずなのに片方が大きいと判定していまいます。 datediffでしらべると0:00:00と返すので、同じだと思うのですが... 使い方が悪いのであれば、どこか指摘していただけるとありがたいです。 よろしくお願いします。m(_ _)m Dim dtmNext, dtmTo, dtmTmp As Date  この間にもコードがあります Debug.Print "dtmNext:"; dtmNext; "dtmTo:"; dtmTo If dtmNext = dtmTo Then Debug.Print "Pass2 =" If dtmNext > dtmTo Then Debug.Print "Pass2 >" If dtmNext < dtmTo Then Debug.Print "Pass2 <" dtmTmp = DateDiff("n", dtmNext, dtmTo) Debug.Print "dtmTmp:"; dtmTmp ↓---------------------------イミディエイトウインドウの表示 dtmNext:03/02/17 15:00:00 dtmTo:03/02/17 15:00:00 Pass2 > dtmTmp:0:00:00

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

  • ベストアンサー
noname#4564
noname#4564
回答No.2

日付時刻型の内部表現は浮動小数点数です。 ご質問のケースではたぶん、1秒未満の端数部分が等しくないのでしょう。 Excel 2000で試してみましたが、小数部分で小さな差があっても、DateDiff関数では差はゼロと返されるようです。 ?CDbl(#2003/02/17 15:00:00#) 37669.625 ?Format$(CDate(37669.625),"yyyy/mm/dd hh:nn:ss") 2003/02/17 15:00:00 ?Format$(CDate(37669.624999),"yyyy/mm/dd hh:nn:ss") 2003/02/17 15:00:00 ?Format$(CDate(37669.625001),"yyyy/mm/dd hh:nn:ss") 2003/02/17 15:00:00 ?CDate(37669.624999) = CDate(37669.625) False ?DateDiff("s", CDate(37669.624999), CDate(37669.625)) 0

nenoneno
質問者

お礼

そうですね。浮動小数点演算という事をすっかり忘れていました。 こちらでもテストしてみましたが、おっしゃる通りの現象となりました。 一度計算したDeta型は茣蓙が含まれていると思うべきですね。 datediff関数を使って比較するか、関数を作るかしようと思います。 テストまでして頂いて、ありがとうございました。感謝します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • aptiva
  • ベストアンサー率36% (193/529)
回答No.1

>Dim dtmNext, dtmTo, dtmTmp As Date ここがあやしいのではないでしょうか。 dtmNext、dtmToはVariant型、dtmTmpが日付型で宣言されてます。 Dim dtmNext As Date, dtmTo As Date, dtmTmp As Date とやってみてはいかがでしょう。

nenoneno
質問者

お礼

ご指摘いただいた内容が原因ではないようですが、今後直そうとおもいます。 早速回答いただきありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 生年月日から学年を計算しようと以下のようにVBを用いて作りました。が、

    生年月日から学年を計算しようと以下のようにVBを用いて作りました。が、9月までは正しく学年が表示されたのですが、10月になったとたん、一つ前の学年が表示されるようになりました。 Function Jokyo(ByVal Umare As Variant) As String Dim idx As Integer Dim moji As String If IsNull(Umare) Then Jokyo = "" Exit Function End If '4月~12月での学齢計算 If Month(Date) >= "4" Then idx = DateDiff("yyyy", Umare, DateSerial(Year(Date), 4, 1)) If Format(Umare, "mmdd") < "0401" Then idx = idx + 1 End If ElseIf Month(Date) < "4" Then idx = DateDiff("yyyy", Umare, DateSerial(Year(Date) - 1, 4, 1)) If Format(Umare, "mmdd") < "0401" Then idx = idx + 1 End If Else idx = 19 End If '-------------------------------------------------- Select Case idx Case 0 To 4 moji = "未入学" Case 5 moji = "幼稚園年少" Case 6 moji = "幼稚園年長" Case 7 To 12 moji = "小学" & idx - 6 & "年生" Case 13 To 15 moji = "中学" & idx - 12 & "年生" Case 16 To 18 moji = "高校" & idx - 15 & "年生" Case Else moji = "既卒生" End Select Jokyo = moji End Function

  • VB2008(vb6でも可)よりVPNで接続されている

    VB2008(vb6でも可)よりVPNで接続されている 共有フォルダ内のファイル存在チェックについて。 マイネットワークで見れたので単純に考えて Dim FName As String = "\\**.***.**.***\c:\###.csv" If System.IO.File.Exists(FName) Then Debug.WriteLine(FName & " は存在します") Else Debug.WriteLine(FName & " は存在しません") End If とIPアドレスを指定したらできるかと思ったのですが 駄目でした。解決方法または参考になるサイトをご存知であれば よろしくお願いいたします。

  • オブジェクト型の変数同士の値の等価比較方法

    VB.NETにおいて、オブジェクト型の変数同士の値が同じかどうかチェックする方法を教えてください。 Dim a As Object = 1.0 Dim b As Object = DBNull.Value ・・・ If a = b Then ' 同じ Else ' 違う EndIf 上記のようなことをしたいのですがエラーになります。よろしくお願いします。

  • VBAで配列のNULL判定

    VBAで下記のように配列に設定したNULL値を判定しようとしました。 Dim str() ReDim Preserve str(2) str(0) = "aaa" str(1) = Null str(2) = "bbb" 以下(1)、(2)の分岐処理ではNullと判定されませんでした。 どのように判定すれば良いでしょうか? (1) If str(1) = Null Then Debug.Print "Null値です" End If (2) If str(1) = "" Then Debug.Print "Null値です" End If

  • VBA null判定

    Accessでテキストボックスの値をテーブルへ書き込むVBAを作成しているのですが、Null判定がうまくいきません。 ◎環境 OS:Windows7Pro Var:Access2010 DB:MySQL5.6 Private Sub cmdSubmit_Click() Dim Rst As DAO.Recordset Dim ErrT As String Set Rst = CurrentDb.OpenRecordset("m_plan", dbOpenDynaset) '各テキストボックス、Null判定 If IsNull(txtPid) Then MsgBox "プランID[" & txtPid & "]が未入力です" Call txtCrer Exit Sub End If If IsNull(txtPName) Then MsgBox "プラン名が未入力です" Call txtCrer Exit Sub End If If IsNull(txtPsdate) Then Me!txtPsdate = #01/01/2010# End If If IsNull(Me!txtPedate) Then Me!txtPedate = #01/01/2010# End If Debug.Print "プランID["; Me.txtPid & "]" Debug.Print "プラン名[" & Me!txtPName & "]" Debug.Print "開始日[" & Me!txtPsdate & "]" Debug.Print "終了日[" & Me!txtPedate & "]" ↑↑↑↑↑↑↑↑↑ ここで、Null判定を行ってますが、データがあるにも関わらず、処理が続行されたり、Null判定結果が起動するたびに変わります。 On Error GoTo err With Rst .MoveLast .AddNew .Fields("PlanID") = Me!txtPid .Fields("PlanName") = Me!txtPName .Fields("PlanSt") = CDate(Me!txtPsdate) .Fields("PlanEn") = CDate(Me!txtPedate) .Fields("P_Remaks") = Me!txtPbikou .Update End With Rst.Close Set Rst = Nothing err: MsgBox "DBエラー" Debug.Print Rst.Type Debug.Print err.Description Call txtCrer End Sub ただし、下記判定だけのボタンとプロシージャーでは、正常に判定されます。 判定だけの、プロシージャー 'Null判定テスト Private Sub cmdtest_Click() If IsNull(txtPid) Then Debug.Print "[" & txtPid & "]" & "Nullです。" Else Debug.Print "[" & txtPid & "]" & "Not Nullです。" End If If IsNull(txtPName) Then Debug.Print "[" & txtPName & "]" & "Nullです。" Else Debug.Print "[" & txtPName & "]" & "Not Nullです。" End If If IsNull(txtPsdate) Then Debug.Print "[" & txtPsdate & "]" & "Nullです。" Else Debug.Print "[" & txtPsdate & "]" & "Not Nullです。" End If Debug.Print "===============================" End Sub どこが間違っているかまったくわかりません、アドバイスを頂けましたら幸いです。

  • VB.NET 2008 Eventステートメント

    VB.NET 2008 以下の実装で実行したところ、GC強制実行後のメモリ状態に疑問を持ち質問しました。 Eventを所持したクラスの生成、削除を繰り返し、GCを強制実行したところ、 16バイトごと増加していきます。 Class1で定義したm_eventをイベントから別のタイプ、例えばIntegerやString型に変更して、 同様に実行したところ、メモリの増加は見受けられません。 なぜでしょうか? またこの現象はメモリリークといえるのでしょうか? Public Class Class1 Public Sub New() End Sub Private Event m_event() End Class Sub Main() GC.Collect() Debug.Print("####") Debug.Print(GC.GetTotalMemory(False)) Dim cls As Class1 For i As Integer = 0 To 1000 cls = New Class1 cls = Nothing If i = 0 Then GC.Collect() Debug.Print(GC.GetTotalMemory(False)) End If Next GC.Collect() Debug.Print(GC.GetTotalMemory(False)) Debug.Print("@@@@") End Sub

  • VB.net 登録されている日付の連続性のチェック

    VB.netについて質問です。 下記のようにデータがあったとします。 _________ 日付、コード 1/1、****** 1/1、****** 1/2、****** 1/2、****** 1/2、****** 1/4、****** 1/4、****** 1/7、****** 1/11、****** ・ ・ ・ _______ 登録されていない日付があったときにメッセージを出したいです。 下記のコーディングでは 1/4~1/7の間で(2日連続登録されていない) 1/5、1/6は登録されていません。まで出すのが精一杯です。 ______________________________ '登録されていない日があったときメッセージを出す For i = 0 To DataGridView.RowCount - 2 Dim kyou As Date = DataGridView.Rows(i).Cells(0).Value Dim tsugi As Date = DataGridView.Rows(i + 1).Cells(0).Value Dim ashita As Date = kyou.AddDays(1) Dim asatte As Date = ashita.AddDays(1) Dim shiasatte As Date = asatte.AddDays(1) '2日連続登録データが抜けていたときまでのチェック If kyou = tsugi Or tsugi = ashita Then Else If tsugi = asatte Then MsgBox(ashita & "が未登録です") Else If tsugi = shiasatte Then MsgBox(ashita & "と" & asatte & "が未登録です") End If End If End If Next ______________________________ どんなに日にち離れていても対応できるようなコーディングを教えて欲しいです。 よろしくお願いいたします。

  • VB6.0で、LSetの動作がわからない

    よろしくお願いします。 LSetのサンプルを検索していて以下のコードを見つけました。 Option Explicit Private Type B4 B(3) As Byte End Type Private Type S1 S As Single End Type Private Sub Form_Load() Dim X As B4 Dim Y As S1 X.B(0) = 37 X.B(1) = 82 X.B(2) = 154 X.B(3) = 68 LSet Y = X Debug.Print Y.S End Sub このコードを実行するとデバッグウィンドウに 1234.567 と表示されます。 このコードではいったい何が起こっているのでしょうか? X.Bとして4つの配列変数が用意され、それがY.Sという配列ではない通常の変数に代入されているのはわかるのですが、 どうして結果が1234.567になるのかわかりません。

  • 内部処理形式が日付型 (Date) の Variant

    文字変数として保存されている日付の演算を組込み関数で行おうと debug.print DateDiff("yyyy", DateValue("2001.1.1"), DateValue("2001.10.16")) debug.print DateDiff("yyyy", "2001.1.1", "2001.10.16") 等やってみたのですが、 実行時エラー13 型が一致しません となり実行できません。 DateDiff 関数の引数になる「内部処理形式が日付型のVariant」型変数への代入方法をお知らせください。 実行環境 Visual Basic 6.0 SP5 Windows 98 256MB + 32GB-HDD(空き10GB)

  • VBのコーディングについて

    はじめまして。VBの課題で行き詰ってしまったので、力を貸していただければと思います。 課題は【商品一覧からレコードを取得し、取得したレコードを商品区分で集計し、商品区分・商品件数・売上合計金額を区分別売上表に出力する】 といったものです。 商品一覧には、【商品区分・商品名・売上】の順にデータが入っています。 自分なりに考えた手順は Private Sub コマンド1_Click() Dim INP_DATA As String Dim kubun_01 As String Dim syohin_01 As String Dim uriage_01 As Integer Dim kubun_02 As String Dim syohin_02 As String Dim uriage_02 As Integer  Open "C:INFILE.txt" For Input As #1 Open "C:OUT_FILE.txt" For Output As #2 'ファイルの終了までループ Do Until EOF(1) Line Input #1, INP_DATA '読み込んだレコードの各項目を変数に代入 kubun_01 = Trim(Left(INP_DATA, 10)) syohin_01 = Trim(Mid(INP_DATA, 11, 10)) uriage_01 = Right(INP_DATA, 8) '一行目かどうか If Trim(Mid(INP_DATA, 11, 10)) = syohin_01 kubun_01 = Trim(Left(INP_DATA, 10)) syohin_01 = Trim(Mid(INP_DATA, 11, 15)) uriage_01 = Right(INP_DATA, 8) ElseIf Trim(Mid(INP_DATA, 11, 10)) <> syohin_01 Then kubun_02 = Trim(Left(INP_DATA, 10)) syohin_02 = Trim(Mid(INP_DATA, 11, 10)) uriage_02 = Right(INP_DATA, 8) End If If kubun = kubun_hikaku_2 Then goukei = uriage_hikaku_2 + uriage ElseIf kubun <> kubun_hikaku_2 Then Print #2, kubun; syohin; goukei End If Loop '新たに比較用の変数に格納 Do Until EOF(1) Line Input #1, INP_DATA kubun_01 = Trim(Left(INP_DATA, 10)) syohin_01 = Trim(Mid(INP_DATA, 11, 10)) uriage_01 = Right(INP_DATA, 8) Loop Debug.Print "PROGRAM END" Close #1 Close #2 End Sub となっています。長くなってしまい申し訳ありません。 上記のコーディングですと、欲しいデータが返ってこないので、 どなたかご教授いただけないでしょうか?? よろしくお願いいたします。