tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^2: 「式が複雑すぎます」の対処について
投稿日: 2016/07/07(Thu) 20:37
投稿者魔界の仮面弁士
> > 「sDay = DateAdd("d", 1, sDay)」にきたときにエラーが起こりました。
>
> 他の環境で再現性があるかどうか、調査してみたいので、
> 変数 sDay のデータ型と、エラー発生直前の sDay の値を教えてください。

試しに、sDay として特殊値を渡してみましたが、『式が複雑すぎます』な現象は確認できませんでした。

DateAdd("d", 1, zero)
DateAdd("d", 1, epsilon)
→ 1899/12/31

DateAdd("d", 1, min_oledate)
→ 100/01/02

DateAdd("d", 1, max_double)
DateAdd("d", 1, min_double)
→ [Error 13: 型が一致しません。]

DateAdd("d", 1, max_oledate)
DateAdd("d", 1, max_oledate2)
DateAdd("d", 1, not_a_number)
DateAdd("d", 1, negative_infinity)
DateAdd("d", 1, positive_infinity)
→ [Error 5: プロシージャの呼び出し、または引数が不正です。]



--- 特殊値の生成コード ---

Option Explicit

Private Type B8
    Bin(7) As Byte
End Type

Private Type DBL
    value As Double
End Type

Private Function GetDouble(ParamArray b() As Variant) As Double
    Dim src As B8, dst As DBL
    Dim i As Integer, u As Integer
    
    u = UBound(b)
    For i = 0 To IIf(u > 7, 7, u)
        src.Bin(i) = b(i)
    Next
    LSet dst = src
    On Error Resume Next
    GetDouble = dst.value
End Function


Private Sub Command1_Click()
    Dim zero As Double
    zero = GetDouble(0, 0, 0, 0, 0, 0, 0, 0, 0)
    Debug.Print zero                '「 0」
    
    Dim epsilon As Double           '0より大きい最小の値
    epsilon = GetDouble(1, 0, 0, 0, 0, 0, 0, 0, 0)
    Debug.Print epsilon             '「 4.94065645841247E-324」
    
    Dim min_double As Double        'Double型の最小値
    min_double = GetDouble(&HFF, &HFF, &HFF, &HFF, &HFF, &HFF, &HEF, &HFF)
    Debug.Print min_double          '「-1.79769313486232E+308」
    
    Dim max_double As Double        'Double型の最大値
    max_double = GetDouble(&HFF, &HFF, &HFF, &HFF, &HFF, &HFF, &HEF, &H7F)
    Debug.Print max_double           '「 1.79769313486232E+308」
    
    Dim min_oledate As Double       'Date型の最小値
    min_oledate = GetDouble(0, 0, 0, 0, &H34, &H10, &H24, &HC1)
    Debug.Print min_oledate         '「-657434」0100/01/01 00:00:00.0000000
    
    Dim max_oledate As Double       'Date型の最大値
    max_oledate = GetDouble(&HE9, &H9E, &HFF, &HFF, &H40, &H92, &H46, &H41)
    Debug.Print max_oledate         '「 2958465.99998843」9999/12/31 23:59:59.0000000
    
    Dim max_oledate2 As Double      'Date型の本当の最大値
    max_oledate2 = GetDouble(&HFE, &HFF, &HFF, &HFF, &H40, &H92, &H46, &H41)
    Debug.Print max_oledate2        '「 2958466」※実際には958466より小さい最大の値
    
    Dim not_a_number As Double      '非数値
    not_a_number = GetDouble(0, 0, 0, 0, 0, 0, &HF8, &HFF)
    Debug.Print not_a_number        '「-1.#IND」indeterminate value

    Dim negative_infinity As Double '負の無限大
    negative_infinity = GetDouble(1, 0, 0, 0, 0, 0, &HF0, &HFF)
    Debug.Print negative_infinity   '「-1.#QNAN」negative quiet Not-a-Number
    
    Dim positive_infinity As Double '正の無限大
    positive_infinity = GetDouble(1, 0, 0, 0, 0, 0, &HF0, &H7F)
    Debug.Print positive_infinity   '「 1.#QNAN」positive quiet Not-a-Number
End Sub

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。