Código para personalizar una función

14/02/2006 - 16:13 por ElProfe | Informe spam
Bueno amigos, como lo mio no es el código VBA, llegó el momento de
pedirles su ayuda! por favor, espero contar con ella.

Requiero personalizar una función que me permita calcular el dígito
de chequeo (o verificación) de un entero, positivo, de 15 cifras, cuyo
algoritmo es el siguiente (considerando las posiciones del entero de
izquierda a derecha):
+ ( Posición 01 * 71)
+ ( Posición 02 * 67)
+ ( Posición 03 * 59)
+ ( Posición 04 * 53)
+ ( Posición 05 * 47)
+ ( Posición 06 * 43)
+ ( Posición 07 * 41)
+ ( Posición 08 * 37)
+ ( Posición 09 * 29)
+ ( Posición 10 * 23)
+ ( Posición 11 * 19)
+ ( Posición 12 * 17)
+ ( Posición 13 * 13)
+ ( Posición 14 * 07)
+ ( Posición 15 * 03)
=SumatoriaDeProductos / 11
=CalculoDeResiduo (SumatoriaDeProductos / 11)
Si (CalculoDeResiduo = 0 entonces 0)
Si (CalculoDeResiduo = 1 entonces 1)
Si (y(CalculoDeResiduo <> 0,CalculoDeResiduo <> 1) entonces (11 -
CalculoDeResiduo))

Por su amable atención y ayuda, reciban mis agradecimientos
anticipados.

Saludos,

ElProfe

Preguntas similare

Leer las respuestas

#6 KL
15/02/2006 - 15:52 | Informe spam
Hola ElProfe,

Primero decirte que de tu explicacion deduzco que no has visto mi segunda respuesta :-)

En todo caso al parecer en este caso una funcion VBA da mejores resultados debido a su baja volatilidad SIEMPRE Y CUANDO NO
INTRODUZCAS/MODIFIQUES/BORRES MUCHOS NUMEROS A LA VEZ (en ese caso podras apreciar perfectamente lo que es la Eternidad :-)):

A continuacion paso a exponer las soluciones actuaizadas y los resultados de mis pruebas sobre el rango A1:A65536 llenado
completamente con numeros de longitud variable entre 1 y 15 (65536 numeros) en una Dell Dimension P4 1.8GHz, RAM 512MB:

1) Usar dos formulas:
[B1]
=RESIDUO(SUMAPRODUCTO(--EXTRAE(A1&"000000000000000";FILA(INDIRECTO("1:15"));1)*{71\67\59\53\47\43\41\37\29\23\19\17\13\7\3});11)
[C1] =SI(B1>1;11-B1;B1)

Peso: 19,765 KB
Numero de caracteres: 146
Tiempo Recalculo Total (cambiando todos los datos): ~ 7 segundos
Tiempo Recalculo Total: (sin cambiar datos) ~ 7 segundos
Tiempo Recalculo Local: ~ 7 segundos
Volatilidad: Alta

2) Usar un nombre definido + formula:
-selecciona la celda [B1]
- menu Insertar>Nombre>Definir...
- nombre: RES
- se refiere a:
=RESIDUO(SUMAPRODUCTO(--EXTRAE(!A1&"000000000000000";FILA(INDIRECTO("1:15"));1)*{71\67\59\53\47\43\41\37\29\23\19\17\13\7\3});11)

[B1] =SI(RES>1;11-RES;RES)

Peso: 4,670 KB
Numero de caracteres: 150
Tiempo Recalculo Total (cambiando todos los datos): ~ 11 segundos
Tiempo Recalculo Total (sin cambiar datos): ~ 11 segundos
Tiempo Recalculo Local: ~ 11 segundos
Volatilidad: Alta

3) Funcion definida en VBA + formula:

Function DC(Numero As String) As Integer
Dim Mult As Variant, i As Integer, SumaProd As Double
Dim Digito As Integer, RES As Integer
Mult = Array(71, 67, 59, 53, 47, 43, 41, 37, 29, 23, 19, 17, 13, 7, 3)
For i = 1 To Len(Numero)
Digito = Mid(Numero, i, 1)
SumaProd = SumaProd + Digito * Mult(i - 1)
Next i
RES = SumaProd Mod 11
Select Case RES
Case 0, 1
DC = 0
Case 1
DC = 1
Case Else
DC = 11 - RES
End Select
End Function

[B1] Ü(A1)

Peso: 4,669 KB
Numero de caracteres: 493
Tiempo Recalculo Total (cambiando todos los datos): ~ 566 segundos (mucho cuidado)
Tiempo Recalculo Total (sin cambiar datos): ~ 4.35 segundos
Tiempo Recalculo Local: ~ 0.39 segundos
Volatilidad: Baja


Saludos,
KL
Respuesta Responder a este mensaje
#7 ElProfe
16/02/2006 - 03:14 | Informe spam
Hola KL; hola Cristian;

Les reitero mis agradecimientos, no solo por el interés en mi
inquietud, sino por las múltiples explicaciones que nos dan; esa noble
actitud evidencia que son verdaderos eruditos en estas lides.

Por partes:

KL, te ofrezco disculpas, pues efectivamente parece que pasé por alto
tu segunda respuesta. En cuanto a los demás argumentos, tienes
absolutamente toda la razón en todo; que mas que las pruebas que nos
aportes. Además acepto que yo estaba en un error al considerar que el
uso de codigo VBA "ahorra" espacio y tamaño en los archivos, frente al
uso de funciones "normales". Como si fuera poco, no había conocido a
nadie que manejara tan bien el diseño de funciones, de forma diferente
a como lo hacemos el comun de los mortales, pero de manera tan
abreviada y eficiente! He aprendido una gran lección!
KL, esta vez leí todo y probé las tres opciones; las dos fórmulas
llegan al resultado correcto, mientras que el codigo VBA me da 2 cuando
debe dar 9 (según el aclaratorio que envié a la lista). Creo que es
lo de menos, pues debo buscar la causa y corregirla.

Cristian:
Es curioso, pero sí! cuando miro los mensajes que tu me envías (solo
los tuyos), aparecen unos caracteres que estoy seguro no forman parte
de tu planteamiento original. Claro que no descartes errores mios al
tratar de corregir algún renglon de código, pero te transcribo dos
ejemplos:
if CalculoDeResiduo <2 then
dvÊlculoDeResiduo ("la E mayúscula con el acento francés")
else
dv-CalculoDeResiduo ("el cuadrado que esta a la derecha de dv")

Por ley de Morphy (lo que puede fallar, falla!), no he conseguido que
tu codigo me funcione. Cuando lo logre te lo haré saber.

Saludos y gracias de nuevo a los dos

Cordialmente,

Manuel
(ElProfe)
Respuesta Responder a este mensaje
#8 Cristian
16/02/2006 - 14:04 | Informe spam
Por curiosidad que usas para leer estos mensajes yo uso outlook
express y a veces los miro en support.microsoft.com/newsgroup y en ambos mis
mensajes salen sin problemas. bueno si te quieres enterar que decia mi
funcion (sin caracteres extraños) te recomiendo q le des una mirada a la
direccion q te comento.


Saludos, CRISTIAN



"ElProfe" escribió en el mensaje
news:
Hola KL; hola Cristian;

Les reitero mis agradecimientos, no solo por el interés en mi
inquietud, sino por las múltiples explicaciones que nos dan; esa noble
actitud evidencia que son verdaderos eruditos en estas lides.

Por partes:

KL, te ofrezco disculpas, pues efectivamente parece que pasé por alto
tu segunda respuesta. En cuanto a los demás argumentos, tienes
absolutamente toda la razón en todo; que mas que las pruebas que nos
aportes. Además acepto que yo estaba en un error al considerar que el
uso de codigo VBA "ahorra" espacio y tamaño en los archivos, frente al
uso de funciones "normales". Como si fuera poco, no había conocido a
nadie que manejara tan bien el diseño de funciones, de forma diferente
a como lo hacemos el comun de los mortales, pero de manera tan
abreviada y eficiente! He aprendido una gran lección!
KL, esta vez leí todo y probé las tres opciones; las dos fórmulas
llegan al resultado correcto, mientras que el codigo VBA me da 2 cuando
debe dar 9 (según el aclaratorio que envié a la lista). Creo que es
lo de menos, pues debo buscar la causa y corregirla.

Cristian:
Es curioso, pero sí! cuando miro los mensajes que tu me envías (solo
los tuyos), aparecen unos caracteres que estoy seguro no forman parte
de tu planteamiento original. Claro que no descartes errores mios al
tratar de corregir algún renglon de código, pero te transcribo dos
ejemplos:
if CalculoDeResiduo <2 then
dvÊlculoDeResiduo ("la E mayúscula con el acento francés")
else
dv-CalculoDeResiduo ("el cuadrado que esta a la derecha de dv")

Por ley de Morphy (lo que puede fallar, falla!), no he conseguido que
tu codigo me funcione. Cuando lo logre te lo haré saber.

Saludos y gracias de nuevo a los dos

Cordialmente,

Manuel
(ElProfe)
Respuesta Responder a este mensaje
#9 KL
16/02/2006 - 14:36 | Informe spam
Hola chicos,

Fe de erratas:

A. Las formulas no calculan bien porque la matriz de multiplicadores es vertical en vez de ser horizontal. Por tanto mis formulas
deberian modificarse de la siguiente manera:

1) Usar dos formulas:
[B1]
=RESIDUO(SUMAPRODUCTO(--EXTRAE(A1&"000000000000000";FILA(INDIRECTO("1:15"));1)*{71;67;59;53;47;43;41;37;29;23;19;17;13;7;3});11)
[C1] =SI(B1>1;11-B1;B1)

2) Usar un nombre definido + formula:
-selecciona la celda [B1]
- menu Insertar>Nombre>Definir...
- nombre: RES
- se refiere a:
=RESIDUO(SUMAPRODUCTO(--EXTRAE(!A1&"000000000000000";FILA(INDIRECTO("1:15"));1)*{71;67;59;53;47;43;41;37;29;23;19;17;13;7;3});11)
[B1] =SI(RES>1;11-RES;RES)

B. En el mensaje anterior, puse la version incorrecta (sin acabar) de la funcion VBA, aqui va la buena:

Option Base 1
Function DC(Numero As String) As Integer
Dim Mult As Variant, i As Integer, SumaProd As Double
Dim Digito As Integer, RES As Integer
Mult = Array(71, 67, 59, 53, 47, 43, 41, 37, 29, 23, 19, 17, 13, 7, 3)
For i = 1 To Len(Numero)
Digito = Mid(Numero, i, 1)
SumaProd = SumaProd + Digito * Mult(i)
Next i
RES = SumaProd Mod 11
Select Case RES
Case 0, 1: DC = RES
Case Else: DC = 11 - RES
End Select
End Function


Saludos y perdonad el lio,
KL

"ElProfe" wrote in message news:
Hola KL; hola Cristian;

Les reitero mis agradecimientos, no solo por el interés en mi
inquietud, sino por las múltiples explicaciones que nos dan; esa noble
actitud evidencia que son verdaderos eruditos en estas lides.

Por partes:

KL, te ofrezco disculpas, pues efectivamente parece que pasé por alto
tu segunda respuesta. En cuanto a los demás argumentos, tienes
absolutamente toda la razón en todo; que mas que las pruebas que nos
aportes. Además acepto que yo estaba en un error al considerar que el
uso de codigo VBA "ahorra" espacio y tamaño en los archivos, frente al
uso de funciones "normales". Como si fuera poco, no había conocido a
nadie que manejara tan bien el diseño de funciones, de forma diferente
a como lo hacemos el comun de los mortales, pero de manera tan
abreviada y eficiente! He aprendido una gran lección!
KL, esta vez leí todo y probé las tres opciones; las dos fórmulas
llegan al resultado correcto, mientras que el codigo VBA me da 2 cuando
debe dar 9 (según el aclaratorio que envié a la lista). Creo que es
lo de menos, pues debo buscar la causa y corregirla.

Cristian:
Es curioso, pero sí! cuando miro los mensajes que tu me envías (solo
los tuyos), aparecen unos caracteres que estoy seguro no forman parte
de tu planteamiento original. Claro que no descartes errores mios al
tratar de corregir algún renglon de código, pero te transcribo dos
ejemplos:
if CalculoDeResiduo <2 then
dvÊlculoDeResiduo ("la E mayúscula con el acento francés")
else
dv-CalculoDeResiduo ("el cuadrado que esta a la derecha de dv")

Por ley de Morphy (lo que puede fallar, falla!), no he conseguido que
tu codigo me funcione. Cuando lo logre te lo haré saber.

Saludos y gracias de nuevo a los dos

Cordialmente,

Manuel
(ElProfe)
Respuesta Responder a este mensaje
#10 ElProfe
17/02/2006 - 01:05 | Informe spam
Bueno Cristian; yo solo entro a...
http://groups.google.com/group/micr....es.excel/
...digito mi nombre de usuario, clave y listo; quedo dentro del correo
del grupo y puedo ver todos los mensjes. Lo hago por Internet Explorer
6.0.2900 de Microsoft.

No se si eso resuelva tu pregunta.

Saludos,

ElProfe
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida