这是一段循环,一共16个循环,执行到15个循环的时候,出现错误,提示:实时错误'5',无效的过程或参数。错误点在下方
Private Function SearchOnePagePrice()    Dim ksPos As Long '开始pos
    Dim jsPos As Long '结束pos
    Dim Res As String
    Res = pageText1.Text
    
    Dim str0, str1, str2, str21, str22, str3, str31, str23, str24, str25, str26 As String
    Dim s1Lpos, s1Rpos, s1
    Dim s2Lpos, s2Rpos, s2
    Dim s3Lpos, s3Rpos, s3
    Dim s4Lpos, s4Rpos, s4
    Dim s5Lpos, s5Rpos, s5
    Dim s6Lpos, s6Rpos, s6
    
    str1 = "<table class=fenlei_list>"          '每段开始标记
    str2 = "ff6600"
    
    str21 = "<b>"
    str22 = "</b>"
    str23 = "</u>"
    str24 = "</font>"
    str25 = "fenlei>"
    str26 = "元"
    
    
    str3 = "首页"
    
    '开始pos
    ksPos = InStr(Res, str1)
    '结束pos
    jsPos = InStr(Val(ksPos) + Len(str1), Res, str1)   '第1段开始+25标记串长,搜索下一标记    Dim i As Integer
    For i = 1 To 16
        
        '第1段全部
        str0 = Mid(Res, ksPos, jsPos - ksPos + 1)
        
        '名称
        s1Lpos = InStr(str0, str21) + Len(str21)
        s1Rpos = InStr(str0, str22)
        '发现最后一页关键词:首页
        str31 = InStr(str0, str3)
        If str31 = "0" Then
            s1 = Mid(str0, s1Lpos, s1Rpos - s1Lpos)
        Else
            MsgBox ("*****  数据收集结束! *****")
            Exit Function
        End If
        
        '编号
        s2Lpos = InStr(str0, str2)                      '第1个ff6600
        s2Lpos = InStr(s2Lpos + Len(str2), str0, str2)  '第2个
        s2 = Mid(str0, s2Lpos + 8 + 4, 16)
        s2 = Trim(s2)
        s2 = Mid(s2, 2, Len(s2) - 3)
        s2 = Trim(s2)
        
        '规格
        s3Lpos = InStr(str0, str2)                      '第1个ff6600
        s3Lpos = InStr(s3Lpos + Len(str2), str0, str2)  '第2个
        s3Lpos = InStr(s3Lpos + Len(str2), str0, str2)  '第3个
        s3 = Mid(str0, s3Lpos + 10, 75)
        s3Rpos = InStr(s3, str24)
        s3 = Mid(s3, 6, s3Rpos - Len(str24))
        s3 = Trim(s3)
        
        
        '颜色
        s4Lpos = InStr(str0, str2)                      '第1个ff6600
        s4Lpos = InStr(s4Lpos + Len(str2), str0, str2)  '第2个
        s4Lpos = InStr(s4Lpos + Len(str2), str0, str2)  '第3个
        s4Lpos = InStr(s4Lpos + Len(str2), str0, str2)  '第4个
        s4 = Mid(str0, s4Lpos + Len(str2) + 6, 26)      'len后面的数字是与ff6600连接的字符
        s4Rpos = InStr(s4, str24)
        s4 = Mid(s4, 1, s4Rpos - Len(str24))
        s4 = Trim(s4)
        
        '单位
        s5Lpos = InStr(str0, str2)                      '第1个ff6600
        s5Lpos = InStr(s5Lpos + Len(str2), str0, str2)  '第2个
        s5Lpos = InStr(s5Lpos + Len(str2), str0, str2)  '第3个
        s5Lpos = InStr(s5Lpos + Len(str2), str0, str2)  '第4个
        s5Lpos = InStr(s5Lpos + Len(str2), str0, str2)  '第5个
        s5 = Mid(str0, s5Lpos + Len(str2) + 2, 20)      'len后面的数字是与ff6600连接的字符
        s5Rpos = InStr(s5, str24)
        s5 = Mid(s5, 1, s5Rpos - 1)
        s5 = Trim(s5)
        
        
        '价格
        s6Lpos = InStr(str0, str25)                       '第1个 fenlei>
        s6Lpos = InStr(s6Lpos + Len(str25), str0, str25)  '第2个
        s6Lpos = InStr(s6Lpos + Len(str25), str0, str25)  '第3个
        s6Lpos = InStr(s6Lpos + Len(str25), str0, str25)  '第4个
        s6Lpos = InStr(s6Lpos + Len(str25), str0, str25)  '第5个
        s6Lpos = InStr(s6Lpos + Len(str25), str0, str25)  '第6个
        s6 = Mid(str0, s6Lpos + Len(str25) + 2, 60)       'len后面的数字是与ff6600连接的字符
        s6Rpos = InStr(s6, str26)
        s6 = Mid(s6, 1, s6Rpos - 1)
        s6 = Trim(s6)
        
        MsgBox (s1 & vbCrLf & s2 & vbCrLf & s3 & vbCrLf & s4 & vbCrLf & s5 & vbCrLf & s6)
        
        
        ksPos = jsPos        '结束pos
        jsPos = InStr(Val(jsPos) + 25, Res, str1)   经过调试,发现第15次循环到这里,jsPos的值变成了0,执行到[第1段全部]mid段导致程序错误。
    NextEnd Function

