Persamaan Pencarian Referensi VBA

Berharap seseorang dapat membantu saya. Saya memiliki satu baris kode yang saya tidak mengerti mengapa ia menimbulkan kesalahan typemismatch. Apa yang saya coba capai adalah menggunakan pencocokan indeks untuk mencari nilai dan mengurangi, membagi, menambah, dll. nilai lain yang ditarik dengan pencocokan indeks. Saya telah mencari kemana-mana untuk melihat apakah ada pertanyaan serupa lainnya yang tidak berhasil. Saya telah mengkode VBA selama beberapa tahun, tetapi saya bingung karena beberapa alasan. Jika saya mengeluarkan rumus pencarian kedua dan tanda persamaan, kode berjalan dengan benar. Namun, begitu Anda menambahkan tanda minus, plus, atau pembagian, hasilnya akan error. Untuk memudahkan, semua variabel diredupkan dan diatur dengan benar. Bantuan apa pun akan dihargai. Kode ada di bawah. Terima kasih!

Dim qty as worksheet
Dim Imonth as integer, IImonth as integer
Dim lrow as long

With summary1
.Range("B3:B" & lrow).Formula =   Application.Iferror(Application.Index(qty.Columns(Imonth), Application.Match(.Range("A3:A" & lrow), qty.Columns(1), 0)) - Application.Index(qty.Columns(IImonth), Application.Match(.Range("A3:A" & lrow), qty.Columns(1), 0)), " ")

person krish86    schedule 15.03.2018    source sumber
comment
karena tidak seperti rumus pada lembar ketika kesalahan terjadi di vba, rumus itu berhenti. jadi ketika kecocokan tidak ditemukan, kesalahan diteruskan ke INDEX dan INDEX tidak tahu apa yang harus dilakukan sehingga kesalahan itu muncul. Anda perlu memisahkan kodenya dan menguji kesalahannya secara terpisah sebelum meneruskannya ke INDEX.   -  person Scott Craner    schedule 16.03.2018
comment
lihat: stackoverflow.com/ pertanyaan/49283620/   -  person Scott Craner    schedule 16.03.2018
comment
Apakah Anda menginginkan nilainya, atau Anda ingin rumus di sel itu?   -  person Scott Craner    schedule 16.03.2018
comment
Saya ingin nilainya dihitung dalam setiap sel dalam rentang tersebut, bukan rumus. Saya tahu ini bisa dilakukan dengan formulaR1C1, namun hal ini membuat program berjalan sangat lambat karena rumusnya terus diperbarui.   -  person krish86    schedule 16.03.2018
comment
maka Anda perlu mengulang setiap sel dan menetapkan nilai dari kode. Anda pasti ingin melihat tautan yang saya berikan.   -  person Scott Craner    schedule 16.03.2018
comment
Saya telah menjalankan setiap bagian secara terpisah dan tidak ada kesalahan yang ditemukan. Jika saya menjalankan pencarian referensi di sisi kiri persamaan, ini menghasilkan nilai yang benar. Jika saya menjalankan pencarian referensi di sisi kanan, itu juga menghasilkan nilai yang benar. Itu tidak akan menghitung perbedaan antara kedua nilai tersebut.   -  person krish86    schedule 16.03.2018
comment
Anda tidak dapat memasukkan nilai individual ke dalam rentang massa. Anda akan membutuhkan satu lingkaran.   -  person Scott Craner    schedule 16.03.2018
comment
Anda baru saja memberi saya ide dengan menggunakan loop. Saya berpotensi menjalankan pencarian referensi pertama, lalu mengulanginya kembali, mengambil selisih nilai pertama dari nilai referensi kedua. Terima kasih!   -  person krish86    schedule 16.03.2018
comment
ini akan lebih cepat jika Anda menarik kecocokan secara terpisah dan menetapkannya ke variabel. Kemudian gunakan .Cells() sebagai ganti INDEX.   -  person Scott Craner    schedule 16.03.2018
comment
Bisakah Anda memberikan contoh singkat agar saya lebih memahami saran Anda?   -  person krish86    schedule 16.03.2018


Jawaban (1)


Saya akan memuat semua ke dalam array memori dan kemudian mengulanginya.

Sub kjlk()


Dim qty As Worksheet
Dim Imonth As Integer, IImonth As Integer
Dim lrow As Long
Dim summary1 As Worksheet

'assign the variables
Set qty = Worksheets("Sheet1")
Set summary1 = Worksheets("Sheet2")

Imonth = 20
IImonth = 21

lrow = 20

Dim IMArr As Variant
Dim IIMarr As Variant
Dim lkupArr As Variant

IMArr = Intersect(qty.Columns(Imonth), qty.UsedRange).Value
IIMarr = Intersect(qty.Columns(IImonth), qty.UsedRange).Value
lkupArr = Intersect(qty.Columns(1), qty.UsedRange).Value

Dim InArr As Variant
Dim OutArr As Variant



With summary1
    InArr = .Range("A3:A" & lrow).Value
    ReDim OutArr(1 To UBound(InArr, 1), 1 To 1)
    Dim i As Long
    For i = 1 To UBound(InArr, 1)
        Dim mtch As Long
        mtch = WhereContains(lkupArr, InArr(i, 1))
        If mtch > -1 Then
            OutArr(i, 1) = IMArr(mtch, 1) - IIMarr(mtch, 1)
        Else
            OutArr(i, 1) = vbNullString
        End If
    Next i
   .Range("B3:B" & lrow).Value= OutArr
End With
End Sub

Function WhereContains(arr, v) As Long
Dim rv As Long, i As Long
    rv = -1
    For i = LBound(arr) To UBound(arr)
        If arr(i, 1) = v Then
            rv = i
            Exit For
        End If
    Next i
    WhereContains = rv
End Function
person Scott Craner    schedule 16.03.2018
comment
Saya akan mencobanya. Terima kasih untuk bantuannya. Terkadang menyenangkan untuk mendapatkan pemikiran lain. - person krish86; 16.03.2018