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 = 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.

Donate Button with Credit Cards

¡¡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

Comparte este post