Как предотвратить потерю данных с помощью Application.VLookup?

#excel #vba

#excel #vba

Вопрос:

Следующий макрос использует функцию VLookup между двумя книгами. Обе книги содержат таблицы. Цель состоит в том, чтобы book1 обновил значения из book2

Потеря данных (ячейки, имеющие значения в книге 1, столбец 7 удаляется) происходит всякий раз, когда значение поиска отсутствует в книге 2. Что приводит к моему вопросу: как предотвратить это удаление?

 Sub Update()
Dim lookFor As Range
Dim srchRange As Range

Dim book1 As Workbook
Dim book2 As Workbook

Dim book2Name As String
book2Name = "table2.xlsm"

Dim book2NamePath As String
book2NamePath = ThisWorkbook.Path amp; "" amp; book2Name

Set book1 = ThisWorkbook

If IsOpen(book2Name) = False Then Workbooks.Open (book2NamePath)
Set book2 = Workbooks(book2Name)

Set lookFor = book1.Sheets(1).Range("a23:a100")
Set srchRange = book2.Sheets(1).Range("b:f")

lookFor.Offset(0, 7).Value = Application.VLookup(lookFor, srchRange, 2, False)

End Sub
  

Ответ №1:

Проверьте возвращаемое значение и обновите, только если есть что возвращать.

 Dim val as Variant

Set lookFor = book1.Sheets(1).Range("a23:a100")
Set srchRange = book2.Sheets(1).Range("b:f")

val = Application.VLookup(lookFor.Cells(1), srchRange, 2, False)

If Not IsError(val) Then
    lookFor.Offset(0, 7).Value = val
End If
  

Вы можете протестировать возврат к варианту с помощью Application.VLookup или приложение.Совпадение. Это должно быть возвращено к варианту, и это не работает с WorksheetFunction.VLookup или worksheetфункция.Совпадение.

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

1. В итоге получается та же функциональность, та же ошибка со значениями, отсутствующими в book1, удаляется при выполнении.

2. Если vlookup не находит совпадения, он возвращает #N / A. Вариант может перехватывать #N / A, и IsError имеет значение true, когда значение равно # N / A. Как это могло бы сделать то, что вы описываете? Возможно, вам следует опубликовать фактический код, поскольку мне пришлось изменить ваш vlookup, чтобы заставить его работать. Вы не можете просмотреть диапазон ВПР («a23: a100») сразу, вы должны выполнить поиск для каждой ячейки в диапазоне («a23: a100»).

3. опубликованный код работает с моей стороны… что вам пришлось изменить, чтобы это работало с вашей стороны?

4. vlookup предназначен для принятия одного значения в качестве первого аргумента. Вы вставили 78 значений (Range(«a23: a100»)) в первый аргумент, поэтому вы неявно используете Range («a23»).

5. Я допустил огромную ошибку, объясняя эту ошибку … поменяйте местами значения book1 и book2. Я использую book2 в качестве своего источника, из которого я хочу обновить — имеет ли это смысл? извините за путаницу… были внесены изменения в исходный вопрос