Переписать функцию CHOOSE (с массивом) в VBA - PullRequest
0 голосов
/ 26 января 2019

У меня есть 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)

Я получаю сообщение об ошибке«Невозможно получить свойство CHOOSE класса функций листа»

1 Ответ

0 голосов
/ 26 января 2019

Все формулы листа можно использовать с vba. Для некоторых есть прямые альтернативы в VBA. Для лучшей читаемости имеет смысл разбить код на отдельные строки и использовать переменные:

Option Explicit
'/11073569/perepisat-funktsiy-choose-s-massivom-v-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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...