Извините, Наджа, я не могу разобрать, что вы собираетесь делать. Однако я надеюсь и верю, что приведенная ниже функция поможет вам продвинуться на шаг вперед. Попробуйте.
Function GetReason(ID As Variant) As String
' 007
Dim Rng As Range
With Worksheets("20 Apr '20")
Set Rng = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp).Offset(, 1))
End With
On Error Resume Next
GetReason = Application.VLookup(ID, Rng, 2, False)
End Function
Функция Publi c, потому что все процедуры Publi c, если явно не объявлено как Private . Он должен вызываться с одним параметром, например,
Dim MyString as String
MyString = GetReason(3)
' or
Debug.Print GetReason(3)
' or - directly in the Immediate Window
? GetReason(3)
Он вернет значение из столбца B на листе Hold
, где столбец A имеет значение 3
. Обратите внимание на тип данных. Если Hold! A: A имеет номера, GetReason("3")
ничего не даст и vv
Теперь, если вы хотите использовать эту функцию в своем листе 20Apr'20
Вы можете вызвать функцию, как показано ниже.
With Worksheets("20Apr'20")
.Cells(2, "B").Value = GetReason(.Cells(2, "A").Value)
End With
Конечно, это можно поместить в al oop. Но обычно никто бы этого не сделал. Вместо этого можно развернуть процедуру события Change, прикрепленную к столбцу A, чтобы значение в столбце B изменялось всякий раз, когда пользователь вводит что-то в столбец A. Поскольку эта процедура будет в листе кода на вкладке «20 апреля 20», рабочий лист не нужно быть указан и следующий код будет достаточно. Вы можете установить его для тестирования.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range ' range containing IDs
Dim Cell As Range
Set Rng = Range(Cells(2, "A"), Cells(Rows.Count, "A").End(xlUp))
If Not Application.Intersect(Rng, Target) Is Nothing Then
' don't support multi-column paste operations
If Target.Columns.Count = 1 Then
' don't call this procedure on every change following here
Application.EnableEvents = False
For Each Cell In Target
Cell.Offset(, 1).Value = GetReason(Cell.Value)
Next Cell
Application.EnableEvents = True
End If
End If
End Sub
Фактически, я сконструировал этот код, чтобы он мог работать в al oop, используя небольшую хитрость: выберите все идентификаторы в столбце A, нажмите Скопируйте (или Ctl + C), а затем, оставив выделение как есть, немедленно нажмите Ctl + V , чтобы вставить значения в их исходное место. Excel воспримет это как изменение и заполнит искомые значения в столбце B для всех выбранных идентификаторов.
Пожалуйста, посмотрите, как далеко вы зашли. Сожалею, что не понял вашего намерения вокруг Lookup_Concat и concat_del .