Regex para extraer cadenas en Excel (una o todas las coincidencias)

  • Compartir Este
Michael Brown

En este tutorial, aprenderá a utilizar expresiones regulares en Excel para encontrar y extraer subcadenas que coincidan con un patrón dado.

Microsoft Excel proporciona una serie de funciones para extraer texto de las celdas. Esas funciones pueden hacer frente a la mayoría de los retos de extracción de cadenas en sus hojas de cálculo. La mayoría, pero no todos. Cuando las funciones de texto tropiezan, las expresiones regulares vienen al rescate. Espere... ¡Excel no tiene funciones RegEx! Cierto, no hay funciones incorporadas. Pero no hay nada que le impida utilizar las suyas propias :)

    Excel VBA Regex función para extraer cadenas

    Para añadir una función Regex Extract personalizada a su Excel, pegue el siguiente código en el editor VBA. Para habilitar las expresiones regulares en VBA, estamos utilizando el objeto RegExp incorporado de Microsoft.

    Public Function RegExpExtract(text As String , pattern As String , Optional instance_num As Integer = 0, Optional match_case As Boolean = True ) Dim text_matches() As String Dim matches_index As Integer On Error GoTo ErrHandl RegExpExtract = "" Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Thenregex.ignorecase = False Else regex.ignorecase = True End If Set matches = regex.Execute(text) If 0 <matches.Count Then If (0 = instance_num) Then ReDim text_matches(matches.Count - 1, 0) For matches_index = 0 To matches.Count - 1 text_matches(matches_index, 0) = matches.Item(matches_index) Next matches_index RegExpExtract = text_matches Else RegExpExtract = matches.Item(instance_num - 1) EndIf End If Exit Function ErrHandl: RegExpExtract = CVErr(xlErrValue) End Function

    Si tiene poca experiencia con VBA, puede resultarle útil una guía de usuario paso a paso: Cómo insertar código VBA en Excel.

    Nota: Para que la función funcione, asegúrese de guardar el archivo como un archivo libro de trabajo habilitado para macros (.xlsm).

    Sintaxis de RegExpExtract

    En RegExpExtract busca en una cadena de entrada valores que coincidan con una expresión regular y extrae una o todas las coincidencias.

    La función tiene la siguiente sintaxis:

    RegExpExtract(texto, patrón, [instance_num], [match_case])

    Dónde:

    • Texto (obligatorio) - la cadena de texto en la que buscar.
    • Patrón (obligatorio) - la expresión regular que debe coincidir. Cuando se proporciona directamente en una fórmula, el patrón debe ir entre comillas dobles.
    • Número_de_instancia (opcional) - un número de serie que indica qué instancia extraer. Si se omite, devuelve todas las coincidencias encontradas (por defecto).
    • Caso_partido (opcional) - define si se deben distinguir o ignorar las mayúsculas y minúsculas del texto. Si es TRUE o se omite (por defecto), se distingue entre mayúsculas y minúsculas; si es FALSE, no se distingue entre mayúsculas y minúsculas.

    La función funciona en todas las versiones de Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 y Excel 2010.

    4 cosas que debe saber sobre RegExpExtract

    Para utilizar eficazmente la función en su Excel, hay que tener en cuenta algunas cosas importantes:

    1. Por defecto, la función devuelve todas las coincidencias encontradas en celdas vecinas como se muestra en este ejemplo. Para obtener una ocurrencia específica, proporcione el número correspondiente a la variable número_de_instancia argumento.
    2. Por defecto, la función es distingue entre mayúsculas y minúsculas Para que las coincidencias no distingan entre mayúsculas y minúsculas, defina la opción match_case Debido a las limitaciones de VBA, la construcción que no distingue mayúsculas de minúsculas (?i) no funcionará.
    3. Si un no se encuentra un patrón válido la función no devuelve nada (cadena vacía).
    4. Si el el patrón no es válido se produce un error #¡VALOR!

    Antes de empezar a utilizar esta función personalizada en sus hojas de trabajo, debe comprender de qué es capaz, ¿verdad? Los ejemplos siguientes cubren algunos casos de uso comunes y explican por qué el comportamiento puede diferir en Dynamic Array Excel (Microsoft 365 y Excel 2021) y Excel tradicional (2019 y versiones anteriores).

    Nota: Nuestros ejemplos de expresiones regulares se han escrito para conjuntos de datos muy sencillos, por lo que no podemos garantizar que funcionen a la perfección en sus hojas de cálculo reales. Quienes tienen experiencia con expresiones regulares estarán de acuerdo en que escribir expresiones regulares es un camino interminable hacia la perfección: casi siempre hay una forma de hacerlas más elegantes o capaces de manejar una gama más amplia de datos de entrada.

    Regex para extraer un número de una cadena

    Siguiendo la máxima básica de enseñar "de lo simple a lo complejo", empezaremos con un caso muy sencillo: extraer un número de una cadena.

    Lo primero que debe decidir es qué número recuperar: el primero, el último, una ocurrencia concreta o todos los números.

    Extraer el primer número

    Dado que \d significa cualquier dígito del 0 al 9, y + significa una o más veces, nuestra expresión regular adopta esta forma:

    Patrón : \d+

    Establecer número_de_instancia a 1 y obtendrá el resultado deseado:

    =RegExpExtract(A5, "\d+", 1)

    Donde A5 es la cadena original.

    Para mayor comodidad, puede introducir el patrón en una celda predefinida ($A$2 ) y bloquear su dirección con el signo $:

    =RegExpExtract(A5, $A$2, 1)

    Obtener el último número

    Para extraer el último número de una cadena, éste es el patrón que hay que utilizar:

    Patrón : (\d+)(?!.*\d)

    Traducido a un lenguaje humano, dice: encuentra un número que no vaya seguido (en ningún sitio, no sólo inmediatamente) de ningún otro número. Para expresarlo, estamos utilizando un lookahead negativo (?!.*\d), lo que significa que a la derecha del patrón no debe haber ningún otro dígito (\d) independientemente de cuántos otros caracteres le precedan.

    =RegExpExtract(A5, "(\d+)(?!.*\d)")

    Consejos:

    • Para obtener un incidencia específica utilice \d+ para patrón y un número de serie adecuado para número_de_instancia .
    • La fórmula para extraer todos los números se analiza en el siguiente ejemplo.

    Regex para extraer todas las coincidencias

    Llevando nuestro ejemplo un poco más lejos, supongamos que desea obtener todos los números de una cadena, no sólo uno.

    Como recordará, el número de coincidencias extraídas se controla mediante el parámetro opcional número_de_instancia El valor predeterminado es todas las coincidencias, por lo que basta con omitir este parámetro:

    =RegExpExtract(A2, "\d+")

    La fórmula funciona perfectamente para una sola celda, pero el comportamiento difiere en las versiones dinámicas y no dinámicas de Excel.

    Excel 365 y Excel 2021

    Debido al soporte para matrices dinámicas, una fórmula regular se derrama automáticamente en tantas celdas como sea necesario para mostrar todos los resultados calculados. En términos de Excel, esto se denomina rango derramado:

    Excel 2019 y versiones inferiores

    En el Excel predinámico, la fórmula anterior devolvería una sola coincidencia. Para obtener varias coincidencias, debe convertirla en una fórmula de matriz. Para ello, seleccione un rango de celdas, escriba la fórmula y pulse Ctrl + Mayús + Intro para completarla.

    Una desventaja de este enfoque es que aparecen un montón de errores #N/A en las "celdas extra". Lamentablemente, no se puede hacer nada al respecto (ni IFERROR ni IFNA pueden solucionarlo, por desgracia).

    Extraer todas las coincidencias de una celda

    Al procesar una columna de datos, el enfoque anterior obviamente no funcionará. En este caso, una solución ideal sería devolver todas las coincidencias en una sola celda. Para hacerlo, sirva los resultados de RegExpExtract a la función TEXTJOIN y sepárelos con cualquier delimitador que desee, digamos una coma y un espacio:

    =TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))

    Nota. Dado que la función TEXTJOIN solo está disponible en Excel para Microsoft 365, Excel 2021 y Excel 2019, la fórmula no funcionará en versiones anteriores.

    Regex para extraer texto de una cadena

    Extraer texto de una cadena alfanumérica es una tarea bastante complicada en Excel. Con regex, se convierte en pan comido. Basta con utilizar una clase negada para que coincida con todo lo que no sea un dígito.

    Patrón : [^\d]+

    Para obtener subcadenas en celdas individuales (rango de derrame), la fórmula es:

    =RegExpExtract(A5, "[^\d]+")

    Para mostrar todas las coincidencias en una celda, anide la función RegExpExtract en TEXTJOIN de la siguiente manera:

    =TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))

    Regex para extraer la dirección de correo electrónico de una cadena

    Para extraer una dirección de correo electrónico de una cadena que contiene mucha información diferente, escriba una expresión regular que replique la estructura de la dirección de correo electrónico.

    Patrón : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}

    Desglosando esta regex, esto es lo que obtenemos:

    • [\w\.\-]+ es un nombre de usuario que puede incluir 1 o más caracteres alfanuméricos, guiones bajos, puntos y guiones.
    • Símbolo
    • [A-Za-z0-9\.\-]+ es un nombre de dominio compuesto por: letras mayúsculas y minúsculas, dígitos, guiones y puntos (en caso de subdominios). Los guiones bajos no están permitidos aquí, por lo que se utilizan 3 conjuntos de caracteres diferentes (como A-Z a-z y 0-9) en lugar de \w que coincide con cualquier letra, dígito o guión bajo.
    • \.[A-Za-z]{2,24} es un dominio de nivel superior. Consta de un punto seguido de letras mayúsculas y minúsculas. La mayoría de los dominios de nivel superior tienen 3 letras (por ejemplo, .com .org, .edu, etc.), pero en teoría puede contener de 2 a 24 letras (el TLD registrado más largo).

    Suponiendo que la cadena está en A5 y el patrón en A2, la fórmula para extraer una dirección de correo electrónico es:

    =RegExpExtract(A5, $A$2)

    Regex para extraer el dominio del correo electrónico

    Cuando se trata de extraer dominios de correo electrónico, lo primero que se nos ocurre es utilizar un grupo de captura para encontrar el texto que sigue inmediatamente al carácter @.

    Patrón : @([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})

    Sírvelo a nuestra función RegExp:

    =RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")

    Y obtendrás este resultado:

    Con las expresiones regulares clásicas, todo lo que queda fuera de un grupo de captura no se incluye en la extracción. No se sabe por qué VBA RegEx funciona de forma diferente y captura también "@". Para deshacerse de él, puede eliminar el primer carácter del resultado sustituyéndolo por una cadena vacía.

    =REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")

    Expresión regular para extraer números de teléfono

    Los números de teléfono pueden escribirse de muchas formas diferentes, por lo que es casi imposible encontrar una solución que funcione en todas las circunstancias. No obstante, puede anotar todos los formatos utilizados en su conjunto de datos e intentar hacerlos coincidir.

    Para este ejemplo, vamos a crear una expresión regular que extraiga números de teléfono en cualquiera de estos formatos:

    (123) 345-6789

    (123) 345 6789

    (123)3456789

    123-345-6789

    123.345.6789

    123 345 6789

    1233456789

    Patrón (¿?) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

    • La primera parte \(?\d{3} coincide con cero o un paréntesis de apertura seguido de tres dígitos d{3}.
    • La parte [-\. \)]* significa cualquier carácter entre corchetes que aparezca 0 o más veces: guión, punto, espacio o paréntesis de cierre.
    • A continuación, volvemos a tener tres dígitos d{3} seguidos de cualquier guión, punto o espacio [-\. ]? que aparece 0 ó 1 vez.
    • Después hay un grupo de cuatro dígitos \d{4}.
    • Por último, hay una palabra límite \b que define que un número de teléfono que buscamos no puede formar parte de un número mayor.

    La fórmula completa adopta esta forma:

    =RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")

    Tenga en cuenta que la expresión regular anterior puede devolver algunos resultados falsos positivos, como 123) 456 7899 o (123 456 7899. La versión siguiente soluciona estos problemas. Sin embargo, esta sintaxis sólo funciona en las funciones RegExp de VBA, no en las expresiones regulares clásicas.

    Patrón : (\(\d{3}\)

    Regex para extraer la fecha de una cadena

    Una expresión regular para extraer una fecha depende del formato en el que aparezca la fecha dentro de una cadena. Por ejemplo:

    Para extraer fechas como 1/1/21 o 01/01/2021, la expresión regular es: \d{1,2}\d/(\d{4}).

    Busca un grupo de 1 ó 2 dígitos d{1,2} seguido de una barra, seguido de otro grupo de 1 ó 2 dígitos, seguido de una barra, seguido de un grupo de 4 ó 2 dígitos (\d{4}).la primera condición se encuentra en la alternancia La construcción OR coincide, el resto de condiciones no se comprueban.

    Para recuperar fechas como 1-Ene-21 o 01-Ene-2021, el patrón es: \d{1,2}-[A-Za-z]{3}-\d{2,4}

    Busca un grupo de 1 ó 2 dígitos, seguido de un guión, seguido de un grupo de 3 letras mayúsculas o minúsculas, seguido de un guión, seguido de un grupo de 4 ó 2 dígitos.

    Tras combinar los dos patrones, obtenemos la siguiente expresión regular:

    Patrón : \b\d{1,2}[\/-](\d{1,2}

    Dónde:

    • La primera parte es de 1 ó 2 dígitos: \d{1,2}
    • La segunda parte puede ser de 1 ó 2 dígitos o de 3 letras: (\d{1,2}
    • La tercera parte es un grupo de 4 o 2 dígitos: (\d{4}
    • El delimitador puede ser una barra oblicua o un guión: [\/-]
    • Se coloca un límite de palabra \b a ambos lados para dejar claro que una fecha es una palabra independiente, y no parte de una cadena mayor.

    Como puede ver en la imagen siguiente, extrae correctamente las fechas y deja fuera subcadenas como 11/22/333. Sin embargo, sigue devolviendo resultados falsos positivos. En nuestro caso, la subcadena 11-ABC-2222 en A9 coincide técnicamente con el formato de fecha dd-mmm-aaaa y, por tanto, se extrae.

    Para eliminar falsos positivos, puede sustituir la parte [A-Za-z]{3} por una lista completa de abreviaturas de 3 letras del mes:

    Patrón : \b\d{1,2}[\/-](\d{1,2}

    Para ignorar las mayúsculas y minúsculas, establecemos el último argumento de nuestra función personalizada en FALSE:

    =RegExpExtract(A5, $A$2, 1, FALSE)

    Y esta vez, obtenemos un resultado perfecto:

    Regex para extraer la hora de una cadena

    Para conseguir tiempo en el hh:mm o hh:mm:ss la siguiente expresión funcionará a las mil maravillas.

    Patrón : \b(0?[0-9]

    Desglosando esta regex, puede ver 2 partes separadas por

    Expresión 1 : \b(0?[0-9]

    Recupera las horas con AM/PM.

    Hora puede ser cualquier número del 0 al 12. Para obtenerlo, utilizamos la construcción OR ([0-9]

    • [0-9] coincide con cualquier número del 0 al 9
    • 1[0-2] coincide con cualquier número del 10 al 12

    Minuto [0-5]\d es cualquier número de 00 a 59.

    Segundo (:[0-5]\d)? es también cualquier número de 00 a 59. El cuantificador ? significa cero o una ocurrencia ya que los segundos pueden o no estar incluidos en el valor de tiempo.

    Expresión 2 : \b([0-9]

    Extrae las horas sin AM/PM.

    En hora puede ser cualquier número del 0 al 32. Para obtenerlo, se utiliza una construcción OR diferente ([0-9]

    • [0-9] coincide con cualquier número del 0 al 9
    • [0-1]\d coincide con cualquier número del 00 al 19
    • 2[0-3] coincide con cualquier número del 20 al 23

    En minuto y segundo son las mismas que en la expresión 1 anterior.

    El lookahead negativo (?!:) se añade a las cadenas de salto como 20:30:80.

    Dado que PM/AM pueden ser mayúsculas o minúsculas, la función no distingue entre mayúsculas y minúsculas:

    =RegExpExtract(A5, $A$2, 1, FALSE)

    Esperemos que los ejemplos anteriores le hayan dado algunas ideas sobre cómo utilizar expresiones regulares en sus hojas de cálculo de Excel. Desafortunadamente, no todas las características de las expresiones regulares clásicas están soportadas en VBA. Si su tarea no se puede realizar con VBA RegExp, le animo a leer la siguiente parte que trata sobre funciones .NET Regex mucho más potentes.

    Función Regex personalizada basada en .NET para extraer texto en Excel

    A diferencia de las funciones RegExp de VBA que pueden ser escritas por cualquier usuario de Excel, .NET RegEx es el reino del desarrollador. Microsoft .NET Framework soporta sintaxis de expresiones regulares con todas las funciones compatibles con Perl 5. Este artículo no le enseñará a escribir dichas funciones (no soy programador y no tengo la menor idea de cómo hacerlo :)

    Cuatro potentes funciones procesadas por el motor RegEx estándar de .NET ya están escritas por nuestros desarrolladores e incluidas en Ultimate Suite. A continuación, demostraremos algunos usos prácticos de la función especialmente diseñada para extraer texto en Excel.

    Sugerencia: para obtener información sobre la sintaxis de .NET Regex, consulte Lenguaje de expresiones regulares de .NET.

    Cómo extraer picaduras en Excel mediante expresiones regulares

    Suponiendo que tenga instalada la última versión de Ultimate Suite, la extracción de texto mediante expresiones regulares se reduce a estos dos pasos:

    1. En el Datos de Ablebits en la pestaña Texto grupo, haga clic en Herramientas Regex .
    2. En el Herramientas Regex seleccione los datos de origen, introduzca el patrón Regex y elija la opción Extracto Para obtener el resultado como una función personalizada y no como un valor, seleccione la opción Insertar como fórmula Cuando haya terminado, haga clic en el botón Extracto botón.

    Los resultados aparecerán en una nueva columna a la derecha de los datos originales:

    Sintaxis de AblebitsRegexExtract

    Nuestra función personalizada tiene la siguiente sintaxis:

    AblebitsRegexExtract(referencia, expresión_regular)

    Dónde:

    • Referencia (obligatorio) - una referencia a la celda que contiene la cadena de origen.
    • Expresión_regular (obligatorio) - el patrón regex que debe coincidir.

    Nota importante: la función sólo funciona en equipos que tengan instalado Ultimate Suite for Excel.

    Notas de uso

    Para que tu curva de aprendizaje sea más suave y tu experiencia más agradable, presta atención a estos puntos:

    1. Para crear una fórmula, puede utilizar nuestro Herramientas Regex o Excel Función de inserción Una vez insertada la fórmula, puede gestionarla (editarla, copiarla o moverla) como cualquier fórmula nativa.
    2. El patrón que introduzca en el Herramientas Regex va al 2º argumento. También es posible mantener una expresión regular en una celda separada. En este caso, basta con utilizar una referencia de celda para el 2º argumento.
    3. La función extrae el primera coincidencia encontrada .
    4. Por defecto, la función es distingue entre mayúsculas y minúsculas Para distinguir entre mayúsculas y minúsculas, utilice el patrón (?i).
    5. Si no se encuentra ninguna coincidencia, se devuelve un error #N/A.

    Regex para extraer cadena entre dos caracteres

    Para obtener el texto entre dos caracteres, puede utilizar un grupo de captura o buscar.

    Supongamos que desea extraer texto entre paréntesis. La forma más sencilla es utilizar un grupo de captura.

    Patrón 1 : \[(.*?)\]

    Con una mirada positiva hacia atrás y hacia delante, el resultado será exactamente el mismo.

    Patrón 2 (?<=\[)(.*?)(?=\])

    Tenga en cuenta que nuestro grupo de captura (.*?) realiza un búsqueda perezosa para texto entre dos corchetes - desde el primer [ hasta el primer ]. Un grupo de captura sin signo de interrogación (.*) haría un búsqueda codiciosa y captarlo todo, desde la primera [ hasta la última ].

    Con el patrón en A2, la fórmula es la siguiente:

    =AblebitsRegExtract(A5, $A$2)

    Cómo conseguir todos los partidos

    Como ya se ha mencionado, la función AblebitsRegexExtract sólo puede extraer una coincidencia. Para obtener todas las coincidencias, puede utilizar la función VBA que hemos discutido anteriormente. Sin embargo, hay una advertencia - VBA RegExp no admite la captura de grupos, por lo que el patrón anterior devolverá también los caracteres "límite", corchetes en nuestro caso.

    =TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))

    Para eliminar los corchetes, SUSTITUYALOS por cadenas vacías ("") utilizando esta fórmula:

    =SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")

    Para una mejor legibilidad, utilizamos una coma como delimitador.

    Regex para extraer texto entre dos cadenas

    El planteamiento que hemos elaborado para extraer texto entre dos caracteres también funcionará para extraer texto entre dos cadenas.

    Por ejemplo, para obtener todo lo que hay entre "prueba 1" y "prueba 2", utilice la siguiente expresión regular.

    Patrón prueba 1(.*?)prueba 2

    La fórmula completa es:

    =AblebitsRegExtract(A5, "prueba 1(.*?)prueba 2")

    Regex para extraer el dominio de la URL

    Incluso con expresiones regulares, la extracción de nombres de dominio a partir de URL no es una tarea trivial. El elemento clave que hace el truco son los grupos no capturadores. Dependiendo de su objetivo final, elija una de las expresiones regulares siguientes.

    Para obtener un nombre de dominio completo incluidos los subdominios

    Patrón (?:https?\:

    Para obtener un segundo nivel dominio sin subdominios

    Patrón (?:https?\:

    Ahora, veamos cómo funcionan estas expresiones regulares en un ejemplo de "//www.mobile.ablebits.com" como URL de muestra:

    • (?:https?\:
    • \/\/ - dos barras oblicuas (cada una va precedida de una barra invertida para escapar del significado especial de la barra oblicua e interpretarla literalmente).
    • (?:[A-Za-z\d\-\.]{2,255}\.)? - grupo no capturador para identificar dominios de tercer nivel, cuarto nivel, etc., si los hay ( móvil en nuestra URL de ejemplo). En el primer patrón, se coloca dentro de un grupo de captura mayor para conseguir que todos esos subdominios se incluyan en la extracción. Un subdominio puede tener entre 2 y 255 caracteres, de ahí el cuantificador {2,255}.
    • ([A-Za-z\d\-]{1,63}\.[A-Za-z]{2,24}) - grupo de captura para extraer el dominio de segundo nivel ( ablebits ) y el dominio de nivel superior ( com La longitud máxima de un dominio de segundo nivel es de 63 caracteres. El dominio de primer nivel más largo que existe actualmente contiene 24 caracteres.

    Dependiendo de la expresión regular que se introduzca en A2, la fórmula siguiente producirá resultados diferentes:

    =AblebitsRegExtract(A5, $A$2)

    Regex para extraer el nombre de dominio completo con todos los subdominios:

    Regex para extraer un segundo nivel dominio sin subdominios:

    Así es como se extraen partes de texto en Excel utilizando expresiones regulares. Te doy las gracias por leer y ¡espero verte en nuestro blog la semana que viene!

    Descargas disponibles

    Excel Regex Extract ejemplos (archivo .xlsm)

    Versión de prueba de Ultimate Suite (archivo .exe)

    Michael Brown es un entusiasta de la tecnología dedicado y apasionado por simplificar procesos complejos utilizando herramientas de software. Con más de una década de experiencia en la industria de la tecnología, ha perfeccionado sus habilidades en Microsoft Excel y Outlook, así como en Google Sheets y Docs. El blog de Michael está dedicado a compartir su conocimiento y experiencia con otros, brindando consejos y tutoriales fáciles de seguir para mejorar la productividad y la eficiencia. Ya sea un profesional experimentado o un principiante, el blog de Michael ofrece información valiosa y consejos prácticos para aprovechar al máximo estas herramientas de software esenciales.