Bagaimana cara mengimplementasikan fungsi MATCH dan INDEX bersama di Excel VBA?


3

Saya mencoba mencari nomor baris sel pertama yang kurang dari nol. Jadi, dengan menjelajahi internet saya dapat menemukan rumus ini yang berfungsi dengan baik:

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

Tetapi saya ingin mengimplementasikan ini dalam excel VBA dan saya mencoba beberapa opsi dan saya mendapatkan kesalahan ketik ketidakcocokan 13, dapatkah seseorang membantu saya dalam hal ini?

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

Terima kasih sebelumnya.

Jawaban:


2

Sejauh yang saya mengerti, Anda menggunakan operator persimpangan (spasi) dalam rumus INDEX Anda: "$ C2531: $ C2731 & lt; 1". Ini akan membandingkan setiap sel antara dalam satu rentang ($ C2531 $ C2731) dengan rentang lain, tetapi dalam hal ini perbandingan "& lt; 1". Jadi titik-temu akan mengembalikan rentang yang berisi nilai TRUE atau FALSE untuk setiap perbandingan (mis. Rumus array). MATCH kemudian akan melihat rentang yang dihasilkan untuk nilai "TRUE".

Dengan kata lain, rumus ini relatif rumit di belakang layar, dan meskipun singkat untuk dibaca, di VBA Anda ingin menjaga hal-hal sesederhana dan sejelas mungkin dari perspektif "di belakang layar" - atau Anda akan mengalami masalah . Apa yang ingin Anda capai adalah sederhana, namun menjejalkan fungsi INDEX dan MATCH ke dalam VBA tidak.

Dalam Visual Basic, tidak ada operator persimpangan asli. Dari apa yang saya dapat temukan, satu-satunya yang setara dengan adalah fungsi Application.Intersect, yang mengambil objek Range sebagai parameter. Sayangnya, meskipun Anda dapat membuat rentang pertama sebagai "Setel myRange = Rentang (" $ C2531: $ C2731 "), saya belum dapat membuat objek Rentang" & lt; 1 "di VBA, karena ini bukan valid rentang sel. Jadi sepertinya Operator titik-temu dalam Rumus Excel lebih mampu / fleksibel daripada metode Application.Intersect di VBA. Dan itulah titik kegagalan di sini ("$ C2531: $ C2731 & lt; 1" tidak VBA valid)

Sekarang Anda dapat menghabiskan satu hari mencoba melihat apakah Anda dapat memotong rentang dan "& lt; 1" di VBA, tetapi ada cara yang lebih sederhana untuk melakukan ini di VBA. Jika itu saya, saya tidak akan menggunakan fungsi Lembar Kerja, dan hanya menggunakan standar Untuk ... Loop berikutnya untuk membahas baris Anda dan melakukan perbandingan dalam dasar visual sederhana untuk setiap sel dalam Rentang Anda. Jika satu perbandingan cocok, kembalikan nomor baris.

Untuk mendapatkan ide, akan terlihat seperti:

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
Terima kasih mtone, saya mengerti kerumitan fungsi. Jadi saya menggunakan loop FOR NEXT sederhana dan saya bisa mendapatkan jawaban yang saya cari. Kode yang dimodifikasi adalah Dim Range1 Sebagai Range Set Range1 = Range ("$ C2531: $ C2731") Untuk Y = 1 Ke Range1.Cells.Rows.Count I = Range ("C2531"). .Nilai Jika Saya & lt; 1 Kemudian Rownum = Y GoTo Loop1end: End If Next Y Loop1end:
NK1

1

Anda cukup mengirim rumus sebagai string. Di bawah ini adalah contohnya.

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

Terima kasih Santosh, Itulah fungsi yang saya tulis tetapi saya sedang mencari bantuan untuk mewakili fungsi ini di VBA.
NK1
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.