Vlookup несколько значений, разделенных точкой с запятой - PullRequest
0 голосов
/ 22 октября 2018

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

У меня есть один такой столбец:

UMLS CODE
C0443147
C0441748;C4020899
C4025900
C0085606;C3544092;C4020898

И мне нужно сопоставить следующие данные с приведенным выше столбцом.

UMLS CODE  TYPE    MEDDRA CODE         DEFINITION
C0443147    LT;PT   10014275;10014407   EEG;Electroencephalogram
C4020899    LT;PT   10014544;10014430   EMG;Electromyogram
C3544092    OL;LT   10014828;10014449   Electronystagmography
C0013854    PT;LT   10014455;10014359   Electro-oculogram

Таким образом, результат, соответствующий столбцу КОДОВ UMLS, должен быть таким:

UMLS CODE                  UMLS CODE  TYPE    MEDDRA CODE         DEFINITION
C0443147                   C0443147   LT;PT   10014275;10014407   EEG;Electroencephalogram
C0441748;C4020899          C4020899   LT;PT   10014544;10014430   EMG;Electromyogram
C4025900                   -------    -----   -----------------   -------------------
C0085606;C3544092;C4020898 C3544092   OL;LT   10014828;10014449   Electronystagmography

Я попробовал следующую формулу наExcel, но не работает, когда искомое значение имеет несколько значений, разделенных точкой с запятой.

= VLOOKUP ($ A1; $ A $ 13819: $ D $ 63379; COLUMN (A: A); 0)

Где $ A1 - это UMLS-код, а $ A $ 13819: $ D $ 63379 - это все данные для сопоставления с UMLS-кодом.

Изображения из кодов UMLS: enter image description here

Изображение из данных UMLS: enter image description here

Результат желателен, но работает также в нескольких ячейках значений, разделенных точкой с запятой из кода UMLS: enter image description here

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

при условии, что у вас есть максимальное количество кодов UMLS в вашем списке (я предположил 3)

Таблица в строке 8-12 является промежуточным шагом, который просто упрощает ее, можно поместить в конечную функцию, еслиВы так выбираете.

= TRIM (MID (ЗАМЕНА ($ A5; ";"; REPT (""; LEN ($ A5))); (C $ 8) * LEN ($ A5) +1;LEN ($ A5)))

enter image description here

= IFERROR (VLOOKUP ($ A12; $ C $ 2: $ F $ 5; 4; FALSE); IFERROR(VLOOKUP ($ B12; $ C $ 2: $ F $ 5; 4; FALSE); VLOOKUP ($ C12; $ C $ 2: $ F $ 5; 4; FALSE)))

enter image description here

Столбец A16 просто = A2 и т. Д.

0 голосов
/ 22 октября 2018

@ S.Ram,

Импорт данных на листе 1, как на рисунке:

enter image description here

Импорт данных на листе 2как на рисунке:

enter image description here

и попробуйте:

Option Explicit
Option Explicit

Sub test()

Dim LastRow1 As Long
Dim LastRow2 As Long
Dim i As Long
Dim j As Long
Dim Word As String
Dim Word1 As String
Dim Word2 As String
Dim SpecialChr As Long
Dim Position As Long
Dim Position2 As Long

LastRow1 = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
LastRow2 = Sheet2.Range("B" & Rows.Count).End(xlUp).Row

 With Sheet1

    For i = 2 To LastRow1

        SpecialChr = (Len(.Range("A" & i).Value) - Len(Replace(.Range("A" & i).Value, ";", ""))) / Len(";")

        If SpecialChr = 0 Then
            Word = .Range("A" & i).Value
            With Sheet2
                For j = 2 To LastRow2
                    If .Range("B" & j).Value = Word Then
                        .Range("B" & j).Offset(0, -1).Value = Word
                    End If
                Next j
            End With
        ElseIf SpecialChr = 1 Then
            Position = InStr(1, .Range("A" & i).Value, ";")
            Word = Left(.Range("A" & i).Value, Position - 1)
            Word1 = Right(.Range("A" & i).Value, Position - 1)
            With Sheet2
                For j = 2 To LastRow2
                    If .Range("B" & j).Value = Word Then
                        .Range("B" & j).Offset(0, -1).Value = Word
                    ElseIf .Range("B" & j).Value = Word1 Then
                        .Range("B" & j).Offset(0, -1).Value = Word1
                    End If
                Next j
            End With
        ElseIf SpecialChr = 2 Then
            Position = InStr(1, .Range("A" & i).Value, ";")
            Position2 = InStr(Position + 1, .Range("A" & i).Value, ";")
            Word = Left(.Range("A" & i).Value, Position - 1)
            Word1 = Mid(.Range("A" & i).Value, Position + 1, Len(.Range("A" & i).Value) - Position2)
            Word2 = Right(.Range("A" & i).Value, Position - 1)
            With Sheet2
                For j = 2 To LastRow2
                    If .Range("B" & j).Value = Word Then
                        .Range("B" & j).Offset(0, -1).Value = Word
                    ElseIf .Range("B" & j).Value = Word1 Then
                        .Range("B" & j).Offset(0, -1).Value = Word1
                    ElseIf .Range("B" & j).Value = Word2 Then
                        .Range("B" & j).Offset(0, -1).Value = Word2
                    End If
                Next j
            End With
        End If
    Next i
End With

End Sub

Finnaly, результаты будут импортированы в желтую область Sheet2.

...