Применить формулу, вызвав функцию - PullRequest
0 голосов
/ 20 апреля 2020

Мне нужна помощь по моей проблеме.

У меня есть файл Excel с двумя листами, названными:

1.Холд

Hold worksheet

2.20Apr'20

enter image description here

Я хочу найти «все причины идентификатора» с помощью поиска. Ожидаемый результат, как показано ниже:

enter image description here

Я пытаюсь создать функцию для поиска всех значений причины идентификатора, однако результаты не удаются, что я получить # Имя в результате.

Это то, что у меня есть до сих пор.

Public Function Lookup_Concat(Search_ID As Range, Search_col As Range, Concat_del As String, Return_val_col As Range)
Dim i As Long, j As Long
Dim result As String
For i = 1 To Search_Col.Count
        For Each Value In Search_ID
            If Search_Col.Cells(i, 1) = Value Then
                result = result & Return_val_col.Cells(i, 1).Value & Concat_del
            End If
        Next Value
    Next i
    Lookup_Concat = Left(result, Len(result) - Len(Concat_del))

End Function



Sub Get_Reason()

WorkSheets("20Apr'20").Activate
Range("C:C" & lastrow).FormulaR1C1 = "=Lookup_Concat(=Lookup_concat(RC[-1]:R[4]C[-1],Hold!R[-1]C[-1]:R[6]C,"","",Hold!R[-1]C:R[6]C)"

End Sub

Вот что я получаю:

enter image description here

Очень признателен, если кто-то может мне помочь в этом.

1 Ответ

0 голосов
/ 20 апреля 2020

Извините, Наджа, я не могу разобрать, что вы собираетесь делать. Однако я надеюсь и верю, что приведенная ниже функция поможет вам продвинуться на шаг вперед. Попробуйте.

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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...