测试代码:Private Sub Command1_Click()
   Dim i As Long
   For i = 0 To 5
        Debug.Print "Print Val(2D" & i & "): " & Val("2D" & i)
        Debug.Print "Print Val(2E" & i & "): " & Val("2E" & i)
   Next
End Sub结果:
Print Val(2D0): 2
Print Val(2E0): 2
Print Val(2D1): 20
Print Val(2E1): 20
Print Val(2D2): 200
Print Val(2E2): 200
Print Val(2D3): 2000
Print Val(2E3): 2000
Print Val(2D4): 20000
Print Val(2E4): 20000
Print Val(2D5): 200000
Print Val(2E5): 200000A到Z中,除了D和E,其它都返回字母前的数字2百思不得其解,也查不到相关资料,在这儿请教大家了以前没注意过,昨天回贴时无意中发现的,看来某些情况下,要慎用Val......

解决方案 »

  1.   

    看起来D和E都处理成了10的N次方了,2D3=2*10^3。这个函数似乎还有其它一些bug,见http://www.a1vbcode.com/vbtip-57.asp
      

  2.   

    这不是VB的BUG,下列代码显示结果一样,这里的-4.94065645841247E-324是表示一个数,不是字符串:
    Private Sub Command1_Click()
        Print -4.94065645841247E-324
        Print Val(-4.94065645841247E-324)
    End Sub那怕你写成Private Sub Command1_Click()
        Print -4.94065645841247E-324
        Print Val(-4.94065645841247D-324)
    End Sub当光标离开D处,D立即变成了E
      

  3.   

    改一下测试代码:Private Sub Command1_Click()
       Dim i As Long
       Dim s As String
       For i = 0 To 5
            s = "2D" & CStr(i)
            Debug.Print "Print Val(""2D" & i & """): " & Val(s)
            s = "2E" & CStr(i)
            Debug.Print "Print Val(""2E" & i & """): " & Val(s)
       Next
    End Sub
    结果:
    Print Val("2D0"): 2
    Print Val("2E0"): 2
    Print Val("2D1"): 20
    Print Val("2E1"): 20
    Print Val("2D2"): 200
    Print Val("2E2"): 200
    Print Val("2D3"): 2000
    Print Val("2E3"): 2000
    Print Val("2D4"): 20000
    Print Val("2E4"): 20000
    Print Val("2D5"): 200000
    Print Val("2E5"): 200000
    zdingyun 你好!
    D和E在Val函数中是如何解析的呢?为什么Val函数参考中没有特别说明?这样的结果好象也没办法解释通......
      

  4.   

    http://tieba.baidu.com/f?kz=17287890
    有这么一段
    一、VB的数据类型 
    VB中为了便于计算机的处理,充分利用计算机的系统资源,对程序中使用的变量或数据,根据其作用以及所表达的值的不同范围,规定了各种不同的类型。VB的数据类型比较丰富,主要由两部分组成:基本数据类型和用户自定义类型,本节中我们只介绍几种最常用的基本数据类型,其余的类型以后再作介绍。VB基本数据类型见下表。 
    类型 占用字节 值的有效范围 类型声明符 
    Integer(整型) 2 -32768~32767 % 
    Long(长整型) 4 -2147483648~2147483647 & 
    Single(单精度) 4 +1.40E-45~+3.40E38 ! 
    Double(双精度) 8 +4.97D-324~+1.79D308 # 
    String(字符串) 1/每字符 0~65535个字符 $ 
    Boolean(布尔型) 1 True或 False  
    Variant(通用型) 上述有效范围之一 
    整型数是不带小数且范围在-32768~32767之间的整数,在内存中用2个字节来存放一个整型数。在-32768~32767之间的整数,若在尾部加一个“%”也表示一个整型数,如-1235%,768%。 
    长整型数是范围在-2147483648~2147483647之间的整数,在内存中用4个字节来存放一个整型数。在-2147483648~2147483647之间的整数,若在尾部加一个“&”也表示一个长整型数。 
    单精度数是带小数的实数,有效值为7位,在内存中用4个字节来存放一个单精度数,它通常以指数的形式(科学记数法)来表示,在计算机中以“e”或“E”表示指数部分。单精度数取数范围在+1.40E-45~+3.40E38之间,或在一个实数的尾部加一个“!”也表示一个单精度数。 
    双精度数是也带小数的实数,有效位数为15位,在内存中用8个字节来存放一个双精度数,它通常以指数的形式(科学记数法)来表示,在计算机中以“d”或“D”表示指数部分。双精度数取数范围在+4.97D-324~+1.79D308之间,或在一个实数的尾部加一个“#”也表示一个双精度数。 
    字符串类型用以定义一个字符序列,在内存中一个字符用一个字节来存放。在程序中若引用一个字符串常数则必须用双引号“”将引用的字符括起来,如“How are you!”,”123+456”。 
      

  5.   

    在MSDN中搜索“数据类型”,可以找到这么一段:注意 浮点数值可表示为 mmmEeee 或 mmmDeee ,其中 mmm 是假数,而 eee 是指数(以 10 为底的幂)。Single 数据类型的最大正数值为 3.402823E+38,或 3.4 乘以 10 的 38 次方;Double 数据类型的最大正数值是 1.79769313486232D+308 或 1.8 乘以 10 的 308 次方。用 D 将数值文字中的假数部分和指数部分隔开,就会导致将该值作为 Double 数据类型来处理。同样,用这种方式使用 E,也会导致将该值作为 Single 数据类型来处理。
      

  6.   

    再加上MSDN对val函数的解释
    Val 函数,在它不能识别为数字的第一个字符上,停止读入字符串。那些被认为是数值的一部分的符号和字符,例如美圆号与逗号,都不能被识别。但是函数可以识别进位制符号 &O(八进制)和 &H(十六进制)。空白、制表符和换行符都从参数中被去掉。这样就可以解释所有的测试案例了
      

  7.   

    你那样做本来就不合理,2D,2E已经是16进制的啦,你应该
      Debug.Print "Print Val(2D" & i & "): " & Val("&h2D" & i)
      Debug.Print "Print Val(2E" & i & "): " & Val("&h2E" & i)
      

  8.   


    你没明白我的意思,我是要取一个字符串("A10B20C30D40")中的的所有数字 
      

  9.   

    回帖是这样的代码:  Dim s As String
        Dim tmp As String
        Dim i As Long
        
        s = "A10B20C30D40"
        Do
            For i = 1 To Len(s)
                tmp = Mid(s, i, 1)
                If IsNumeric(tmp) Then
                    tmp = Left(s, i - 1) & Val(Mid(s, i))
                    Debug.Print tmp
                    s = Replace(s, tmp, "", , 1)
                    Exit For
                End If
            Next
            DoEvents
        Loop While Len(s)测试时发现了这个问题yachong说的或许有道理...... 
      

  10.   


    这个应该就是答案!
    还是基础不扎实......
    如此说来,在字符串处理中,还是要慎用val......谢谢蚜虫,谢谢各位,明天结贴......
      

  11.   

    哈哈哈,在VB里2D和2E是代表将数字如何存储到内存中的表示方法。所以应当注意!