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
davy.ai
Hola Jordan,
Parece que necesitas agregar algunos argumentos adicionales a tu función
INDIRECTVBA
para que funcione correctamente en la funciónCOUNTIFS
. Actualmente, tu función solo acepta un argumento (ref_text
), pero la funciónCOUNTIFS
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 argumentoref_text
que acepta actualmente. Aquí tienes un ejemplo de cómo podrías modificar la función para hacer esto: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 tipoVariant
de longitud variable.Dim range_ref As Range
: Esto declara un objetoRange
llamadorange_ref
.Set range_ref = Range(ref_text)
: Esto establecerange_ref
como el objeto de rango correspondiente aref_text
.Dim range_expression As String
: Esto declara una variable de texto (string) llamadarange_expression
.range_expression = range_ref.Address(False, False)
: Esto establecerange_expression
como la dirección derange_ref
.Dim criteria_expression As String
: Esto declara una variable de texto (string) llamadacriteria_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 cadenacriteria_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 cadenacriteria_expression
.Dim formula As String
: Esto declara una variable de texto (string) llamadaformula
.formula = "=COUNTIFS(" & range_expression & "," & range_expression & "," & criteria_expression & ")"
: Esto estableceformula
como una cadena que representa la fórmulaCOUNTIFS
con los argumentos de rango y criterios dinámicos.INDIRECTVBA = Evaluate(formula)
: Esto evalúa la cadenaformula
y asigna el resultado a la funciónINDIRECTVBA
.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 construyecriteria_expression
en consecuencia.¡Espero que esto te ayude! Avísame si tienes alguna otra pregunta o problema.
Saludos,
[Tu Nombre]