Contidos
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:
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:
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:
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:
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:
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:
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):
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):
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):
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:
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:
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:
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):
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