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