Как реализовать функции сопоставления и индекса вместе в Excel VBA?

Я пытаюсь найти номер строки первой ячейки, которые меньше нуля.
Таким образом, просматривая сеть, я смог придумать эту формулу, которая отлично работает:

=MATCH(TRUE,INDEX($C2531:$C2731 < 1,0),0)

но я хотел бы реализовать это в excel VBA, и я попробовал несколько вариантов, и я получаю ошибку несоответствия типа 13, Может кто-нибудь помочь мне в этом?

With Application.WorksheetFunction
    Range("C2527").Value = .Match(True, .Index(Range("C2531:C2731") < 1, 0), 0)
End With

спасибо заранее.

9
задан Kazimierz Jawor
05.04.2023 22:05 Количество просмотров материала 3587
Распечатать страницу

2 ответа

насколько я понимаю, вы используете оператор пересечения (пробел) в своей индексной формуле: "$C2531:$C2731 <1". Это позволит сравнить каждую ячейку в одном диапазоне ($C2531$C2731) с другим диапазоном, но в этом случае сравнение "<1". Таким образом, пересечение будет возвращать диапазон, содержащий истинное или ложное значение для каждого сравнения (т. е. формула массива.) Матч будет смотреть на этот результирующий диапазон для "истинных" значений.

другими словами, формула относительно сложный за кулисами, и хотя он короткий для чтения, в VBA вы хотите сохранить вещи как можно более простыми и ясными с точки зрения "за кулисами" - или вы столкнетесь с проблемами. То, что вы пытаетесь достичь, просто, но зубрить функции INDEX и MATCH в VBA нет.

в Visual Basic отсутствует собственный оператор пересечения. От того, что я могу найти, единственный эквивалент-это приложение.Функция пересечения, которая принимает объекты диапазона в качестве параметров. К сожалению, хотя вы можете создать первый диапазон как " Set myRange = Range ("$C2531:$C2731"), я не смог создать объект диапазона" <1 " в VBA, поскольку это не допустимый диапазон ячеек. Таким образом, кажется, что оператор пересечения в формулах Excel более способен/гибок, чем приложение.Метод пересечения в VBA. И это точка отказа здесь ("$C2531:$C2731 <1 " не является действительным VBA)

теперь вы можете потратить день, пытаясь увидеть, сможете ли вы пересечь диапазон и "<1 " в VBA, но есть более простые способы сделать это в VBA. Если бы это был я, я бы не использовал функции листа,а просто использовал стандарт...Следующий цикл, чтобы перейти по строкам и сделать сравнение в простой visual basic для каждой ячейки в диапазоне. Если одно сравнение совпадает, верните номер строки.

чтобы получить представление, это будет выглядеть примерно так:

Dim myRange As Range
Set myRange = Range("$C2531:$C2731")
For y = 1 to myRange.Cells.Rows.Count
   If y < 0 Then 
       result = myRange.Cells(y,1).Row
   End
Next y
2
отвечен mtone 2023-04-07 05:53

вы можете просто отправить формулу в виде строки. Ниже приведен пример.

Range("C2527").Value = "=MATCH(TRUE,INDEX($C2531:$C2731 < 1,0),0)"
1
отвечен Santosh 2023-04-07 08:10

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя

Похожие вопросы про тегам:

microsoft-excel
microsoft-excel-2007
microsoft-excel-2010
vba
worksheet-function
Вверх