3

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

=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

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

2 ответа2

2

Насколько я понимаю, вы используете оператор пересечения (пробел) в вашей формуле INDEX: "$ C2531: $ C2731 <1". Это позволит сравнить каждую ячейку в одном диапазоне ($ C2531 $ C2731) с другим диапазоном, но в этом случае вместо этого будет выполнено сравнение «<1». Таким образом, пересечение будет возвращать диапазон, содержащий значение ИСТИНА или ЛОЖЬ для каждого сравнения (т. Е. Формула массива). Затем MATCH будет смотреть на этот результирующий диапазон для значений "ИСТИНА".

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

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

Теперь вы можете потратить целый день, пытаясь понять, можете ли вы пересечь диапазон и «<1» в VBA, но в VBA есть более простые способы сделать это. Если бы это был я, я бы не использовал функции Worksheet, а просто использовал бы стандартный For ...Следующий цикл, чтобы пройтись по строкам и провести сравнение в простой визуальной основе для каждой ячейки в вашем Range. Если одно сравнение совпадает, вернуть номер строки.

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

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
1

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

Range("C2527").Value = "=MATCH(TRUE,INDEX($C2531:$C2731 < 1,0),0)"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .