Como dividir e distribuir colunas como “A, B, C” e “X, Y, Z” em “A, X, B, Y, C, Z”?

1

então isso parece complicado para mim, mas eu tenho um conjunto de dados que precisam ser divididos em comlumns alternados aqui é o que eu quero dizer é no exemplo abaixo eu divido coluna A para CE e G ect dependendo de quantos conjuntos de dados estão na célula separaram minha vírgula e então separaram o comlumn B nos comlumns alternados DF e Hectect

    | Column A | Column B | Column C | Column D | Column E | Column F | Column G |Column  H |
    | A, B, C  | X, Y, Z  | A        | X        | B        | Y        | C        | Z        |

algo como acima e meu objetivo final é alcançar

   |     Column J    |
   |A, X, B, Y, C, Z |

por favor, se alguém puder ajudar é muito apreciado

    
por Mark 15.01.2015 / 03:29

3 respostas

1

Se você estiver disposto a usar o VBA, seria uma solução relativamente simples. Sim, ele usa o VBA, mas eu consideraria mais fácil seguir do que a solução alternativa que você teria que fazer com intervalos nomeados. O código é dado abaixo. Você chamaria essa função em sua planilha com uma função como =BlendCells(", ",A2,B2) . O primeiro parâmetro é strDelimiter , que permite inserir como o texto é separado. No seu exemplo, isso seria uma vírgula e um espaço. Os próximos dois paramaters são as duas células que você deseja mesclar.

Option Explicit

Public Function BlendCells(strDelimiter As String, Range1 As Range, Range2 As Range) As String

    'Declarations
    Dim arr1() As String
    Dim arr2() As String
    Dim i As Long

    'Setup each array
    arr1 = Split(Range1.Value, strDelimiter)
    arr2 = Split(Range2.Value, strDelimiter)

    'Blend the text
    For i = Application.Min(LBound(arr1), LBound(arr2)) To Application.Max(UBound(arr1), UBound(arr2))
        If i <= UBound(arr1) Then BlendCells = BlendCells & arr1(i) & strDelimiter
        If i <= UBound(arr2) Then BlendCells = BlendCells & arr2(i) & strDelimiter
    Next

    'Trim the results
    BlendCells = Left(BlendCells, Len(BlendCells) - Len(strDelimiter))

End Function
    
por 15.01.2015 / 19:36
1

Para obter as subcordas nas colunas individuais, você pode usar:

C1:  =INDEX(TRIM(MID(SUBSTITUTE(OFFSET($A$1,0,MOD(COLUMNS($A:A)+1,2)),",",REPT(" ",99)),{1,99,198},99)),MOD(COLUMNS($A:A)-1,3)+1)

e preencha a esquerda para I1.

Como alternativa, você pode usar a ferramenta Data / Text to Columns com a vírgula como um delimitador.

Para obter o resultado final, você pode concatenar as colunas individuais:

=B1 & "," & C1 & "," & D1 & "," & E1 & "," & F1 & "," & G1 & "," & H1 & "," & I1

ou, se você realmente não precisar das colunas individuais, poderá usar uma única fórmula:

J1: =CONCATENATE(
INDEX(TRIM(MID(SUBSTITUTE(A1,",",REPT(" ",99)),{1,99,198},99)),1),",",
INDEX(TRIM(MID(SUBSTITUTE(B1,",",REPT(" ",99)),{1,99,198},99)),1),",",
INDEX(TRIM(MID(SUBSTITUTE(A1,",",REPT(" ",99)),{1,99,198},99)),2),",",
INDEX(TRIM(MID(SUBSTITUTE(B1,",",REPT(" ",99)),{1,99,198},99)),2),",",
INDEX(TRIM(MID(SUBSTITUTE(A1,",",REPT(" ",99)),{1,99,198},99)),3),",",
INDEX(TRIM(MID(SUBSTITUTE(B1,",",REPT(" ",99)),{1,99,198},99)),3))

Se o número de segmentos for maior que três, simplesmente estenda a constante de matriz e a fórmula de concatenação. Se o número de segmentos for variável, uma solução de VBA seria mais simples, dependendo exatamente do que você deseja; a natureza dos dados, a localização da saída, etc.

    
por 15.01.2015 / 20:24
0

Esta não é uma tarefa fácil se você quiser implementá-lo sem o VBA.

Uma solução possível é usar algumas fórmulas de matriz dentro de intervalos nomeados:

  • selecione qualquer célula na primeira linha
  • abrir Formulas guia da faixa de opções > Name Manager dialog ( Ctrl + F3 )
  • insira um intervalo com New... de nome para cada uma das seguintes fórmulas:
    • copie e cole cada linha no campo Name: da caixa de diálogo New Name , depois recorte a parte da fórmula e cole-a no campo Refers to:
Name          Refers to
separator     =","
special       ="^"
enum          =ROW($1:$10)
each_left_A   =IFERROR(FIND(special, SUBSTITUTE($A1, separator, special, enum)), 999)
each_left_B   =IFERROR(FIND(special, SUBSTITUTE($B1, separator, special, enum)), 999)
each_right_A  =IFERROR(FIND(special, SUBSTITUTE($A1, separator, special, enum + 1)), 999)
each_right_B  =IFERROR(FIND(special, SUBSTITUTE($B1, separator, special, enum + 1)), 999)
nth_str       =MID($A1, each_left_A, each_right_A - each_left_A) & MID($B1, each_left_B, each_right_B - each_left_B)
space         =IF(MID(nth_str, 2, 1)=" ", " ", "")
first_str     =LEFT($A1, each_left_A) & space & LEFT($B1, each_left_B - 1)
  • em seguida, insira uma das seguintes fórmulas na coluna de saída (ela própria não é uma fórmula de matriz, portanto confirme apenas por ENTER , você pode repetir o INDEX tantas vezes quanto necessário - mas no máximo enum times, os índices extras produzirão apenas strings vazias, mas haverá uma penalidade de desempenho se sua tabela for grande) :

    =first_str & INDEX(nth_str, 1) & INDEX(nth_str, 2)
    =first_str & INDEX(nth_str, 1) & INDEX(nth_str, 2) & INDEX(nth_str, 3) & INDEX(nth_str, 4) & INDEX(nth_str, 5) & INDEX(nth_str, 6) & INDEX(nth_str, 7) & INDEX(nth_str, 8) & INDEX(nth_str, 9) & INDEX(nth_str, 10)
    

    Assim (printscreen do Excel 2010):

Porfavor,deixe-mesaberseénecessáriaumaexplicaçãodetalhadadetodas/algumasfórmulas.
Vejatambém Excel vocabulário para encontrar soluções mais rápidas .

    
por 15.01.2015 / 14:26