タイトル | : Re^2: 「式が複雑すぎます」の対処について |
記事No | : 16250 |
投稿日 | : 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
|