Получение ошибки «Недопустимого вызова процедуры или аргумента» в VBA

#vba #vlookup #userform

#vba #ВПР #пользовательская форма

Вопрос:

Я новичок в vba и столкнулся с некоторыми проблемами.

Я хочу найти что-то на другом листе и скопировать значение соответствия в другую ячейку

VBA сказал, что это был последний код с проблемой.

 Private Sub ReferenceOk_Click()

Dim nextRefRec As Integer
Dim i As Integer
Dim ListNo As Integer

ListNo = ListBoxBook.ListIndex
If ListNo < 0 Then
    MsgBox "Please select any book"
    Exit Sub
End If


Sheets("Rental History").Activate
nextRefRec = Cells(Rows.Count, 2).End(xlUp).Row   1
For i = 0 To 1
    Cells(nextRefRec, i   3).Value = ListBoxBook.List(ListNo, i)
Next i
Cells(nextRefRec, 3).NumberFormat = "0000"
Cells(nextRefRec, 2).NumberFormat = "00000"
Cells(nextRefRec, 2).Value = TxtMemberNo.Value
Cells(nextRefRec, 5).Value = Date
Cells(nextRefRec, 6).Value = Date   TxtRentalDays.Value
Cells(nextRefRec, 7).Value = Application.WorksheetFunction.VLookup(Worksheets("Rental History").Cells(nextRefRec, 4), Worksheets("Book List").Cells("B4:C24"), 6, False)

End Sub
  

Комментарии:

1. Возможно, для этого вам не понадобится VBA. Вы могли бы попробовать ИНДЕКС (MATCH ()), прочитать это: exceljet.net/index-and-match

Ответ №1:

Ваша формула ВПР:

 VLookup(Worksheets("Rental History").Cells(nextRefRec, 4), Worksheets("Book List").Cells("B4:C24"), 6, False)
  

кажется недопустимым.

Диапазон Worksheets("Book List").Cells("B4:C24") содержит 2 столбца, но ваш третий аргумент 6 . Другими словами, вы пытаетесь получить 6-й столбец диапазона из 2 столбцов (который, очевидно, не существует). Так что на данный момент он, вероятно, возвращает #REF ошибку.

Дополнительная информация VLOOKUP , если необходимо: https://support.office.com/en-us/article/vlookup-function-0bbc8083-26fe-4963-8ab8-93a18ad188a1

Исправьте свою VLOOKUP формулу так, чтобы вы передавали столбец, который, по крайней мере, существует в диапазоне, который вы передаете в качестве второго аргумента.


Кроме того, я рекомендую объявлять эти переменные как type Long (для предотвращения ошибок переполнения типа):

 Dim nextRefRec As Integer
Dim i As Integer
Dim ListNo As Integer
  

и изменение этой строки:

 Cells(nextRefRec, 7).Value = Application.WorksheetFunction.VLookup(Worksheets("Rental History").Cells(nextRefRec, 4), Worksheets("Book List").Cells("B4:C24"), 6, False)
  

к этому (кроме того, исправьте свои VLOOKUP аргументы, как указано выше):

 Cells(nextRefRec, 7).Value = Application.VLookup(Worksheets("Rental History").Cells(nextRefRec, 4), Worksheets("Book List").Cells("B4:C24"), 6, False)
  

так что, если VLOOKUP возвращается #N/A или какая-либо другая ошибка, значение ошибки может быть записано в ячейку вместо прерывания вашего макроса.

Ваш код неявно ссылается на любой лист, который оказывается активным во время выполнения кода. Попробуйте обратиться к родительской рабочей книге и рабочему листу (на случай, если активный лист не тот, который вы считаете).