如何快速在指定的栏col中查找所需要的首个符合条件的记录,
通常使用for进行的查询太慢了。
我知道在vsflexgrid中有个.FindRow的方法,速度非常快,
不知其是用的什么好的算法进行的。各位有没有什么好的方法。谢谢!

解决方案 »

  1.   

    排序,升序会打乱顺序,影响查找的结果。
    我需要的查找结果是,获得指定栏col符号条件的行row所在的位置例如我要查找name为"小明"的行name  information
    张三   ************
    李四   ************
    王佬六 ************
    小明   ************小华   ************
    ...   ............
    返回的值为4,因为小明在第四行。
    以上我通常使用
       for  
        if name="小明"  then
          ... 
           exit for
        end if
      next
    的方法,但如果数据量太多、查询结果较为靠后的话,查询的速度将非常慢.请各位帮忙想想有没有更快速的办法。谢谢!
      

  2.   

    Private Sub Command1_Click()
        Dim sColumn As String, i As Long
        With MSFlexGrid1
            '获取一整列
            .Col = 1
            .ColSel = 1
            .Row = 1
            .RowSel = .Rows - 1
            sColumn = .Clip
            '格式化以便查找
            sColumn = vbCr & Replace(sColumn, vbLf, vbNullString) & vbCr
            '查找
            i = InStr(sColumn, vbCr & "小明" & vbCr)
            If i > 0 Then
                Debug.Print "行号:", UBound(Split(Left(sColumn, i), vbCr))
            End If
        End With
    End Sub
      

  3.   

    楼主用什么方法查询的?
    我的电脑赛扬1.5,测试两万条数据,根本感觉不到延迟
    Private Sub Command1_Click()'填充测试数据
        Dim i As Long
        MSHFlexGrid1.Redraw = False
        For i = 1 To 20000
            MSHFlexGrid1.AddItem CStr(i) & vbTab & CStr(i)
        Next
        MSHFlexGrid1.Redraw = True
    End SubPrivate Sub Command2_Click()'查找倒数第二条
        Dim i As Long
        For i = 1 To 20000
            If MSHFlexGrid1.TextMatrix(i, 1) = "19999" Then
                MsgBox i & "--" & MSHFlexGrid1.TextMatrix(i, 1)
            End If
        Next
    End Sub
      

  4.   

    Tiger_Zhao 是一种新的方法,也让偶学会了使用.Clip,非常感谢,但实验证明这种方法并不如for 快yachong 的代码我进行了测试,并将最大值设为50000,且使用like函数来进行比较查询,速度确实很快。
    我不明白我以前使用这种办法测试为何会感觉很慢,我将再次进行测试。谢谢yachong !
      

  5.   

    其实要提高查找速度最好是随用户的输入维护一个带有行号字段的 RecordSet,这样等于将工作量平均到用户输入的时间中,查找起来会非常快。
      

  6.   

    如果不用数据库的话,最快的是用textarray来查找
    就一次循环
    假设你的GRID有6列,你要找的是第3列
    那么从大致代码为:
    WITH GRID1
       N=.ROWS*COLS-1
       FOR I=2 TO N STEP 6
          IF .TEXTARRAY(I)="..." THEN ...
       NEXT
    END WITH
    假设满足条件时的I=X
    那么X/6就是行数
      

  7.   

    我套用yachong 的代码,在两百万行的数据中查找1999999(两百万减1),分 另刂 亻吏 用了以下两种方法
    Private Sub Command2_Click() '查找倒数第二条
      Dim i As Long
        For i = 1 To Grid1.Rows - 1
            If Grid1.TextMatrix(i, 1) = CStr(Grid1.Rows - 2) Then
                MsgBox i & "--" & Grid1.TextMatrix(i, 1)  
                Exit For
            End If
        Next
        
    End Sub
    Private Sub Command3_Click()
    With Grid1
       N = .Rows * .Cols - 1
      For i = 2 To N Step 4
          If .TextArray(i) = CStr(Grid1.Rows - 2) Then
                MsgBox "找到了" & .TextArray(i)            
                Exit For
          End If
      Next
    End With
    End Sub结果找查的时间相同,都大约为10秒钟。所以以上的方法速度应该是相同的。
      

  8.   

    执行了二百万次CStr(Grid1.Rows - 2),应该会拖慢速度
    测试代码无所谓,正式代码就必须注意了