¿Cómo puedo usar expresiones regulares en Excel y aprovechar la poderosa configuración de cuadrícula de Excel para la manipulación de datos?
- Función en celda para devolver un patrón coincidente o un valor reemplazado en una cadena.
- Sub para recorrer una columna de datos y extraer coincidencias con celdas adyacentes.
- ¿Qué configuración es necesaria?
- ¿Cuáles son los caracteres especiales de Excel para las expresiones regulares?
Entiendo expresión regular no es ideal para muchas situaciones ( para usar o no usar expresiones regulares? ), Ya que Excel puede utilizar Left
, Mid
, Right
, Instr
comandos de tipo de manipulaciones similares.
Like
operador , que proporciona una especie de versión ligera de la funcionalidad de estilo regex. Por lo general, es mucho más rápido que regex, incluso si está envuelto en un procedimiento secundario o de función.Respuestas:
Las expresiones regulares se utilizan para la coincidencia de patrones.
Para usar en Excel, siga estos pasos:
Paso 1 : Agregue la referencia de VBA a "Microsoft VBScript Regular Expressions 5.5"
Paso 2 : define tu patrón
Definiciones basicas:
-
Rango.a-z
coincide con letras minúsculas de a a z0-5
coincide con cualquier número del 0 al 5[]
Haga coincidir exactamente uno de los objetos dentro de estos corchetes.[a]
coincide con la letra a[abc]
coincide con una sola letra que puede ser a, bo c[a-z]
coincide con cualquier letra minúscula del alfabeto.()
Agrupa diferentes coincidencias para propósitos de devolución. Ver ejemplos a continuación.{}
Multiplicador para copias repetidas del patrón definido antes.[a]{2}
coincide con dos letras minúsculas consecutivas a:aa
[a]{1,3}
coincide con al menos uno y hasta tres letra minúsculaa
,aa
,aaa
+
Haga coincidir al menos uno, o más, del patrón definido antes.a+
coincidirá con una consecutivo dea
,aa
,aaa
, etc.?
Haga coincidir cero o uno de los patrones definidos antes.[a-z]?
coincide con una cadena vacía o cualquier letra minúscula.*
Haga coincidir cero o más del patrón definido antes. - Por ejemplo, comodín para un patrón que puede o no estar presente. - Por ejemplo,[a-z]*
coincide con una cadena vacía o una cadena de letras minúsculas..
Coincide con cualquier personaje excepto la nueva línea\n
a.
coincide con una cadena de dos caracteres que comienza con a y termina con cualquier cosa excepto\n
|
Operador ORa|b
significaa
ob
puede ser igualado.red|white|orange
coincide exactamente con uno de los colores.^
NO operador[^0-9]
carácter no puede contener un número.[^aA]
carácter no puede ser minúsculaa
o mayúsculaA
\
Huye del carácter especial que sigue (anula el comportamiento anterior)\.
,\\
,\(
,\?
,\$
,\^
Patrones de anclaje:
^
La coincidencia debe ocurrir al comienzo de la cadena^a
primer carácter debe ser minúsculaa
^[0-9]
primer carácter debe ser un número.$
La coincidencia debe ocurrir al final de la cadenaa$
último carácter debe ser minúsculaa
Tabla de precedencia:
Abreviaturas de caracteres predefinidas:
Ejemplo 1 : ejecutar como macro
La siguiente macro de ejemplo examina el valor en la celda
A1
para ver si los primeros 1 o 2 caracteres son dígitos. Si es así, se eliminan y se muestra el resto de la cadena. De lo contrario, aparece un cuadro que le indica que no se encontró ninguna coincidencia. LosA1
valores de celda de12abc
will returnabc
, value of1abc
will returnabc
, value ofabc123
will return "Not Matched" porque los dígitos no estaban al comienzo de la cadena.Ejemplo 2 : ejecutar como una función en la celda
Este ejemplo es el mismo que el ejemplo 1 pero está configurado para ejecutarse como una función en la celda. Para usar, cambie el código a esto:
Coloque sus cadenas ("12abc") en la celda
A1
. Ingrese esta fórmula=simpleCellRegex(A1)
en la celdaB1
y el resultado será "abc".Ejemplo 3 : Bucle a través del rango
Este ejemplo es el mismo que el ejemplo 1, pero recorre un rango de celdas.
Ejemplo 4 : dividir diferentes patrones
Este ejemplo recorre un rango (
A1
,A2
&A3
) y busca una cadena que comience con tres dígitos seguidos de un solo carácter alfa y luego 4 dígitos numéricos. La salida divide las coincidencias de patrones en celdas adyacentes mediante el uso de()
.$1
representa el primer patrón que coincide con el primer conjunto de()
.Resultados:
Ejemplos de patrones adicionales
fuente
Set regEx = Nothing
. Obtendrá excepciones de memoria insuficiente cuando ese Sub se ejecute con suficiente frecuencia.Set regEx = CreateObject("VBScript.RegExp")
ThisWorkbook
. Intenta mover el código a otroModule
.Para hacer uso de expresiones regulares directamente en fórmulas de Excel, la siguiente UDF (función definida por el usuario) puede ser de ayuda. Expone más o menos directamente la funcionalidad de expresión regular como una función de Excel.
Cómo funciona
Se necesitan 2-3 parámetros.
$0
,$1
,$2
, y así sucesivamente.$0
es la coincidencia completa,$1
y arriba corresponde a los respectivos grupos de coincidencia en la expresión regular. Por defecto es$0
.Algunos ejemplos
Extraer una dirección de correo electrónico:
Resultados en:
[email protected]
Extrayendo varias subcadenas:
Resultados en:
E-Mail: [email protected], Name: Peter Gordon
Para separar una cadena combinada en una sola celda en sus componentes en varias celdas:
Resultados en:
Peter Gordon
[email protected]
...Cómo utilizar
Para usar este UDF haga lo siguiente (aproximadamente basado en esta página de Microsoft . ¡Tienen buena información adicional allí!):
ALT+F11
para abrir el Editor de Microsoft Visual Basic para Aplicaciones .Haga clic en Insertar módulo . Si le da a su módulo un nombre diferente, asegúrese de que el Módulo no tenga el mismo nombre que el UDF a continuación (por ejemplo, al nombrar el Módulo
Regex
y la funciónregex
causa errores # ¡NOMBRE! ).En la ventana de texto grande en el medio inserte lo siguiente:
Guarde y cierre la ventana del Editor de Microsoft Visual Basic para Aplicaciones .
fuente
Function foo() As Variant \n foo="Hello World" \n End Function
UDF mínimo para ver si eso funciona. En caso afirmativo, avance hasta llegar a lo anterior, si no hay algo básico roto (¿macros deshabilitadas?).Ampliando la respuesta de patszim para aquellos apurados .
agregue el siguiente código:
El patrón regex se coloca en una de las celdas y se usa referencia absoluta en él. La función estará vinculada al libro de trabajo en el que se creó.
Si es necesario que se use en diferentes libros de trabajo, almacene la función en Personal.XLSB
fuente
Aquí está mi intento:
fuente
Necesitaba usar esto como una función de celda (como
SUM
oVLOOKUP
) y descubrí que era fácil:Cree la siguiente función en el libro o en su propio módulo:
Luego puede usar en la celda con
=REGPLACE(B1, "(\w) (\d+)", "$1$2")
(por ejemplo: "A 243" a "A243")fuente
Esta no es una respuesta directa, pero puede proporcionar una alternativa más eficiente para su consideración. Es decir, Google Sheets tiene varias funciones Regex incorporadas, que pueden ser muy convenientes y ayudar a eludir algunos de los procedimientos técnicos en Excel. Obviamente, hay algunas ventajas de usar Excel en su PC, pero para la gran mayoría de los usuarios, Google Sheets ofrecerá una experiencia idéntica y puede ofrecer algunos beneficios en la portabilidad y el intercambio de documentos.
Ellos ofrecen
REGEXEXTRACT: extrae subcadenas coincidentes de acuerdo con una expresión regular.
REGEXREPLACE: reemplaza parte de una cadena de texto con una cadena de texto diferente utilizando expresiones regulares.
SUSTITUTO: Reemplaza el texto existente con texto nuevo en una cadena.
REEMPLAZAR: Reemplaza parte de una cadena de texto con una cadena de texto diferente.
Puede escribirlos directamente en una celda y así producirá lo que quiera
También funcionan bastante bien en combinaciones con otras funciones, como las declaraciones IF , como estas :
Esperemos que esto proporcione una solución simple para los usuarios que se sienten burlados por el componente VBS de Excel.
fuente
Aquí hay una
regex_subst()
función. Ejemplos:Aquí está el código simplificado (más simple para mí, de todos modos). No pude descubrir cómo construir un patrón de salida adecuado usando lo anterior para funcionar como mis ejemplos:
fuente
No quiero tener que habilitar una biblioteca de referencia, ya que necesito que mis scripts sean portátiles. La
Dim foo As New VBScript_RegExp_55.RegExp
línea causóUser Defined Type Not Defined
errores, pero encontré una solución que funcionó para mí.Lo que querrá hacer es poner una cadena de ejemplo en la celda
A1
, luego probar sustrPattern
. Una vez que esté funcionando, ajústelorng
como lo desee.fuente
VBScript_RegExp_55
biblioteca es bastante ubicua, por lo que conlleva un riesgo muy bajo de no estar en una máquina de destino particular. Y de todos modos, cambiar de Early Bound a Late Bound no resuelve el problema de la portabilidad (el código seguirá siendo un error, solo en tiempo de ejecución en lugar de tiempo de compilación)Para agregar al valioso contenido, me gustaría crear este recordatorio de por qué a veces RegEx dentro de VBA no es ideal. No todas las expresiones son compatibles, pero en su lugar pueden arrojar una
Error 5017
y puede dejar al autor adivinando (de lo cual soy víctima).Si bien podemos encontrar algunas fuentes sobre lo que es compatible, sería útil saber qué metacaracteres, etc., no son compatibles. Una explicación más detallada se puede encontrar aquí . Mencionado en esta fuente:
Por lo tanto, no son compatibles:
\A
, alternativamente use el^
cursor para hacer coincidir la posición antes del 1er carácter en la cadena\Z
, alternativamente, use el$
signo de dólar para hacer coincidir la posición después del último carácter en la cadena(?<=a)b
(aunque se admite LookAhead positivo )(?<!a)b
(aunque se admite LookAhead negativo )\{uFFFF}
/i
(mayúsculas y minúsculas) o/g
(global) etc. Ajústelos a través de lasRegExp
propiedades del objeto>RegExp.Global = True
yRegExp.IgnoreCase = True
si están disponibles.'
comentarios regulares en el scriptYa golpeé un muro más de una vez usando expresiones regulares dentro de VBA. Por lo general,
LookBehind
pero a veces incluso me olvido de los modificadores. No he experimentado todos estos fondos mencionados anteriormente, pero pensé que trataría de ser extenso refiriéndome a información más detallada. Siéntase libre de comentar / corregir / agregar. Gran agradecimiento a regular-expressions.info por una gran cantidad de información.PD: Usted ha mencionado métodos y funciones regulares de VBA, y puedo confirmar que (al menos para mí) han sido útiles en sus propias formas donde RegEx fallaría.
fuente