O ile rozumiem, używasz operatora przecięcia (spacji) w formule INDEX: „$ C2531: $ C2731 <1”. Spowoduje to porównanie każdej komórki z jednego zakresu (C2531 $ C2731) z innym zakresem, ale w tym przypadku porównanie „<1”. Więc Przecięcie zwróci zakres zawierający wartość PRAWDA lub FAŁSZ dla każdego porównania (tj. Formuła tablicowa). MATCH będzie następnie sprawdzał wynikowy zakres wartości „PRAWDA”.
Innymi słowy, formuła jest relatywnie złożona za kulisami i chociaż jest krótka do odczytania, w języku VBA chcesz zachować rzeczy tak proste i jasne, jak to możliwe z perspektywy „za kulisami” - lub napotkasz problemy . To, co starasz się osiągnąć, jest proste, ale nie można wcisnąć w VBA funkcji INDEX i MATCH.
W języku Visual Basic nie ma rodzimego operatora przecięcia. Z tego, co mogę znaleźć, jedynym odpowiednikiem jest funkcja Application.Intersect, która przyjmuje obiekty Range jako parametry. Niestety, chociaż pierwszy zakres można utworzyć jako „Ustaw myRange = Zakres („ $ C2531: $ C2731 ”), nie byłem w stanie utworzyć obiektu Zakres„ & lt; 1 ”w języku VBA, ponieważ nie jest to prawidłowy Wydaje się, że operator przecięcia w formułach Excela jest bardziej zdolny / elastyczny niż metoda Application.Intersect w VBA, a to jest punkt błędu tutaj („C2531: $ 2731 $ <1” nie jest prawidłowym VBA)
Teraz możesz spędzić dzień próbując sprawdzić, czy uda ci się przeciąć zakres i „<1” w języku VBA, ale istnieją prostsze sposoby, aby to zrobić w VBA. Gdybym to był ja, nie używałbym funkcji Arkusz i używałbym standardowej pętli For ... Next, aby przejść przez twoje wiersze i wykonać porównanie wizualnie podstawowe dla każdej komórki w Twoim Zasięg. Jeśli jedno porównanie się zgadza, zwróć numer wiersza.
Aby uzyskać pomysł, wyglądałoby to tak:
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