VinculaciĆ³n de texto por condiciĆ³n

Xa escribĆ­n sobre como podes pegar rapidamente texto de varias celas nunha soa e, pola contra, analizar unha cadea de texto longa en compoƱentes. Agora vexamos unha tarefa prĆ³xima, pero un pouco mĆ”is complexa: como pegar texto de varias celas cando se cumpre unha determinada condiciĆ³n especificada. 

Digamos que temos unha base de datos de clientes, onde o nome dunha empresa pode corresponder a varios correos electrĆ³nicos diferentes dos seus empregados. A nosa tarefa Ć© recoller todos os enderezos por nomes de empresas e concatenalos (separados por comas ou punto e coma) para facer, por exemplo, unha lista de correo para os clientes, Ć© dicir, obter algo como:

VinculaciĆ³n de texto por condiciĆ³n

Noutras palabras, necesitamos unha ferramenta que pegue (enlace) o texto segundo a condiciĆ³n: un anĆ”logo da funciĆ³n SUMMESLI (SUMIF), pero para texto.

MĆ©todo 0. FĆ³rmula

Non moi elegante, pero o xeito mĆ”is sinxelo. Podes escribir unha fĆ³rmula sinxela que comprobarĆ” se a empresa da seguinte fila difire da anterior. Se non difire, pega o seguinte enderezo separado por coma. Se difire, "restablecemos" o acumulado, comezando de novo:

VinculaciĆ³n de texto por condiciĆ³n

As desvantaxes deste enfoque son obvias: de todas as celas da columna adicional obtidas, sĆ³ necesitamos as Ćŗltimas para cada empresa (amarelas). Se a lista Ć© grande, para seleccionalas rapidamente, terĆ”s que engadir outra columna usando a funciĆ³n DLSTR (LEN), comprobando a lonxitude das cadeas acumuladas:

VinculaciĆ³n de texto por condiciĆ³n

Agora podes filtrar os e copiar os enderezos necesarios para o seu uso posterior.

MĆ©todo 1. MacrofunciĆ³n de pegado por unha condiciĆ³n

Se a lista orixinal non estĆ” ordenada por compaƱƭa, a fĆ³rmula simple anterior non funciona, pero podes moverte facilmente cunha pequena funciĆ³n personalizada en VBA. Abre o Editor de Visual Basic premendo un atallo de teclado Alt + F11 ou usando o botĆ³n Visual Basic aba revelador (Desenvolvedor). Na xanela que se abre, insira un novo mĆ³dulo baleiro a travĆ©s do menĆŗ Inserir ā€“ MĆ³dulo e copia alĆ­ o texto da nosa funciĆ³n:

FunciĆ³n MergeIf(TextRange As Range, SearchRange As Range, Condition As String) Dim Delimeter As String, i As Long Delimeter = ", " os encolados non son iguais entre si - saĆ­mos cun erro Se SearchRange.Count <> TextRange.Count A continuaciĆ³n, MergeIf = CVErr(xlErrRef) SaĆ­r FunciĆ³n Final Se 'pasa por todas as celas, comprobe a condiciĆ³n e recolle o texto na variable OutText For i = 1 To SearchRange. Cells.Count If SearchRange.Cells(i) Like Condition Then OutText = OutText & TextRange.Cells(i) & Delimeter A continuaciĆ³n mostro os resultados sen o Ćŗltimo delimitador MergeIf = Left(OutText, Len(OutText) - Len(Delimeter)) End funciĆ³n  

Se agora volves a Microsoft Excel, na lista de funciĆ³ns (botĆ³n fx na barra de fĆ³rmulas ou na pestana FĆ³rmulas: funciĆ³n de inserciĆ³n) serĆ” posible atopar a nosa funciĆ³n CombinarSe na categorĆ­a Definido polo usuario (Definido polo usuario). Os argumentos da funciĆ³n son os seguintes:

VinculaciĆ³n de texto por condiciĆ³n

MĆ©todo 2. Concatenar texto por condiciĆ³n inexacta

Se substituĆ­mos o primeiro carĆ”cter da liƱa 13 da nosa macro = ao operador de coincidencia aproximada como, entĆ³n poderase realizar o encolado mediante unha coincidencia inexacta dos datos iniciais co criterio de selecciĆ³n. Por exemplo, se o nome da empresa pode escribirse en diferentes variantes, poderemos verificalos e recollelos todos cunha soa funciĆ³n:

VinculaciĆ³n de texto por condiciĆ³n

Admƭtense os comodƭns estƔndar:

  • asterisco (*): indica calquera nĆŗmero de caracteres (incluĆ­da a sĆŗa ausencia)
  • signo de interrogaciĆ³n (?): representa calquera carĆ”cter
  • signo de libra (#): representa un dĆ­xitos (0-9)

Por defecto, o operador Like distingue entre maiĆŗsculas e minĆŗsculas, Ć© dicir, entende, por exemplo, "Orion" e "orion" como empresas diferentes. Para ignorar maiĆŗsculas e minĆŗsculas, pode engadir a liƱa ao principio do mĆ³dulo no editor de Visual Basic OpciĆ³n Comparar texto, que cambiarĆ” a Like para que non distinga entre mayĆŗsculas e minĆŗsculas.

Deste xeito, podes compoƱer mĆ”scaras moi complexas para comprobar as condiciĆ³ns, por exemplo:

  • ?1##??777RUS: selecciĆ³n de todas as matrĆ­culas da rexiĆ³n 777, comezando por 1
  • LLC*: todas as empresas cuxo nome comeza por LLC
  • ##7##: todos os produtos cun cĆ³digo dixital de cinco dĆ­xitos, onde o terceiro dĆ­xitos Ć© 7
  • ???? ā€“ todos os nomes de cinco letras, etc.

MĆ©todo 3. FunciĆ³n de macro para pegar texto en dĆŗas condiciĆ³ns

No traballo pode haber un problema cando necesites ligar o texto mĆ”is dunha condiciĆ³n. Por exemplo, imaxinemos que na nosa tĆ”boa anterior engadiuse unha columna mĆ”is coa cidade e o encolado deberĆ­a realizarse non sĆ³ para unha determinada empresa, senĆ³n tamĆ©n para unha determinada cidade. Neste caso, a nosa funciĆ³n terĆ” que modernizarse lixeiramente engadindolle outra comprobaciĆ³n de rango:

FunciĆ³n MergeIfs(TextRange As Range, SearchRange1 As Range, Condition1 As String, SearchRange2 As Range, Condition2 As String) Dim Delimeter As String, i As Long Delimeter = ", " 'caracteres delimitadores (pĆ³dense substituĆ­r por espazo ou ; etc.) e.) 'se os intervalos de validaciĆ³n e de pegado non son iguais entre si, sae cun erro Se SearchRange1.Count <> TextRange.Count ou SearchRange2.Count <> TextRange.Count Then MergeIfs = CVErr(xlErrRef) Exit Function End If 'pase por todas as celas, comprobe todas as condiciĆ³ns e recolle o texto na variable OutText For i = 1 To SearchRange1.Cells.Count If SearchRange1.Cells(i) = Condition1 E SearchRange2.Cells(i) = Condition2 EntĆ³n OutText = OutText & TextRange.Cells(i) & Delimeter End If Next I 'mostra os resultados sen o Ćŗltimo delimitador MergeIfs = Left(OutText, Len(OutText) - Len(Delimeter)) End Function  

Aplicarase exactamente do mesmo xeito; agora sĆ³ hai que especificar mĆ”is os argumentos:

VinculaciĆ³n de texto por condiciĆ³n

MĆ©todo 4. AgrupaciĆ³n e pegado en Power Query

Podes resolver o problema sen programar en VBA, se usas o complemento gratuĆ­to Power Query. Para Excel 2010-2013 pĆ³dese descargar aquĆ­, e en Excel 2016 xa estĆ” integrado por defecto. A secuencia de actuaciĆ³ns serĆ” a seguinte:

Power Query non sabe como traballar con tĆ”boas normais, polo que o primeiro paso Ć© converter a nosa tĆ”boa nunha "intelixente". Para iso, selecciĆ³nao e prema a combinaciĆ³n Ctrl+T ou seleccione na pestana Inicio - Formato como unha tĆ”boa (Inicio ā€” Formato como tĆ”boa). Na pestana que aparece despois Construtor (DeseƱo) pode definir o nome da tĆ”boa (deixei o estĆ”ndar TĆ”boa 1):

VinculaciĆ³n de texto por condiciĆ³n

Agora imos cargar a nosa tĆ”boa no complemento Power Query. Para iso, na pestana Data (se tes Excel 2016) ou na pestana Power Query (se tes Excel 2010-2013) fai clic Da mesa (Datos ā€” Da tĆ”boa):

VinculaciĆ³n de texto por condiciĆ³n

Na xanela do editor de consultas que se abre, seleccione a columna facendo clic na cabeceira compaƱƭa e prema o botĆ³n de arriba grupo (Agrupar por). Introduza o nome da nova columna e o tipo de operaciĆ³n na agrupaciĆ³n - Todas as liƱas (Todas as filas):

VinculaciĆ³n de texto por condiciĆ³n

Fai clic en Aceptar e obteremos unha mini-tĆ”boa de valores agrupados para cada empresa. O contido das tĆ”boas Ć© claramente visible se fai clic co botĆ³n esquerdo no fondo branco das celas (non no texto!) na columna resultante:

VinculaciĆ³n de texto por condiciĆ³n

Agora imos engadir unha columna mĆ”is, onde, mediante a funciĆ³n, pegamos o contido das columnas de Enderezo en cada unha das minitĆ”boas, separadas por comas. Para iso, na pestana Engade columna presionamos Columna personalizada (Engadir columna ā€” Columna personalizada) e na xanela que aparece, introduza o nome da nova columna e a fĆ³rmula de acoplamento na linguaxe M integrada en Power Query:

VinculaciĆ³n de texto por condiciĆ³n

TeƱa en conta que todas as funciĆ³ns M distinguen entre maiĆŗsculas e minĆŗsculas (a diferenza de Excel). Despois de facer clic en OK obtemos unha nova columna con enderezos pegados:

VinculaciĆ³n de texto por condiciĆ³n

Queda por eliminar a columna xa innecesaria Enderezos da tĆ”boa (clic dereito no tĆ­tulo) Eliminar columna) e carga os resultados na folla facendo clic na pestana Inicio ā€” Pecha e descarga (Inicio ā€” Pechar e cargar):

VinculaciĆ³n de texto por condiciĆ³n

Matiz importante: A diferenza dos mĆ©todos (funciĆ³ns) anteriores, as tĆ”boas de Power Query non se actualizan automaticamente. Se no futuro haberĆ” algĆŗn cambio nos datos de orixe, terĆ”s que facer clic co botĆ³n dereito do rato en calquera lugar da tĆ”boa de resultados e seleccionar o comando Actualizar e gardar (Actualizar).

  • Como dividir unha cadea de texto longa en partes
  • Varias formas de pegar texto de diferentes celas nunha soa
  • Usando o operador GĆŗstame para probar o texto cunha mĆ”scara

Deixe unha resposta