Страницы: 1
RSS
Проставить класс (или лучше категорию) по нескольким признакам
 
Всем привет!
Прошу помощи по ситуации:
Есть файл, в нем два листа (прилагаю пример).
На первом листе ("Исходник") - большой массив данных, с текстовыми признаками объектов, на втором ("Классы") - правила, по которым комбинации признаков относят эти объекты к тем или иным классам.
Задача - в столбец "Классы" листа "Исходник" проставить соответствующие классы из листа "Классы".
Так как не все признаки участвуют в присвоении классов, а разные их комбинации, то стандартная формула через ИНДЕКС и ПОИСКПОЗ не подходит, насколько я понимаю.

Прошу помочь советом, как решить задачу, буду премного благодарен!
 
Цитата
Формула массива для выборочного сравнения
Странно, что вы себя так ограничиваете. Достаточно легко задачу можно решить с использованием Power Query.
 
Мне на ум приходит способ с макросом, который устанавливает на диапазон с элементами на листе Исходник автофильтр, затем на листе Классы последовательно проходит по каждой строке с признаками класса, устанавливает в автофильтр на листе исходники признаки данного класса, для отфильтрованных строк в колонке Класс устанавливает значение класса. И так для всех классов.
Те элементы, которые не подходят ни под один класс останутся с пустыми значениями.
 
макросом
Код
Sub cls()
Dim diccl, cl As Worksheet, sh As Worksheet
Set diccl = CreateObject("Scripting.Dictionary")
Set cl = Worksheets("Классы")
Set sh = Worksheets("Исходник")
st = "не важно"
With cl
For i = 7 To .Cells(Rows.Count, 3).End(xlUp).Row
    k = .Cells(i, 3).Value & "|" & .Cells(i, 4).Value & "|" & .Cells(i, 5).Value & "|" & .Cells(i, 6).Value & "|" & .Cells(i, 7).Value
    diccl.Add k, .Cells(i, 8).Value
Next
End With
With sh
For i = 4 To .Cells(Rows.Count, 3).End(xlUp).Row
    For a = 1 To 3
    Select Case a
    Case 1
        k = .Cells(i, 3).Value & "|" & .Cells(i, 4).Value & "|" & .Cells(i, 5).Value & "|" & .Cells(i, 6).Value & "|" & .Cells(i, 7).Value
        If diccl.exists(k) Then .Cells(i, 8).Value = diccl.Item(k): Exit For
    Case 2
        k = .Cells(i, 3).Value & "|" & .Cells(i, 4).Value & "|" & st & "|" & st & "|" & .Cells(i, 7).Value
        If diccl.exists(k) Then .Cells(i, 8).Value = diccl.Item(k): Exit For
    Case 3
        k = .Cells(i, 3).Value & "|" & st & "|" & .Cells(i, 5).Value & "|" & .Cells(i, 6).Value & "|" & .Cells(i, 7).Value
        If diccl.exists(k) Then .Cells(i, 8).Value = diccl.Item(k): Exit For
    End Select
    Next
Next
End With
End Sub
 
kurchatovdv, возможно так .. не полностью понял...
формула массива
Код
=ПРОСМОТР(2;1/((C4=Классы!$C$7:$C$12)*(ЕСЛИ("не важно"=Классы!$D$7:$D$12;"не важно"=Классы!$D$7:$D$12;Исходник!D4=Классы!$D$7:$D$12))*(ЕСЛИ("не важно"=Классы!$E$7:$E$12;"не важно"=Классы!$E$7:$E$12;Классы!$E$7:$E$12=Исходник!E4))*(ИЛИ(Классы!$E$7:$E$12=Исходник!F4;"не важно"=Классы!$F$7:$F$12))*(Классы!$G$7:$G$12=Исходник!G4));Классы!$H$7:$H$12)
Изменено: a.i.mershik - 01.06.2018 11:12:31
Не бойтесь совершенства. Вам его не достичь.
 
Название темы. Если уберем формулу массива,останется сравнение. Что с чем? Для чего?
Прошу уточнить
 
Можно назвать - проставить класс (или лучше категорию) по нескольким признакам
Страницы: 1
Наверх