es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Función Indirecta Definida por el Usuario con COUNTIFS

Estoy tratando de crear una UDF para reemplazar la función INDIRECT en el uso de la función COUNTIFS para permitir rangos dinámicos.

Objetivo:

Actualmente:
=countifs(indirect([referencia de celda a rango con nombre],[criterio1]...)
Estoy tratando de lograr:
=countifs(INDIRECTVBA([referencia de celda a rango con nombre],[criterio1]...)
La función devuelve #VALUE en este momento.

Aquí está mi VBA:


Public Function INDIRECTVBA(ref_text As String)
INDIRECTVBA = Range(ref_text)
End Function

El argumento ref_text sería una referencia a una celda en la que un VLOOKUP está listando dinámicamente un rango con nombre basado en la selección del usuario en otro lugar.

Mi primera impresión es que hay una incompatibilidad de tipos de datos, pero estoy sin ideas.

¡Cualquier ayuda es apreciada!

Gracias,
Jordan

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hola Jordan,

    Parece que necesitas agregar algunos argumentos adicionales a tu función INDIRECTVBA para que funcione correctamente en la función COUNTIFS. Actualmente, tu función solo acepta un argumento (ref_text), pero la función COUNTIFS requiere varios argumentos de criterios.

    Una posible solución es modificar tu función INDIRECTVBA para que acepte un arreglo de argumentos de criterios, además del argumento ref_text que acepta actualmente. Aquí tienes un ejemplo de cómo podrías modificar la función para hacer esto:

    Public Function INDIRECTVBA(ref_text As String, ParamArray criteria() As Variant) As Variant
        Dim range_ref As Range
        Set range_ref = Range(ref_text)
        Dim range_expression As String
        range_expression = range_ref.Address(False, False)
        Dim criteria_expression As String
        Dim i As Integer
        For i = 0 To UBound(criteria) Step 2
            criteria_expression = criteria_expression & "," & criteria(i) & "=" & """" & criteria(i + 1) & """"
        Next i
        criteria_expression = Mid(criteria_expression, 2)
        Dim formula As String
        formula = "=COUNTIFS(" & range_expression & "," & range_expression & "," & criteria_expression & ")"
        INDIRECTVBA = Evaluate(formula)
    End Function
    

    Aquí tienes una explicación de lo que hace cada parte de la función modificada:

    • ParamArray criteria() As Variant: Esto declara los argumentos de criterios como un arreglo de tipo Variant de longitud variable.
    • Dim range_ref As Range: Esto declara un objeto Range llamado range_ref.
    • Set range_ref = Range(ref_text): Esto establece range_ref como el objeto de rango correspondiente a ref_text.
    • Dim range_expression As String: Esto declara una variable de texto (string) llamada range_expression.
    • range_expression = range_ref.Address(False, False): Esto establece range_expression como la dirección de range_ref.
    • Dim criteria_expression As String: Esto declara una variable de texto (string) llamada criteria_expression.
    • For i = 0 To UBound(criteria) Step 2: Esto recorre los argumentos de criterios en pasos de 2 (ya que necesitas tanto los rangos de criterios como los valores de criterios).
    • criteria_expression = criteria_expression & "," & criteria(i) & "=" & """" & criteria(i + 1) & """": Esto agrega el rango de criterio y el valor de criterio actual a la cadena criteria_expression, separados por el signo = y encerrados entre comillas dobles. Ten en cuenta que puedes modificar esto para manejar otros tipos de criterios (por ejemplo, comparaciones con > o <).
    • criteria_expression = Mid(criteria_expression, 2): Esto elimina la coma inicial de la cadena criteria_expression.
    • Dim formula As String: Esto declara una variable de texto (string) llamada formula.
    • formula = "=COUNTIFS(" & range_expression & "," & range_expression & "," & criteria_expression & ")": Esto establece formula como una cadena que representa la fórmula COUNTIFS con los argumentos de rango y criterios dinámicos.
    • INDIRECTVBA = Evaluate(formula): Esto evalúa la cadena formula y asigna el resultado a la función INDIRECTVBA.

    Ten en cuenta que este código asume que el rango de criterio y los valores de criterio se pasan a la función en el orden en que se utilizan en la función COUNTIFS. Si esto no es el caso, deberás modificar el bucle que construye criteria_expression en consecuencia.

    ¡Espero que esto te ayude! Avísame si tienes alguna otra pregunta o problema.

    Saludos,
    [Tu Nombre]

Comments are closed.