在VBA中重写CHOOSE函数(带有数组)

时间:2019-01-26 16:11:58

标签: excel vba

我有2个工作表(分别命名为A和B)

在工作表A中,第N列显示分数,而在D列显示学生的名字,我想找到最高的分数并显示学生的名字

由于VLOOKUP仅向右看(但D列在N列的左),我进行搜索并发现这种结合CHOOSE功能的方法可以实现“在表中的任何地方看”

因此在普通的excel函数中,它的编写方式如下

B3=VLOOKUP(MAX('A'!N2:N296),CHOOSE({1,2},'A'!N2:N296,'A'!D2:D296),2,0)

试图将功能转换为VBA代码,我尝试过:

Range("B3").Value = WorksheetFunction.VLookup(WorksheetFunction.Max(Worksheets("A").Range("N2:N296")), WorksheetFunction.Choose([1, 2], Worksheets("A").Range("N2:N296"), Worksheets("A").Range("D2:D296")), 2, 0)

我收到错误消息“无法获取worksheetfunction类的CHOOSE属性”

1 个答案:

答案 0 :(得分:0)

所有工作表公式均可与vba一起使用。对于某些人,vba中有直接替代品。为了获得更好的可读性,将代码分解为一行并使用变量是很有意义的:

Option Explicit
'https://stackoverflow.com/questions/54380167/rewriting-choose-function-with-array-in-vba
'Rewriting CHOOSE Function (with array) in VBA

Sub FindStudentWithMaxScore()
Dim MaxScore As Integer, IndexOfStudent As Integer
Dim StudentName As String
Dim ShA As Worksheet, ShB As Worksheet

Set ShA = Sheets("A")
Set ShB = Sheets("B")

    With Application.WorksheetFunction
        MaxScore = .Max(ShA.Range("N:N"))
        IndexOfStudent = .Match(MaxScore, ShA.Range("N:N"))
        StudentName = .Index(ShA.Range("D:D"), IndexOfStudent)
        'Debug.Print StudentName
        ShB.Range("B3").Value = StudentName
    End With

End Sub