社内システムの自作なら、すず工房へ!!
エクセル仕事術などでIT経営を支援します
  • Home
  • エクセル仕事術
  • クラウド生産管理
  • サービス案内
  • つぶやきました
  • お問合せ
  • すず工房
  • 名刺

IsDate関数はおかしい‥

2011年11月30日

Excel 2010 VBAで使用する[IsDate]関数は与えられた文字列が日付形式かどうかを返してくれる関数です。

通常は問題ないのですが、先日変な現象に遭遇しました。

下記のプログラムを見てください。

 

Public Function test_IsDate(buf As Variant) As Variant

    test_IsDate = IIf(IsDate(buf), "[" & buf & "]は日付です。", _

                                "[" & buf & "]は日付ではありません。")

End Function

 

Public Sub test() 

    MsgBox "1." & test_IsDate("2011/11/30") & vbCrLf _

           & "2." & test_IsDate("2011/11") & vbCrLf _

           & "3." & test_IsDate("11/3") & vbCrLf _

           & "4." & test_IsDate("12/32") & vbCrLf _

           & "5." & test_IsDate("00A") & vbCrLf _

           & "6." & test_IsDate("00") & vbCrLf _

           & "7." & test_IsDate("0A") & vbCrLf _

           & "8." & test_IsDate("A") & vbCrLf _

            , vbOKOnly + vbInformation, "IsDateテスト"

End Sub

どんな結果になるか、想像できますよね、

 

testを実行した結果は右図の通り。想像した結果と違っていたのではないでしょうか?  

 

