Excel - 根据列标准随机选择行,不重复/重复

时间:2016-05-03 09:31:53

标签: excel vba excel-vba

我从网站导入此列表(并且偶尔更新):第一列(A)具有名字,第二列(B)具有姓氏,第三列(c)具有公司名称。

我想根据某家公司随机选择一行(包括名字,姓氏和公司名称)。

现在到了棘手的部分:下次不能随机选择(名字,姓氏)。

1 个答案:

答案 0 :(得分:0)

我们可以分两步完成:

  1. 收集某个公司的人员名单
  2. 随机播放步骤#1中的列表
  3. 假设我们有1000个人喜欢:

    enter image description here

    E1 中,我们放置公司名称。然后在 D1 中输入:

    =IF(C1=$E$1,1,"")
    

    并在 D2 中输入:

    =IF(C2=$E$1,1+MAX($D$1:D1),"")
    

    并复制下来。这将为人们生成检索密钥。要计算要在 E2 中检索的人数,请输入:

    =MAX(D:D)
    

    要检索人员,请在 F1 中输入:

    =IF(ROW()>$E$2,"",INDEX(A:A,MATCH(ROWS($1:1),D:D,0))& " " & INDEX(B:B,MATCH(ROWS($1:1),D:D,0)))
    

    并向下复制。

    在步骤#2中,我们运行一个宏来将人员排在 F 栏中,将其洗牌,然后将洗牌后的列表放在

    Sub createPickList()
        Dim N As Long, i As Long
    
        N = Range("E2").Value
        ReDim arr(1 To N)
        For i = 1 To N
            arr(i) = Cells(i, "F").Value
        Next i
    
        Call aSort(arr)
    
        For i = 1 To N
            Cells(i, "G").Value = arr(i)
        Next i
    End Sub
    Public Sub aSort(ByRef InOut)
    
        Dim i As Long, J As Long, Low As Long
        Dim Hi As Long, Temp As Variant
    
        Low = LBound(InOut)
        Hi = UBound(InOut)
    
        J = (Hi - Low + 1) \ 2
        Do While J > 0
            For i = Low To Hi - J
              If InOut(i) > InOut(i + J) Then
                Temp = InOut(i)
                InOut(i) = InOut(i + J)
                InOut(i + J) = Temp
              End If
            Next i
            For i = Hi - J To Low Step -1
              If InOut(i) > InOut(i + J) Then
                Temp = InOut(i)
                InOut(i) = InOut(i + J)
                InOut(i + J) = Temp
              End If
            Next i
            J = J \ 2
        Loop
    End Sub
    

    enter image description here

    您的第一个选择将是 G1 ,下一个选择将是 G2 等。所有被选中的人都将是GE人员,并且不会重复。