Нахождение всех значений ячейки (разделенных запятой) в определенной таблице - PullRequest
0 голосов
/ 07 мая 2019

Вот пример отчета, который у меня есть:

pic1

По сути, отчет состоит из огромного списка поставщиков, среди которых, помимо прочего, мне необходимо определить, какие из них имеют все объекты (группы контента) для одной и той же страны, игнорируя при этом тег «интегрировать». Объекты для каждой страны определены в таблице отдельно (справа).

До сих пор я пробовал комбинацию = SUMPRODUCT (- (ISNUMBER (SEARCH ())), но всегда получал частично то, что я хочу.

В столбце C, при необходимости:

  • для отображения ДА, если у поставщика в этой строке есть все объекты для указанного кода страны;
  • для отображения NO иначе;

Моя логика на этом:

Формула / ы должны выбрать код страны из 1-й таблицы, затем заглянуть во 2-ю таблицу, в которой определены объекты, и проверить, совпадают ли все объекты в группе содержимого, игнорируя "объединить", который является применяемым тегом по умолчанию. во всем мире.

Ожидаемый результат:

Pic2

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Если у вас версия Excel 2013+ с функцией FILTERXML, вы можете использовать эту формулу массива:

=IF(OR(ISNA(MATCH(FILTERXML("<t><s>"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,"Integrate",""),", ",","),",","</s><s>")&"</s></t>","//s"),INDIRECT("Table2["&B2&"]"),0))),"No","Yes")
  • Удаляем Integrate
  • Создать XML из строк в Таблице1
  • Извлечение каждого элемента из XML
  • Попробуйте найти их в соответствующем столбце таблицы 2
  • Если мы его не найдем, то у него будет несколько стран.

Поскольку это формула массива, вам необходимо «подтвердить» ее, удерживая ctrl + shift при нажатии , введите . Если вы сделаете это правильно, Excel поместит фигурные скобки {...} вокруг формулы, как показано в строке формул

enter image description here

Если у вас есть версия Excel, которая не имеет этой функции, и вы по-прежнему заинтересованы в использовании формул Excel, а не VBA, есть другая формула, которую мы можем использовать.

0 голосов
/ 07 мая 2019

Попробуйте:

Option Explicit

Sub test()

    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim LastRowA As Long, i As Long, y As Long
    Dim arr As Variant
    Dim CountryCode As String
    Dim rng As Range, SearchRange As Range, FindPosition As Range
    Dim Appears As Boolean

    'Set worksheets on variables
    With ThisWorkbook
        Set ws1 = .Worksheets("Sheet1")
        Set ws2 = .Worksheets("Sheet2")
    End With

    'Set the range to search in for country codes
    Set SearchRange = ws2.Range("H1:R1")

    With ws1

        'Find the last row of Column A sheet1
        LastRowA = .Cells(.Rows.Count, "A").End(xlUp).Row

        'Start loop from row 2 to last row sheet1
        For i = 2 To LastRowA

            'Criteria needed ( Column A - Not empty cell, Column D - Includes "Europe" & Column E - Includes "No" Columns D and E are CASE SENSITIVE)
            If .Range("A" & i).Value <> "" And .Range("D" & i).Value = "Europe" And .Range("E" & i).Value = "No" Then

                CountryCode = .Range("B" & i).Value

                'In which column the country code found
                Set FindPosition = SearchRange.Find(What:=CountryCode, LookIn:=xlValues, LookAt:=xlWhole)

                'If code excist
                If Not FindPosition Is Nothing Then

                    'Set the range to search for the groups in the column where the code is header
                    Set rng = ws2.Range(ws2.Cells(2, FindPosition.Column), ws2.Cells(ws2.Cells(ws2.Rows.Count, FindPosition.Column).End(xlUp).Row, FindPosition.Column))

                    'Split the string with comma and assing it on arr
                    arr = Split(.Range("A" & i).Value)

                    Appears = False

                    'Loop the arr
                    For y = LBound(arr) To UBound(arr)

                        'Check if the arr(y) start from C as all code start from C
                        If Left(arr(y), 1) = "C" Then

                            'Count how many times the arr(y) with out the comma appears in the rng
                            If Application.WorksheetFunction.CountIf(rng, Replace(arr(y), ",", "")) > 0 Then
                                'If appears the variable Appears is true
                                Appears = True
                            Else
                                'If does not appear the variable Appears is False & Exit the loop
                                Appears = False
                                Exit For
                            End If

                        End If

                    Next y

                    'Check Appears variable status and import value in Column C
                    If Appears = True Then
                        .Range("C" & i).Value = "Yes"
                    Else
                        .Range("C" & i).Value = "No"
                    End If

                'If code does not excist
                Else: MsgBox "Country Code not does not excist."

                End If

            End If

        Next i

    End With

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