现在有a,b,c,d,e,f,g,h这几组数,每组数当中都是一些000---999的3位数
当Option1(1)被选择时然后点击Command1,执行
a--h这8组数互相进行俩俩循环比较,如ab,ac,ad,ae,af,ag,ah,bc,bd...............一直到gh,并且要找出每对当中相同的数字,然后在和MSFlexGrid1.TextMatrix(i, 1)里的数字比较然后在MSFlexGrid1.TextMatrix(i, 1)中去掉这些相同的
如a组里有568,437,002,011
  b组里有568,368,ab这对有相同的数字568,那么如果MSFlexGrid1.TextMatrix(i, 1)里也有568,那么将在MSFlexGrid1.TextMatrix(i, 1)删除568这行
当Option1(2)被选择时然后点击Command1,执行a--h这8组数互相进行三三循环比较,如abc,abd,abe,abf,abg,abh,bcd,bce,bcf...............一直到fgh,并且要找出每对当中相同的数字,然后在和MSFlexGrid1.TextMatrix(i, 1)里的数字比较然后在MSFlexGrid1.TextMatrix(i, 1)中去掉这些相同的
如a组里有568,437
  b组里有568,368
  c组里有123,567,345,568,abc这对都有相同的数字568,那么如果MSFlexGrid1.TextMatrix(i, 1)里也有568,那么将在MSFlexGrid1.TextMatrix(i, 1)删除568这行
这个循环该如何写

解决方案 »

  1.   

    如果数据量不大,就用简单的笨办法:
    无论是 ab 还是 abc,只要
    循环每个 a 中的成员,然后到 b、c 中查找是否存在相同成员,都存在的话就到 MSFlexGrid1 中删除。
      

  2.   

    都是三位数,可以循环中用filter函数比较....
      

  3.   

    Option ExplicitDim a, b, c, d, e, f, g, h
    Dim Arr, ArrComs
    Dim Idx() As Integer'进位(计算数组arr的index组合)
    Private Sub Carry(Idx() As Integer, m As Integer, n As Integer)
        
        Dim v As Integer
        Dim i As Integer
        v = m - n
        i = n
        Do
            Idx(i) = Idx(i) + 1
            If Idx(i) > v + i Then
                i = i - 1
            Else
                Exit Do
            End If
        Loop
        Do While i < n
            i = i + 1
            Idx(i) = Idx(i - 1) + 1
        LoopEnd Sub'由index得到数组的组合
    Private Sub GetArray(Arr, Idx() As Integer)
        
        Dim i As Integer
        For i = 1 To UBound(Idx)
            ArrComs(i - 1) = Arr(Idx(i) - 1)
        Next
      
    End Sub'各数组之比较,返回共有的值
    Private Function GetValue(aComs As Variant) As String
        
        Dim i As Integer, j As Integer
        Dim arrTmp
        Dim tmpValue
        Dim b As Boolean
        
        arrTmp = aComs(0)       '第一个数组
        For i = 0 To UBound(arrTmp)
            '分别取第一个数组的值,和其余数组比较
            tmpValue = arrTmp(i)
            b = False
            j = 1
            Do While j <= UBound(aComs)
                b = (UBound(Filter(aComs(j), tmpValue)) >= 0)
                If Not b Then Exit Do
                j = j + 1
            Loop
            If b Then GetValue = tmpValue
        Next
        
    End Function
    Private Sub Command1_Click()
        
        Dim m As Integer, n As Integer
        Dim i As Integer
        Dim s As String
        
        m = UBound(Arr) + 1
        n = 2       '2个一组比较,改为3,就是3个一组比较
        
        ReDim Idx(n)
        Idx(0) = -1
        For i = 1 To n
            Idx(i) = i
        Next
        
        ReDim ArrComs(n - 1)
        Do
            'DoEvents
            GetArray Arr, Idx             '当前组合
            s = GetValue(ArrComs)
            If s <> "" Then Debug.Print s
            Carry Idx, m, n               '计算下一个组合
        Loop Until Idx(0) = 0
        
    End SubPrivate Sub Form_Load()
        
        a = Array(123, 256, 369)
        b = Array(133, 256, 329)
        c = Array(423, 786, 319)
        d = Array(234, 412, 369)
        e = Array(121, 456, 124)
        f = Array(678, 256, 123)
        g = Array(234, 471, 789)
        h = Array(478, 145, 123)
        
        Arr = Array(a, b, c, d, e, f, g, h)
        
    End Sub搜索表格控件自己可以写了吧
      

  4.   

    上面有点错误,改一下:
    Option ExplicitDim a, b, c, d, e, f, g, h
    Dim Arr, ArrComs
    Dim Idx() As Integer'进位(计算数组arr的index组合)
    Private Sub Carry(Idx() As Integer, m As Integer, n As Integer)
        
        Dim v As Integer
        Dim i As Integer
        v = m - n
        i = n
        Do
            Idx(i) = Idx(i) + 1
            If Idx(i) > v + i Then
                i = i - 1
            Else
                Exit Do
            End If
        Loop
        Do While i < n
            i = i + 1
            Idx(i) = Idx(i - 1) + 1
        LoopEnd Sub'由index得到数组的组合
    Private Sub GetArray(Arr, Idx() As Integer)
        
        Dim i As Integer
        For i = 1 To UBound(Idx)
            ArrComs(i - 1) = Arr(Idx(i) - 1)
        NextEnd Sub'各数组之比较,返回共有的值
    Private Function GetValue(aComs As Variant) As String
        
        Dim i As Integer, j As Integer
        Dim arrTmp
        Dim tmpValue
        Dim b As Boolean
        
        arrTmp = aComs(0)       '第一个数组
        For i = 0 To UBound(arrTmp)
            '分别取第一个数组的值,和其余数组比较
            tmpValue = arrTmp(i)
            b = False
            j = 1
            Do While j <= UBound(aComs)
                b = (UBound(Filter(aComs(j), tmpValue)) >= 0)
                If Not b Then Exit Do
                j = j + 1
            Loop
            If b Then
                GetValue = tmpValue
                Exit Function
            End If
        Next
        
    End Function
    Private Sub Command1_Click()
        
        Dim m As Integer, n As Integer
        Dim i As Integer
        Dim s As String
        
        m = UBound(Arr) + 1
        n = 2       '2个一组比较,改为3,就是个一组比较
        
        ReDim Idx(n)
        Idx(0) = -1
        For i = 1 To n
            Idx(i) = i
        Next
        
        ReDim ArrComs(n - 1)
        Do
            'DoEvents
            GetArray Arr, Idx
            s = GetValue(ArrComs)
            If s <> "" Then Debug.Print s
            Carry Idx, m, n
        Loop Until Idx(0) = 0
        
    End SubPrivate Sub Form_Load()
        
        a = Array(123, 256, 369)
        b = Array(133, 256, 329)
        c = Array(423, 786, 319)
        d = Array(234, 412, 369)
        e = Array(121, 456, 124)
        f = Array(678, 256, 123)
        g = Array(234, 471, 789)
        h = Array(478, 145, 123)
        
        Arr = Array(a, b, c, d, e, f, g, h)
        
    End Sub
      

  5.   

    重大失误,测试数组修改为:    a = Array("123", "256", "369")
        b = Array("133", "256", "329")
        c = Array("423", "001", "319")
        d = Array("234", "412", "369")
        e = Array("121", "456", "124")
        f = Array("678", "256", "001")
        g = Array("234", "471", "789")
        h = Array("478", "145", "123")
        
        Arr = Array(a, b, c, d, e, f, g, h)因为用到filter,如果是数值型,001这样的数据就不准确了....