Hola a todos!.
Qué tal estáis?, espero que muy bien!.
Hoy os mostraré una técnica para pasar operadores lógicos cuando estemos construyendo nuestras propias funciones (UDF) en VBA.
Estoy seguro que este post os va a resultar muy interesante y útil. Antes de nada voy a mostrar la base de nuestro ejemplo:
Como podéis observar tenemos un rango de datos numéricos (A2:C12) y a continuación tres columnas donde en cada encabezado tenemos los criterios de extracción de los datos.
Pues bien, esto lo vamos a hacer con una función, que además de para estos ejemplos nos servirá para otros porque tendremos todas las variables parametrizadas.
Os muestro el código y luego hablamos sobre la función:
Option Explicit
Function EXTRAE_RANGO_NUM(ByVal Target As Range, Oper As Variant, Num As Long, Optional Oper1 As Variant, Optional Num1 As Long, Optional logica As Boolean)
'Declaramos variables
Dim celda As Object, sCadena As String
Dim j As Long, nCol As Long, n As Long
Dim miCelda As String, matriz As Variant, miArray As Variant
'Recorremos celdas y seleccionamos dato segun condicion
For Each celda In target
'Verificamos que las celdas sean numéricas y tengan datos
If IsNumeric(celda) And celda <> "" Then
'Si el operador de la segunda condición es error
'Solo evaluamos la primera condición
If IsError(Oper1) Then
sCadena = Evaluate(celda & Oper & Num)
ElseIf logica = "1" Then
sCadena = Evaluate(celda & Oper & Num) And Evaluate(celda & Oper1 & Num1)
ElseIf logica = "0" Then
sCadena = Evaluate(celda & Oper & Num) Or Evaluate(celda & Oper1 & Num1)
End If
'Componemos cadena
If sCadena Then miCelda = trim(miCelda) & " " & celda
End If
Next celda
'Pasamos los datos a un matriz
matriz = Split(miCelda, " ")
'Contamos elementos
n = UBound(matriz) + 1
'Si no hay datos, mostramos mensaje y salimos del proceso
If n = 0 Then
MsgBox ("NO EXISTEN DATOS SEGÚN LOS CRITERIOS QUE HAS SELECCIONADO")
Exit Function
End If
'Pasamos los datos a la función
matriz = Split(miCelda, " ")
ReDim miArray(0 To UBound(matriz))
For j = 0 To UBound(matriz)
miArray(j) = matriz(j)
Next j
EXTRAE_RANGO_NUM = Application.Transpose(miArray)
End Function
Como podéis observar contamos con varios criterios y algunos de ellos son opcionales.
- Target: es el rango donde se encuentran los datos.
- Oper: es el operador de comparación que utilizaremos. Están permitidos: >, < y =
- Num: es el número de la condición.
Por ejemplo, si queremos extraer: «NÚMEROS MAYORES DE 91» esta será la función que tenemos que escribir en la hoja de Excel:
=EXTRAE_RANGO_NUM(A2:C12;">";"91")
Siempre los argumentos entre comillas excepto el rango inicial. Pero es que además la programación nos permite mejorar la función y completarla con los siguientes argumentos:
- Oper1: Segundo operador de comparación. Están permitidos: >, < y =
- Num1: Segundo número en la comparación.
- Logica: Permite elegir entre los operadores O o Y. El 1 selecciona «Y» y el 0 «O».
Por ejemplo, si queremos extraer: «NÚMEROS MAYORES DE 20 Y MENORES DE 80» esta será la función que tenemos que escribir en la hoja de Excel:
=EXTRAE_RANGO_NUM(A2:C12;">";20;"<";"80";"1")
y si queremos extraer: «NÚMEROS MENORES DE 10 O MAYORES DE 60» esta será la función que tenemos que escribir en la hoja de Excel:
=EXTRAE_RANGO_NUM(A2:C12;"<";"10";">";"60";"0")
Por supuesto, el código tiene en cuenta que los datos seleccionados sean siempre numéricos y las celdas contengan información.
Este es el resultado de las funciones:
Como habéis podido observar, se cumplen los criterios que hemos seleccionado.
Por cierto, para validar los operadores es necesarios previamente utilizar la función Evaluate() para que puedan ser usados como criterio en la UDF.
Y esto es todo! : )
Descarga el archivo de ejemplo pulsando en:
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies