Ошибка «Недопустимый вызов процедуры или аргумент» в VBA - PullRequest
0 голосов
/ 21 апреля 2019

Я новичок в 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 Ответ

0 голосов
/ 21 апреля 2019

Ваша формула VLOOKUP:

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 так, чтобы вы передавали столбец, который по крайней мере существует в диапазоне, который вы передаете в качестве второго аргумента.


Кроме того, я рекомендую объявить эти переменные как тип 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 или какую-либо другую ошибку, значение ошибки может быть записано в ячейку вместо прерывания вашего макроса.

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

...