按条件选择单元格并在不同范围内打印

时间:2017-10-11 23:19:32

标签: excel vba

我想要代码:
对于他们的"排名B"低于"等级A",只取得得分最高的前3个,并将其与他们的分数一起放在"选择"右边的桌子。

enter image description here

我一直试图将它们收集到阵列中。

更新: 我使用Dy.Lee解决方案,它有效,除非我有一个大表(300行,12列),然后它在以下行失败:

enter image description here

enter image description here

我发现了问题,我在表的末尾有两个相同的列。有什么办法可以捕获这个异常?

2 个答案:

答案 0 :(得分:1)

试试这个

Sub test()
    Dim vDB, vR()
    Dim i As Long, n As Long
    Dim rngDB As Range

    vDB = Range("a1").CurrentRegion

    For i = 1 To UBound(vDB, 1)
        If vDB(i, 3) > vDB(i, 4) Then
            n = n + 1
            ReDim Preserve vR(1 To 2, 1 To n)
            vR(1, n) = vDB(i, 1)
            vR(2, n) = vDB(i, 2)
        End If
    Next i
    Range("g1").CurrentRegion.Offset(2).Clear
    If n = 0 Then
        MsgBox "No data matches the condition!!"
        Exit Sub
    ElseIf n = 1 Then
        Range("g3").Resize(n, 2) = vR
    Else
        Range("g3").Resize(n, 2) = WorksheetFunction.Transpose(vR)
    End If
    Set rngDB = Range("g2").Resize(n + 1, 2)
    rngDB.Sort key1:=Range("h2"), order1:=xlDescending, Header:=xlYes
    rngDB.Offset(4).Clear
End Sub

答案 1 :(得分:0)

如果你对公式解决方案而不是VBA开放,你可以选择 - 在每个单元格中输入单独的数组公式(ctrl + shift + enter):

G3-G5: {=INDEX($A$2:$A$8,MATCH(1,INDEX(($B$2:$B$8=LARGE($B$2:$B$8*--($C$2:$C$8>$D$2:$D$8),ROWS(G$2:G2)))*(COUNTIF(G$2:G2,$A$2:$A$8)=0),),0))}

在H列中,作为单独的数组公式输入(ctrl + shift + enter):

H3-5: {=LARGE($B$2:$B$8*--($C$2:$C$8>$D$2:$D$8),row()-2)}

附件是一个截图,可以看到它正在使用中。一般来说,我建议不要使用VBA来解决用公式解决的问题,但这只是我。 Screenshot of result