martes, 24 de enero de 2017

Suma Individual de los Dígitos de un Número

Un lector consultaba por la manera de reducir un número a su suma mínima de los valores de sus dígitos en nuestra hoja de Excel:
[...]necesito una macro que me permita calcular el valor en su mínima expresión de un nombre al introducirlo.
ejemplo:
María =41991, 4+1+9+9+1=24; 2+4=6
entonces el valor numérico de María=6
[...]


La pregunta parece sencilla a priori, y quizá tenga un componente 'esotérico' detrás... ya que esta es una de las maneras en que se obtiene el número de la suerte personal de cada uno
;-)

Sin embargo, hay un componente matemático relevante detrás de todo esto, y es que la Prueba del nueve para la suma (o resta) explica en parte algunas de las fórmulas que vamos a desarrollar a continuación.
Puedes leer algo más en la Wikipedia


Partiremos de un número cualquiera en nuestra celda A2 (por ejemplo 1309)

Suma Individual de los Dígitos de un Número



Una primera solución para conseguir 'nuestro número de la suerte' (1309 - 1+3+0+9 = 13 - 1+3 = 4) sería mediante la siguiente fórmula:
=1+RESIDUO(SUMAPRODUCTO(--EXTRAE(A2;FILA(INDIRECTO("1:" & LARGO(A2)));1))-1;9)

Reduciendo mucho el método o prueba, el asunto consiste en:
1) Hallar los restos de la división por 9 de los componentes de la operación aritmética.
2) Realizar con estos restos la misma operación aritmética y calcular para el resultado obtenido su resto cuando se divida por 9.
3) Obtener también el resto de dividir por 9 el resultado de la operación aritmética.
4) Comparar los números obtenidos en los pasos 2 y 3.


Esta fórmula trabaja, en realidad, matricialmente (una virtud de la función SUMAPRODUCTO), donde:
(--EXTRAE(A2;FILA(INDIRECTO("1:" & LARGO(A2)));1))
nos devuelve el listado de los componentes del valor a estudiar, en nuestro ejemplo:
{1;3;0;9}

Al aplicarle posteriormente SUMAPRODUCTO, conseguimos sus suma de elementos.
Finalmente, aplicamos la regla del nueve y al obtener su resto (función RESIDUO) con los ajustes oportunos (+1 y -1) llegamos al dato deseado.


Una alternativa es el empleo de programación en VBA para Excel, creando una función personalizada (UDF).
ASi pues insertamos en un módulo estándar el siguiente procedimiento Function:

Function SumaDigitos(numero As Range) As Long
Dim txt As String
Application.Volatile

'definimos variable
txt = numero.Value
'marcamos un bucle mientras
'que el número de dígitos del dato acumulado sea mayor que 1
While Len(txt) > 1
    'comenzamos contador acumulado
    SumaDigitos = 0
    'recorremos cada caracter/número del valor
    For i = 1 To Len(txt)
        'acumulamos dígito tras dígito
        SumaDigitos = SumaDigitos + Val(Mid(txt, i, 1)) ' * 1
    Next
    'obtenemos un nuevo valor parcial
    'sobre el que operaremos nuevamente...
    txt = SumaDigitos
Wend
End Function



En este caso el procedimiento es sencillo, recorremos los elementos del número, dígito a dígito, sumando sus partes.. y aplicamos recurrentemente mientras el valor obtenido tenga más de un dígito.

Lógicamente en ambos casos obtenemos el mismo resultado; para nuestro ejemplo el 4

2 comentarios:

  1. Hola, el UDF presenta un error cuando uno sobrepasa mas de 8 digitos a considerar y sumar...yo corregi el error...

    ResponderEliminar
    Respuestas
    1. ¿¿??
      hola Pablo, donde te salta el error, probé con los 16 dígitos que permite Excel y devuelve el dato sin problemas
      Gracias!

      Eliminar