Enteros de 18 digitos

26/07/2005 - 11:59 por Angel O | Informe spam
Hola a todos. Necesito hacer calcular el resto de números de 18 dígitos (o
alguno mas) dividido entre uno de 2. El problema es que Excel con la fórmula
"=Residuo(123456789012345678;97)" me devuelve "#¡NUM!" supongo que por que
el entero es demasiado largo. Alguna idea para hallar el resto de la
división entre un entero de 18 cifras entre 97?.

Gracias.

Àngel O.

Preguntas similare

Leer las respuestas

#6 Luis Garcia
28/07/2005 - 08:55 | Informe spam
"Fernando Arroyo" escribió en...
No sé si habrá alguna forma más elegante de hacerlo, pero una posible
solución sería usar el tipo de datos Decimal de VBA en una función
personalizada. Por ejemplo:

Function MiResto(sNúmero As String, lDivisor As Long) As Long
Dim a As Variant
Dim n As Long

a = CDec(sNúmero)
n = lDivisor

For n = 0 To lDivisor
If Int((a - n) / lDivisor) = (a - n) / lDivisor Then
MiResto = n
Exit Function
End If
Next n
End Function



Continuando con la idea de usar el tipo de datos Decimal, y como no se
puede usar el operador MOD, pero si el resto de operadores:

Public Function RestoDEC(cNumero As String, nDivisor As Long) As Long
Dim vDec As Variant

vDec = CDec(cNumero)
RestoDEC = vDec - Int(vDec / nDivisor) * nDivisor

''' o todo en una linea:
RestoDEC = CDec(cNumero) - Int(CDec(cNumero) / nDivisor) * nDivisor
End Function

Saludos
Respuesta Responder a este mensaje
#7 Fernando Arroyo
28/07/2005 - 09:45 | Informe spam
"Angel O" escribió en el mensaje news:

Frenando. Si que tengo acceso a cuenats bancarias. Y te confirmo que con
cunetas que empiezan por 0 funciona correctamente. (la celda ha de tener
formato texto, como es lógico).




Gracias.

Mi problema es que tengo que calcular el dígito de control de cuentas
extranjeras, la longitud de las mismas varía dependiendo del país. Francia e
Italia (que son lo smas largos), son 23 dígitos, y pueden tener letras en
medio, con lo que al pasarl éstas a números, cada una se convierte en dos
cifras, con lo que el número a tratar pude tener 25 o 26 cifras. !! :(




Supongo que se podría modifica la fórmula que calcula los dígitos IBAN de los CCC españoles para adaptarla a los códigos bancarios de otros países, pero utilizando la técnica que usa la fórmula "española" estamos en condiciones de prescindir de la función que puse en mi primera respuesta, utilizando en cambio la siguiente fórmula para enteros de entre 17 y 24 cifras:

=RESIDUO(RESIDUO(RESIDUO(EXTRAE(A1;1;8);97)&EXTRAE(A1;9;8);97)&EXTRAE(A1;17;8);97)

o esta otra para enteros de entre 25 y 32 cifras:

=RESIDUO(RESIDUO(RESIDUO(RESIDUO(EXTRAE(A1;1;8);97)&EXTRAE(A1;9;8);97)&EXTRAE(A1;17;8);97)&EXTRAE(A1;25;8);97)

Como curiosidad, de esta forma sería posible procesar enteros de hasta 56 dígitos:

=RESIDUO(RESIDUO(RESIDUO(RESIDUO(RESIDUO(RESIDUO(RESIDUO(EXTRAE(A1;1;8);97)&EXTRAE(A1;9;8);97)&EXTRAE(A1;17;8);97)&EXTRAE(A1;25;8);97)&EXTRAE(A1;33;8);97)&EXTRAE(A1;41;8);97)&EXTRAE(A1;49;8);97)

No parece posible procesar enteros de más de 58 dígitos, porque el número máximo de anidamientos que permite Excel en las funciones de hoja de cálculo es 7 y porque a la función RESIDUO no parecen "gustarle" los enteros de más de diez dígitos, pero pienso que usando VBA dicho límite se podría sobrepasar.

Te aconsejo que uses estas fórmulas mejor que la función por varias razones, entre las que destaca que las fórmulas "nativas" de Excel son mucho más rápidas que las funciones escritas en VBA.
Un saludo.


Fernando Arroyo
MS MVP - Excel


En cualquier caso ha hecho la prueba con la función que me pasaste y de
momento me ha funcionado correctamente con todas las puebas que he hecho.

GRACIAS DE NUEVO.

"Fernando Arroyo" escribió en el mensaje
news:
"Angel O" escribió en el mensaje
news:
Otra vez Gracias Fernando. Me ha sido MUY, MUY útil tu ayuda. Yo me he


liado
dividiendo el número inicial en bloques de 10 cifras, etc.. Muchas Gracias


y
hasta la próxima

Respuesta Responder a este mensaje
#8 Fernando Arroyo
28/07/2005 - 09:57 | Informe spam
"Luis Garcia" escribió en el mensaje news:
"Fernando Arroyo" escribió en...
No sé si habrá alguna forma más elegante de hacerlo, pero una posible
solución sería usar el tipo de datos Decimal de VBA en una función
personalizada. Por ejemplo:

Function MiResto(sNúmero As String, lDivisor As Long) As Long
Dim a As Variant
Dim n As Long

a = CDec(sNúmero)
n = lDivisor

For n = 0 To lDivisor
If Int((a - n) / lDivisor) = (a - n) / lDivisor Then
MiResto = n
Exit Function
End If
Next n
End Function



Continuando con la idea de usar el tipo de datos Decimal, y como no se
puede usar el operador MOD, pero si el resto de operadores:

Public Function RestoDEC(cNumero As String, nDivisor As Long) As Long
Dim vDec As Variant

vDec = CDec(cNumero)
RestoDEC = vDec - Int(vDec / nDivisor) * nDivisor

''' o todo en una linea:
RestoDEC = CDec(cNumero) - Int(CDec(cNumero) / nDivisor) * nDivisor
End Function

Saludos





Efectivamente, había una forma "más elegante" de hacerlo :-)
Gracias, y un saludo.


Fernando Arroyo
MS MVP - Excel
Respuesta Responder a este mensaje
#9 Fernando Arroyo
28/07/2005 - 10:18 | Informe spam
Las mismas fórmulas, más cortas.

Para los dígitos de control:

ÞRECHA("0"&98-RESIDUO(RESIDUO(RESIDUO(RESIDUO(EXTRAE(A1;1;8);97)&EXTRAE(A1;9;8);97)&EXTRAE(A1&"142800";17;8);97)&EXTRAE(A1&"142800";25;2);97);2)

Y para el código IBAN completo:

="ES"&DERECHA("0"&98-RESIDUO(RESIDUO(RESIDUO(RESIDUO(EXTRAE(A1;1;8);97)&EXTRAE(A1;9;8);97)&EXTRAE(A1&"142800";17;8);97)&EXTRAE(A1&"142800";25;2);97);2)&A1
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida