2014-12-29 2 views
3

Я хочу объединить значения 9 столбцов в 1 столбец с | между значениями. Проблема в том, что некоторые из столбцов пустые для некоторых строк, что делает довольно уродливым использование функции = CONCATENATE(), так как вам нужно было бы проверить = if (A2 = ""; ...) для каждого из 9 столбцов.Как объединить несколько столбцов, если не пуст

Есть ли более умный способ объединить эти несколько столбцов в excel, только используя ячейку, в которой есть значения? Может быть, с помощью VBA?

В качестве примера, лист выглядит примерно так:

| A | B | C | D  | E  | F | G | H | I | 
|------+------+---+-------+---------+---+-----+-----+-----| 
| lion | king | |  | animals | |  |  | dog | 
| lion |  | | queen |   | | cat | jet |  | 

Выход для 1 линии должен быть: «лев | король | животные | собака» и для 2 строки: «лев | королев | cat | jet "

Может кто-нибудь помочь?

Большое спасибо!

+0

если нет некоторые другие данные, которые вы не показываете, пустой ячейка не повлияет на функцию конкатенации – SeanC

+0

@SeanCheshire Пустые ячейки не повлияют на функцию, но используются так, как предлагает OP, все равно будут создавать разделитель, что приведет к множеству нежелательных разделителей. Может быть, ОП может обновить вопрос, чтобы прояснить это. –

ответ

4

Вы можете использовать простой UDF:

Function MyConcat(ConcatArea As Range) As String 
    For Each x In ConcatArea: xx = IIf(x = "", xx & "", xx & x & "|"): Next 
    MyConcat = Left(xx, Len(xx) - 1) 
End Function 

Скопируйте приведенный выше код в стандартный модуль кода, и использовать на листе так:

=MyConcat(A1:J1)

Существует не в любом случае, делать это с помощью формулы рабочего листа без использования грязных функций SUBSTITUTE/IF.


EDIT (запрос OP)

Для удаления дубликатов:

Function MyConcat(ConcatArea As Range) As String 
    For Each x In ConcatArea: xx = IIf(x = "" Or InStr(1, xx, x & "|") > 0, xx & "", xx & x & "|"): Next 
    MyConcat = Left(xx, Len(xx) - 1) 
End Function 
+0

спасибо большое !! он отлично работал – user1507035

+0

просто из интереса: вы также можете изменить его, чтобы убедиться, что в Concat нет дубликатов? Если 2 столбца имеют то же самое значение, что оно появляется только один раз в строке? – user1507035

+0

Несомненно, см. Править выше :) –

0

Вы можете использовать UDF, как это (подстраиваться собственных нужд):

Function Conc(v As Variant, Optional ByVal sDelim As String = "") As String 
    Dim vLoop As Variant 
    If IsArray(v) Or TypeName(v) = "Range" Then 
     For Each vLoop In v 
      If Conc = "" Then 
       Conc = vLoop 
      ElseIf vLoop <> "" Then 
       Conc = Conc & sDelim & vLoop 
      End If 
     Next vLoop 
    Else 
     Conc = CStr(v) 
    End If 
End Function 
+0

FYI, нет необходимости делать эту изменчивую ситуацию, которую я вижу. – Rory

+0

@Rory - совершенно верно, исправление это. – xificurC

3
Public Function ConcatItNoDuplicities(ByVal cellsToConcat As Range) As String 
    ConcatItNoDuplicities = "" 
    If cellsToConcat Is Nothing Then Exit Function 
    Dim oneCell As Range 
    Dim result As String 
    For Each oneCell In cellsToConcat.Cells 
     Dim cellValue As String 
     cellValue = Trim(oneCell.value) 
     If cellValue <> "" Then 
      If InStr(1, result, cellValue, vbTextCompare) = 0 Then _ 
       result = result & cellValue & "|" 
     End If 
    Next oneCell 
    If Len(result) > 0 Then _ 
     result = Left(result, Len(result) - 1) 
    ConcatItNoDuplicities = result 
End Function 

enter image description here

Смежные вопросы