解决方案 »

  1.   

    ksPos和jsPos只在循环外的上面和循环内的下面进行运算,中部无关联。
    现在的问题是每次循环都在ksPos和jsPos上累加数字,前面14次循环没问题,但为什么执行到15次jsPos就变成0了,搞不明白。
      

  2.   


        Dim ksPos As Long '开始pos
        Dim jsPos As Long '结束pos 你这俩变量到底是当做数字用,还是当做字符串用
      

  3.   

    溢出了吧。[code=BatchFile][/code]
      

  4.   

    本来是用int类型的,换了long也不行,难道几万的数字也溢出,搞死脑筋了。
      

  5.   

    我发现了,是instr函数出现了问题原型如下:
    InStr([start, ]string1, string2[, compare])返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置。部分 说明 
    start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数,则一定要有 start 参数。 
    string1 必要参数。接受搜索的字符串表达式。 
    string2 必要参数。被搜索的字符串表达式。 
    Compare 可选参数。指定字符串比较。如果 compare 是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。 start的数值一旦超过26859,jspos的数值就变成了0,看起来是start的数值溢出了,不是在外面溢出,是在instr函数内溢出,也就是instr不支持超过26859,具体多少没检测,请问如何解决???
      

  6.   

    instr的start溢出
    还没听说过
    关注下吧
      

  7.   

    我现在说的是:]你这个这个“论断”是错误的!因为我刚才写了一段简单的程序测试了一下。
    Private Sub CommandButton1_Click()    Dim strText$
        strText = Me.TextBox1.Text
        Debug.Print Len(strText)
        Debug.Print InStr(45000, strText, "305 ,C 1, 0, 105.1509")
        
    End Sub
    输出结果:
     48988 
     48922 

      

  8.   

    每次步进的值为:968
    也就是说这个界限在:25891~26859之间,有用instr函数经验的谈一下,你们在strat中碰到最大的数是多少?程序到这里没办法解决了呀,真郁闷,这个解决了就能运行程序了。
      

  9.   

    简单说明一下:
    我找了一个文本文件,大小为约 16K,我在文本框中把这个文件的内容在 TextBox1 中粘贴了三次。
    因此总内容约 48K。305 ,C 1, 0, 105.1509 是文件结尾处的一段内容(它后面还有一点内容)。
    而你的内容才到 26859 处(相当于 26.2K 的地方)。
      

  10.   

    看来jsPos = InStr(Val(jsPos) + 25, Res, str1) 的返回值为0这里面也有奥妙,待我查看MSDN INSTR返回值。
    返回值如果                         InStr返回 
    string1 为零长度              0 
    string1 为 Null               Null 
    string2 为零长度              Start 
    string2 为 Null               Null 
    string2 找不到                0 
    在 string1 中找到string2      找到的位置 
    start > string2               0 看来,如果jsPos返回0,那看了上面只有三种可能了。
    1、string1 为零长度   这个看来不可能,jsPos是不断累加的,不太可能出现0值
    2、string2 找不到     这个也不太可能,原始数据都相同,没什么问题
    3、start > string2    这个是什么意思,start是数值,为什么要和str1 = " <table class=fenlei_list>"比呢,那看来是这里的问题了
      

  11.   


    你不能以“步进值”来控件查找位置。
    要是可以这样,你还不如找到第一个位置后,后面的直接计算了。比如你第一次找到的点是26015,查找第二处时,你应该:
    InInStr(2615 +1, str0, str2)================================================
    你的代码好象是这句吧:
    s2Lpos = InStr(s2Lpos + Len(str2), str0, str2)  '第2个你可以这样验证:
    1. 在这儿加一句:
    Debug.Print Len(str2)
    看每次 str2 的长度是否正常。2. 把你的代码改成:
    s2Lpos = InStr(s2Lpos + 1, str0, str2)  '第2个
    试一下这样能否正常执行。
      

  12.   

    第3.的意思是:比如:
    InStr(100, strText, strFind)如果执行时,strText 的内容长度只有99(这就是 start > string2 
    它的返回值就是 0 了。
      

  13.   

    晕哟,楼主在16楼的内容有问题吧?
    应该是: start > string1 才对呀!
      

  14.   

    晕,难道我这个简版的MSDN。是盗版,倒塌另外,res长度有29911长
      

  15.   

    针对你楼上说的,str1,str2……都是常数,虽然没定义常数,但也没有给他们赋值。
      

  16.   

    InStr() 的所有参数都可以是变量,也可以是常量。
    我没明白你21楼说的啥意思.......
      

  17.   

    ksPos:18148
    jsPos:18148
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:18148
    jsPos:19109
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:18148
    jsPos:19109
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:19109
    jsPos:19109
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:19109
    jsPos:20086
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:19109
    jsPos:20086
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:20086
    jsPos:20086
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:20086
    jsPos:21054
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:20086
    jsPos:21054
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:21054
    jsPos:21054
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:21054
    jsPos:22021
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:21054
    jsPos:22021
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:22021
    jsPos:22021
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:22021
    jsPos:22988
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:22021
    jsPos:22988
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:22988
    jsPos:22988
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:22988
    jsPos:23955
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:22988
    jsPos:23955
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:23955
    jsPos:23955
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:23955
    jsPos:24922
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:23955
    jsPos:24922
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:24922
    jsPos:24922
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:24922
    jsPos:25892
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:24922
    jsPos:25892
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:25892
    jsPos:25892
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:25892
    jsPos:26859
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:25892
    jsPos:26859
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:26859
    jsPos:26859
    Res:30513
    str1:25,<table class=fenlei_list>
    ksPos:26859
    jsPos:0
    Res:30513
    str1:25,<table class=fenlei_list>经过调试,就是不知道为什么到了15个循环,jspos就变成0了,哇靠,碰到幽灵了。
      

  18.   

    我又想到一个可能出错的地方,richTextbox用来装载res,用inet1从网上把网页文件download到richtextbox中,
    Private Sub cmdOnePrice_Click()    Dim strA As String
        Dim strB As String
        Dim strC As String
        
        strA = "http://www.xxx.cn/newresearch.asp?page="
        strB = dText2.Text
        strC = "&searchkey=&pinpai=&action=&Bigid=&jiage=&view=text"
        
        If Len(pageText1.Text) = 0 Then
            pageText1 = Inet1.OpenURL(strA + strB + strC) 
            用pagetext1装载30000个字符的网页文件,速度可能不会很快,导致没完全装载内容就运行到下面一个函数
            SearchOnePagePrice
            到了这里,上面的都能运行,后面确实的导致了错误??有这可能吗?
        Else
            pageText1 = Inet1.OpenURL(strA + strB + strC) 
            SearchOnePagePrice
        End If
        
        
    End Sub
      

  19.   

    回17楼的好人,
    1、str2的长度始终不改变,坚硬的就象钻石一样。
    2、+1跟len(str2)因该没什么区别,都可以运行。
    3、我在jsPos = InStr(Val(jsPos) + 25, Res, str1)前后设置了多个 kspos,jspos,str2等debug.print,只要一经过jsPos=instr(XXX),jsPos的值就一定会变成“0”,我想我们因该从jsPos为什么回变成0进行反推导。
      

  20.   

    发现错误点:
    循环内的上部:
           把:  str0 = Mid(Res, ksPos, jsPos - ksPos + 1)
           改成:str0 = Mid(Res, ksPos, Len(Res) - ksPos - 2841)解决问题!!!谢谢楼上的各位同学,结帖送分。