请教大家,假如有个一维数组
a(1)="Y111"
a(2)="Y222"
a(3)="Y112"现在我知道数组中有个 Y112 的值,要快速找出是属于a数组的那一项值(即知道项值是3),不用循环,有没什么快速的方法找出来? (另试过Filter函数,但并不能如愿)

解决方案 »

  1.   

    当然可以,这样来(参考):Option Explicit
    Private Sub Form_Load()
            Dim i As Integer
            For i = 0 To 32766
                List1.AddItem "Y" & Format(i, "00000")
            Next
    End Sub
    Private Sub Command1_Click()
            '设置只读属性List1.Sorted = True
            Debug.Print List1.List(112)   '找出并输出Y00112这一项
    End Sub
      

  2.   

    你现在这个样子是不行的。如果你事先排过序,可以折半查找。否则必须遍历(当然可以在找到后跳出循环,平均查找次数是数组大小的一半。)还有一种办法,利用 ListBox 或 ComboBox,用 API 函数直接返回索引值。Private Declare Function SendMessagebyString Lib _
    "user32" Alias "SendMessageA" (ByVal hWND As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, _
    ByVal lParam As String) As LongPrivate Const LB_FINDSTRINGEXACT = &H1A2    '在 ListBox 中精确查找
    Private Const CB_FINDSTRINGEXACT = &H158    '在 ComboBox 中精确查找例:n = SendMessagebyString (List1.hwnd, LB_FINDSTRINGEXACT, -1, "Y112")
      

  3.   

    这样也行?忘了说明,数组的值是不确定的,再你一开始就来For i = 0 To 32766,那和我在来循环数组没区别嘛,我要的是不用循环哦
      

  4.   

    to of123
    即你提到ListBox,我顺便请教一下,动态添ListBox项和值时,默认ListBox的项必需是0开始编起,而我想指定什么样的数字做为项都可以(当然不会重)该怎做的?
      

  5.   

    TO of123 && chenjl1031 我在试ListBox,顺便请教一下,动态添ListBox项和值时,默认ListBox的项必需是0开始编起,而我想指定的随机数字做为项(当然数字不重复)该怎做的?
      

  6.   

    Function GetValue(arr() As String, res As String) As Long
        Dim tmp
        tmp = Join(arr)
        tmp = Split(tmp, res, 2)(0)
        GetValue = UBound(Split(tmp, Chr(32)))
    End Function'测试:
    Private Sub Command1_Click()
        
        Dim i As Long
        Dim arr(3000) As String
        
        '添加测试数据
        For i = 0 To 3000
            arr(i) = Chr(Int(Rnd * 26 + 65)) & Int(Rnd * 999)
        Next
        'Debug.Print arr(1000)
        MsgBox GetValue(arr, "U245")
        'Debug.Print arr(2999)
        MsgBox GetValue(arr, "L267")
        
        
    End Sub
      

  7.   

    改一下
    Function GetValue(arr() As String, res As String) As Long
        Dim tmp
        
        res = Chr(32) & res & Chr(32)
        tmp = Chr(32) & Join(arr) & Chr(32)
        If InStr(tmp, res) = 0 Then   '不存在
            GetValue = -1
            Exit Function
        End If
        tmp = Split(tmp, res, 2)(0)      
        GetValue = UBound(Split(tmp, Chr(32)))
    End Function
      

  8.   

    TO vbman2003 
    试了一下你给的代码,发现个BUG,如两个以上数组等于相同的值,但只能找出一个项,这时应该要两个以上了
      

  9.   

    不增加其它数据结构的情况下,循环是最直接的。
    或者你喜欢这样
    dim i as long
    select case "Y112"
        case a(1): i =1
        case a(2): i =2
        case a(3): i =3
    end slect
    debug.print i
      

  10.   

    还是要循环:
    Sub GetValue(arr() As String, res As String)
        Dim tmp
        Dim i As Long, n As Long
        
        res = Chr(32) & res & Chr(32)
        tmp = Chr(32) & Join(arr) & Chr(32)
        
        While InStr(tmp, res)
            DoEvents
            tmp = Mid(tmp, 1, InStrRev(tmp, res))
            n = UBound(Split(tmp, Chr(32)))
            Debug.Print n - 1
        Wend
        
    End Sub