4.5.7.はどう見たっておかしいですよね。 原因についてはわかりませんが、日付ではない一般の文字列を渡すことは避けたほうがいいようです。

 というわけで、自前のMyIsDateプロシージャを作ってみました。 ( http://kozhouse.homeip.net/progtec/11/ を参考にさせて頂きました。)


Public Sub test2()

    MsgBox "1." & test_MyIsdate("2011/11/30") & vbCrLf _

           & "2." & test_MyIsdate("2011/11") & vbCrLf _

           & "3." & test_MyIsdate("11/3") & vbCrLf _

           & "4." & test_MyIsdate("12/32") & vbCrLf _

           & "5." & test_MyIsdate("00A") & vbCrLf _

           & "6." & test_MyIsdate("00") & vbCrLf _

           & "7." & test_MyIsdate("0A") & vbCrLf _

           & "8." & test_MyIsdate("A") & vbCrLf _

           & "9." & test_MyIsdate("2011/11/30 12:34:56") & vbCrLf _

           & "10." & test_MyIsdate("11/30 12:34:56") & vbCrLf _

           & "11." & test_MyIsdate("2011/11 12:34:61") & vbCrLf _

           & "12." & test_MyIsdate("11/30 12:34:61") & vbCrLf _

            , vbOKOnly + vbInformation, "MyIsDateテスト"

End Sub

 

Private Function test_MyIsdate(buf As Variant) As Variant

    test_MyIsdate = IIf(MyIsDate(buf), "[" & buf & "]は日付です。", _

                                "[" & buf & "]は日付ではありません。")

End Function

 

Public Function MyIsNumeric(chkStr As Variant) As Boolean

    Dim ii As Integer

    

    MyIsNumeric = True

    For ii = 1 To Len(chkStr)

        If InStr(1, "0123456789", Mid(chkStr, ii, 1), vbTextCompare) = 0 Then

            MyIsNumeric = False

            Exit For

        End If

    Next ii

End Function

 

Public Function MyIsDate(targetDate As Variant) As Boolean

    Dim sYear     As Variant

    Dim sMonth    As Variant

    Dim sDay      As Variant

    Dim nYear       As Long

    Dim nMonth      As Long

    Dim nDay        As Long

    Dim nDayMax     As Long

    Dim ii          As Long

    Dim jj          As Long

    Dim cntr    As Long

    Dim pos(1 To 2) As Long

    

    Dim sHour As Variant

    Dim sMin As Variant

    Dim sSec As Variant

    Dim nHour As Long

    Dim nMin As Long

    Dim nSec As Long

    Dim cntrH As Long

    Dim tmp As Variant

    Dim bufHour As Variant

    Dim posh(1 To 2) As Long

 

    MyIsDate = False

      cntr = 0 '区切り記号 / の数

    For ii = 1 To Len(targetDate)

        If Mid(targetDate, ii, 1) = "/" Then

            cntr = cntr + 1

            If cntr > 2 Then

                Exit Function 'ふたつ以上の時は不正

            End If

            pos(cntr) = ii

        End If

    Next ii

    If cntr = 0 Then ' / が無いときは不正

        Exit Function

    End If

    

    'これ以降 / のかずは、1または2個

    sYear = Left(targetDate, pos(1) - 1)

    Select Case cntr

    Case 2 '年/月/日

        sMonth = Mid(targetDate, pos(1) + 1, pos(2) - pos(1) - 1)

        sDay = Mid(targetDate, pos(2) + 1)

    Case 1 '年/月

        sMonth = Mid(targetDate, pos(1) + 1)

    Case 0

        Exit Function

    End Select

 

    If Not MyIsNumeric(sYear) Then

        Exit Function

    Else

        nYear = CLng(sYear)

    End If

    

    If Not MyIsNumeric(sMonth) Then

        Exit Function

         'yyyy/mm hh:nn:ss はNG ← 日 が無い

         'mm/dd hh:nn:ss はNG ← 年 が無い

    Else

        nMonth = CLng(sMonth)

    End If

    If cntr = 2 Then ' 年/月/日 ***

        If Not MyIsNumeric(sDay) Then

            tmp = Split(sDay, " ", , vbTextCompare)

            sDay = tmp(0) 'yyyy/mm/dd hh:nn:ss はok

            If Not MyIsNumeric(sDay) Then

                Exit Function

            Else

                nDay = CLng(sDay)

            End If

            If UBound(tmp) > 1 Then

                Exit Function

            Else 'yyyy/mm/dd []

                bufHour = tmp(1) 'hh:nn:ss でないときはNG

                

                cntr = 0 '区切り記号 : の数

                For jj = 1 To Len(bufHour)

                    If Mid(bufHour, jj, 1) = ":" Then

                        cntrH = cntrH + 1

                        If cntrH > 2 Then

                            Exit Function

                        End If

                        posh(cntrH) = jj

                    End If

                Next jj

                If cntrH <> 2 Then

                    Exit Function

                End If

                

                sHour = Left(bufHour, posh(1) - 1)

                sMin = Mid(bufHour, posh(1) + 1, posh(2) - posh(1) - 1)

                sSec = Mid(bufHour, posh(2) + 1)

               

                If Not MyIsNumeric(sHour) Then

                    Exit Function

                Else

                    nHour = CLng(sHour)

                End If

                If Not MyIsNumeric(sMin) Then

                    Exit Function

                Else

                    nMin = CLng(sMin)

                End If

                If Not MyIsNumeric(sSec) Then

                    Exit Function '-5

                Else

                    nSec = CLng(sSec)

                End If

                

                If Not (nHour >= 0 And nHour < 24) Then

                    Exit Function

                End If

                If Not (nMin >= 0 And nMin < 60) Then

                    Exit Function

                End If

                If Not (nSec >= 0 And nSec < 60) Then

                    Exit Function

                End If

                

           End If

           

        Else

            nDay = CLng(sDay)

        End If

    End If

    

    Select Case nMonth

    Case 1, 3, 5, 7, 8, 10, 12

        nDayMax = 31

    Case 4, 6, 9, 11

        nDayMax = 30

    Case 2

        nDayMax = 28 - ((nYear Mod 400) = 0) + ((nYear Mod 100) = 0) - ((nYear Mod 4) = 0)

    Case Else

        Exit Function

    End Select

    

    If cntr = 2 Then '年/月/日

        If (nDay >= 1) And (nDay <= nDayMax) Then

            MyIsDate = True

        End If

    Else

        MyIsDate = True

    End If

End Function

仕様的には、

基本形  年/月/日 時:分:秒

OK       年/月/日

OK      月/日

OK      年/月/日 時:分:秒

NG      年/月 時:分:秒 

NG      月/日 時:分:秒   ← 少し拡張すれば、OKになるようにできると思います     

実行結果は右図の通りです。

  • 仕事に生かすExcel
  • マクロ・VBA
    • Excel2013のSDIへの対応
    • WEBからデータをVBAで取込む
    • 選択したセル範囲を取出すには
    • 消費税率を読込むDLL
    • インターネット上のサイトのデータを読み込む
    • 右ボタンでのMouseDownイベントには要注意
    • CSVファイルを読みこむ(Excel)
    • テキストファイル読込速度比較
    • 進行表示の3つの方法
    • IsDate関数はおかしい‥
    • 別のワークブックのデータを読み込む
    • 2 つの指定した日付の時間間隔と満年齢
    • ワークシートのセルに特定のデータを入力する
    • CSVファイルからデータを取り出す
    • ワークシートからデータを取得する
    • ワークシートにデータをセットする
    • 特定のセル範囲からデータを探す方法を比較する
  • Excelの操作

コンタクト

メール
メール
FaceBook
FaceBook

つぶやきました

見える生産管理2022

2022年 10月 31日 月

久しぶりの投稿になってしまいましたが、「見える生産管理2022」を試用できるようになりました。「クラウド生産管理」メニュからご覧ください。

0 コメント

Webデータベース利用の生産管理

2019年 7月 22日 月

いままでExcel(R)を活用した生産管理システムを構築したり構築支援したりしてきましたが、もっと簡単に生産管理を開始できないかと考え、Webに登場してきたデータベースを利用して生産管理できるシステムを考えました。

 

続きを読む 0 コメント

iPadのSIM

2018年 11月 16日 金

iPad Pro 12.9を外出時の仕事用に使っていたが、自宅のMACにリモートアクセスするのがベストに近いかもと気づき、4G回線経由だがやってみた。

しかしこれがかなり遅い。SIMは前の機種で使ってたイオンモバイルのやつ。これが原因かもと思い、一番早いと噂のUQ  Mobileに変えてみた。体感的にはちょっと早いかなという感じ。これからじっくり検証していこうと思う。

 

インターネット接続の設定でつまづいたので以下に備忘録として残しておく。

 

 

続きを読む
プライバシーポリシー | サイトマップ
Copyright © 2002- すず工房. All Rights Reserved.
ログアウト | 編集
  • Home
  • エクセル仕事術
    • 仕事に生かすExcel
      • Excelでできること
      • ExcelからSQLiteを使う理由
    • マクロ・VBA
      • Excel2013のSDIへの対応
      • WEBからデータをVBAで取込む
      • 選択したセル範囲を取出すには
      • 消費税率を読込むDLL
      • インターネット上のサイトのデータを読み込む
      • 右ボタンでのMouseDownイベントには要注意
      • CSVファイルを読みこむ(Excel)
      • テキストファイル読込速度比較
      • 進行表示の3つの方法
      • IsDate関数はおかしい‥
      • 別のワークブックのデータを読み込む
      • 2 つの指定した日付の時間間隔と満年齢
      • ワークシートのセルに特定のデータを入力する
      • CSVファイルからデータを取り出す
      • ワークシートからデータを取得する
      • ワークシートにデータをセットする
      • 特定のセル範囲からデータを探す方法を比較する
    • Excelの操作
      • ふりがなをつける
      • 行・列を固定してスクロール
      • 他のシートのデータを表示する-カメラ機能
      • 文章を指定範囲に収まるように整形する
  • クラウド生産管理
    • 見える生産管理2022
    • 見える生産管理K(簡易版)
    • 試用申込み
  • サービス案内
    • IT経営
  • つぶやきました
    • MAC
    • IT
    • その他
    • 年月別
      • 2022/10
      • 2019/07
      • 2016/07
      • 2016/04
      • 2015/11
      • 2015/10
      • 2015/08
      • 2015/07
      • 2015/06
      • 2015/03
      • 2015/02
      • 2014/12
      • 2014/03
      • 2013/09
      • 2012/11
      • 2012/09
      • 2010/09
      • 2010/08
      • 2010/07
      • 2010/06
      • 2010/03
      • 2010/02
      • 2009/05
      • 2009/04
  • お問合せ
  • すず工房
    • 企業理念
    • 主な資格
    • 実績
  • 名刺
  • トップへ戻る