Snowflying 发表于 2006-6-12 14:24:00

intersecWith()方法的一个重要bug

intersecWith 方法是一个非常有用的方法,VBA手册中的给出的示例代码如下
在使用过程中我发现下面的代码不能够正确运行。具体说 If VarType(intPoints)vbEmpty Then这种判断方式有问题。按照手册的说法,如果有交点返回交点坐标,如果没有交点则不返回任何值,根据我的实际测试,即使是没有交点,返回的也是一个double()变量!!此时vartype() typename()的值分别是 8197 和 double()(vba语言参考中没有关于此值的说明,与此值相近的是 常数vbArry值8192代表数组) 而此时的 ubound(变量) 的值返回的是-1!!
也就是说如果你想使用示例代码中的方法测试对象是否有交点不能的到正确的方法 应为无论是否有交点vartype(交点) 的值 都不等于 vbEmpty0   !!
我的测试环境是    2005 简体中文版 office2003OSwindows XP sp2   
不知道我遇到的问题是否带有普遍性 或者说我上述的现象是否正确,请各位朋友验证一下。

   ' Find the intersection points between the line and the circle
    Dim intPoints As Variant
    intPoints = lineObj.IntersectWith(circleObj, acExtendNone)
   
    ' Print all the intersection points
    Dim I As Integer, j As Integer, k As Integer
    Dim str As String
    If VarType(intPoints)vbEmpty Then
      For I = LBound(intPoints) To UBound(intPoints)
            str = "Intersection Point[" & k & "] is: " & intPoints(j) & "," & intPoints(j + 1) & "," & intPoints(j + 2)
            MsgBox str, , "IntersectWith 示例"
            str = ""
            I = I + 2
            j = j + 3
            k = k + 1
      Next
    End If

Snowflying 发表于 2006-6-12 14:28:00

我上面贴的代码是 手册中的代码示例,我使用的时候 是比较两个线段是否相交,结果无论是 平行线还是 非平行线 vartype(交点 as variant)返回的都不是vbEmpty   

68651521 发表于 2006-6-14 10:54:00

我也遇到这个BUG。
闷了很久 MSGBOX了半天
最后只好把If VarType(intPoints)vbEmpty then
改成 If ubound(intPoints)-1 then
才行 。 巨闷ing。

Snowflying 发表于 2006-6-19 13:49:00

haha终于遇到知音了 我也是 msgbox 半天 后来的用的方法和你的一样啊

ljq 发表于 2006-6-19 18:57:00

还有多余点问题呢,明明4个交点,它确返回5个或更多个交点.所以使用IntersectWith()一定要谨慎噢!
页: [1]
查看完整版本: intersecWith()方法的一个重要bug