Страницы: 1
RSS
Как из одной ячейки исключить слова находящиеся в других ячейках
 
Здравствуйте, подскажите пожалуйста как из одной ячейки исключить слова находящиеся в других ячейках. У меня в ячейка "B13:K13", находятся текст который сцепляется функцией "сцепитьмного", взял отсюда, теперь нужно исключить слова из этой функции, которые находятся в ячейках "O13:X13". Можно конечно воспользоваться функцией "подставить", но это нужно прописывать для каждой ячейки. Есть какой-нибудь способ по короче?
 
если не писать отдельную функцию то можно заменив на TextJoin (ОБЪЕДИНИТЬ) встроенные или UDF и формулу массива
=TextJoin(";";;IF(ISNUMBER(MATCH(B13:K13;O13:X13;));"";B13:K13))
По вопросам из тем форума, личку не читаю.
 
А со "сцепить много", как то можно подружить Вашу функцию?
 
А никак, только если писать другую, которая уже из результата будет удалять лишние.
По вопросам из тем форума, личку не читаю.
 
Можно немного дописать, примерно так:
Код
Function СцепитьМного(Диапазон As Range, Optional Разделитель As String = " ", Optional БезПовторов As Boolean = False, Optional Исключение As Range)
    Dim avData, isData, lr As Long, lc As Long, sRes As String
    avData = Диапазон.Value
    If Not IsArray(avData) Then
        СцепитьМного = avData
        Exit Function
    End If
 
    For lc = 1 To UBound(avData, 2)
        For lr = 1 To UBound(avData, 1)
            If Len(avData(lr, lc)) Then
                sRes = sRes & Разделитель & avData(lr, lc)
            End If
        Next lr
    Next lc
    If Len(sRes) Then
        sRes = Mid(sRes, Len(Разделитель) + 1)
    End If
    
        Dim oDict As Object, sTmpStr
        Set oDict = CreateObject("Scripting.Dictionary")

    If БезПовторов Then
        sTmpStr = Split(sRes, Разделитель)
        On Error Resume Next
        For lr = LBound(sTmpStr) To UBound(sTmpStr)
            oDict.Add sTmpStr(lr), sTmpStr(lr)
        Next lr
        sRes = ""
        sTmpStr = oDict.keys
        For lr = LBound(sTmpStr) To UBound(sTmpStr)
            sRes = sRes & IIf(sRes <> "", Разделитель, "") & sTmpStr(lr)
        Next lr
    End If
    
    If Not Исключение Is Nothing Then
        isData = Исключение.Value
        sTmpStr = Split(sRes, Разделитель)
        oDict.RemoveAll
        For lc = 1 To UBound(isData, 2)
            For lr = 1 To UBound(isData, 1)
                If Len(isData(lr, lc)) Then
                    If Not oDict.Exists(isData(lr, lc)) Then oDict.Add isData(lr, lc), isData(lr, lc)
                End If
            Next lr
        Next lc
        sRes = ""
        For lr = LBound(sTmpStr) To UBound(sTmpStr)
            If Not oDict.Exists(sTmpStr(lr)) Then sRes = sRes & IIf(sRes <> "", Разделитель, "") & sTmpStr(lr)
        Next lr

    End If
    
    СцепитьМного = sRes
End Function
Изменено: Msi2102 - 22.10.2021 09:16:47
 
НУ да, ооочень круто, спасибо. А еще один вопрос, а если у меня сцепляет вот такого типа формулы "=ЕСЛИ(C6="";"";C6&СИМВОЛ(10))"", то тогда разделитель ставиться в начале, а не в конце. Ну это не критично, но все же может быть можно, сделать, чтобы он прописывался в конце. Я сделал так эту формулу, чтобы после сцепления Показывался весь текст ни одной строкой, а типа через ALT+ENTER
 
Цитата
Lerik2020 написал:
"=ЕСЛИ(C6="";"";C6&СИМВОЛ(10))""
А с какой целью Вы добавляете перенос строки в конец?
Если хотите, чтобы у Вас каждое слово было через перенос строки, то напишите так:
Код
=СцепитьМного(B13:K13;"; "&СИМВОЛ(10);1;O13:X13)
Изменено: Msi2102 - 22.10.2021 12:13:32
 
Msi2102, да Вы правы, забыл написать, дошло что надо писать так "=СцепитьМного(B13:K13;"; "&СИМВОЛ(10);1;O13:X13)"
Страницы: 1
Наверх