Función de usuario personalizada sin usar VBA

10

¿Es posible crear una función de usuario personalizada en Excel sin usar VBA?
Mi problema es que tengo una larga cadena de funciones de Excel estándar unidas para hacer una función muy larga. Esta función se utiliza en 25 hojas de trabajo diferentes en mi libro de trabajo. Si necesito hacer cambios, me gustaría hacerlo en un solo lugar y hacer que los cambios se propaguen automáticamente por todas las hojas.

Por ejemplo, un caso simple y trivial sería agregar uno al resultado de SUM (), es decir. SUM (mySeries) +1, y llámelo una nueva función MYSUM ().

Dudo en traducir la fórmula larga en VBA debido a los posibles errores que pueden surgir y la complejidad adicional.

DakotaD
fuente
Buena pregunta, aunque dudo que encuentres una respuesta. Creo que un mejor curso sería pedir ayuda para construir la función requerida en VBA.
EliadTech

Respuestas:

11

Sí, es posible si usa fórmulas con nombre de Excel .

Por ejemplo, suponga que necesita calcular la diferencia entre las sumas de dos columnas consecutivas ( A5: Ax - B5: Bx ) en diferentes lugares en su libro de trabajo ( x es la fila final de cada columna):

Entonces define en A11 un nombre llamado diff (se puede usar cualquier nombre) como = Suma (A $ 5: A10) -Suma (B $ 5: B10) , suponiendo que los datos comiencen en la fila 5 hasta la fila anterior. Podría ser cualquier celda, no solo A11 , sino que la definición cambia de la misma manera.

Desafortunadamente, Excel 2010 inserta prefijos absolutos ( $ ) y prefijos de hoja de trabajo, por lo que debe borrar los prefijos, pero manteniendo los signos de exclamación y la mayoría de los caracteres $ .

Cuando mueve las fórmulas, la mayoría de las referencias son relativas. Por lo tanto, siempre calcula la diferencia entre la columna actual y la siguiente, comenzando desde la fila 5 hasta la línea anterior a la línea total.

Entonces, si tiene datos entre C5 y D100 , ponga solo = Diferencia en C101 y calcula Suma (C5: C100) - Suma (D5: D100) .

Obviamente, puede usar nombres locales o globales en las fórmulas nombradas, como mencionó en su pregunta.

Puede leer más detalles en Fórmulas con nombre .

Paulo Buchsbaum
fuente
2

Sé que dijiste que no hay VBA, pero hacer lo siguiente NO requiere que realmente reescribas tus fórmulas, no sepas mucho sobre VBA ni mantengas tus fórmulas en VBA. Puedes escribirlo una vez y olvidarte de él.

Cree una función definida por el usuario para extraer la fórmula de una celda como una cadena:

Function GetFormula(Target As Range) As String
    GetFormula = Target.Formula
End Function

Cree otro para evaluar una cadena como una fórmula:

Function Eval(Ref As String)
    Application.Volatile
    Eval = Evaluate(Ref)
End Function

Si tuviera su fórmula maestra en sheet1! A1, entonces pondría esto en cada celda que necesita usarlo:

=eval(getformula(sheet1!a1))
Madball73
fuente
¿Cuál es la ventaja de usar este método sobre las fórmulas con nombre de Excel?
DakotaD
En realidad, esto define una función, mientras que "Fórmulas con nombre" solo define una referencia a un resultado. Por ejemplo, si quiero crear una función que verifique si una celda está en blanco o solo en blanco, me gustaría llamarla así =IF(BlankOrWhitespace(A5),true,false). Para las fórmulas con nombre eso no es posible porque hace referencia al contenido de la fórmula de una celda y no define una nueva función
mtalexan
1
Hay otro problema que surge del uso de VBA. Seguridad. Su libro de trabajo sería considerado inseguro porque se puede abusar de VBA. Su libro de trabajo se confundiría con virus.
Akangka
@Akangkathe razón por la que evito VBA. Eso es tan triste.
Pedro77
0

Este hilo es un poco viejo, pero me topé con él buscando algo más y pensé en compartir un libro que creé hace un tiempo tratando de lograr esto: https://www.dropbox.com/s/gf5qrjj5q81tpke/ Title_Case_Named_Range_Function.xlsx? Dl = 1

En resumen, PUEDE crear un UDF sin VBA (más o menos) al secuestrar una de las fórmulas integradas de Excel con una salida de cadena de longitud 0 y encontrar un método para interpretar los datos insertados a través de la manipulación de cadenas de rango con nombre, pero es más que ineficiente para hacerlo. ¡HAS SIDO ADVERTIDO! :)

MÉTODO:

  1. En el ejemplo, utilicé = REPT ([referencia de celda o algún texto entre comillas aquí], 0) y = TEXTO ([referencia de celda o algún texto entre comillas aquí], ";;;") como punto de partida para ser capaz de tener alguna forma de entrada del usuario en una fórmula integrada que no produciría ningún resultado de texto visible en la celda misma.

  2. Luego creé un rango con nombre que sería el equivalente de su nombre UDF ( TCase es el ejemplo principal en la hoja, pero también hay varias otras variaciones allí). Este rango con nombre en realidad hace referencia a una gran cantidad de otros nombres ocultos en el libro de trabajo para extraer el FórmulaText de la celda en la que se usa y luego aplica cierta lógica para producir una salida final como una cadena. Vale la pena señalar que este método solo podría devolver resultados de texto y no números (aunque podría devolver un número como texto para convertirlo en una celda separada).

  3. Por sí solo, = TCase produce un error ya que no hay una referencia de celda / cadena para interpretar (en la hoja de ejemplo, el mensaje de error es solo un recordatorio del formato que debe seguirse). Pero, combinar TCase con la fórmula Excel de cadena de longitud 0 esperada le permite leer la entrada de la fórmula como una cadena y aplicarle su lógica. Al final, la fórmula / salida se vería como a continuación. Tenga en cuenta que inserté la cadena de texto directamente en la fórmula a continuación, pero verá en la hoja de ejemplo que también puede interpretar una referencia de celda única.

    FÓRMULA:
    =TCase&REPT("i want to convert this mIxEd sTRing into A TITLE cAsE string!!!",0)

    SALIDA:

    I Want to Convert This Mixed String Into a Title Case String!!!

Al final, no recomendaría seguir este método para otra cosa que no sea una curiosidad mórbida para ver a qué límites se puede empujar Excel. VBA es una solución UDF mucho más simple y elegante, pero al menos me divertí asumiendo el desafío.

NOTA: Si desea ver un poco más fácil cómo funciona en el archivo de ejemplo, use la fórmula Evaluar de la cinta Fórmulas e ingrese / salga de la fórmula en una de las celdas donde inserté un ejemplo. Escondí todos los rangos con nombre subyacentes para limpiarlo todo después de que terminé, para que no aparezcan en el Administrador de nombres a menos que los muestres todos.

Iglesia
fuente