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

#1 Cristian
14/02/2006 - 20:40 | Informe spam
Hola:

Crea una funcion q tenga el siguiente codigo:

function dv(Numero) as integer
mVal=array(71,67,...,3) 'matriz de 15 elementos

for c=1 to 15
digito=mid(numero,c,1)
SumatoriaDeProductos =SumatoriaDeProductos +digito*mVal(c+1)
next
CalculoDeResiduo =SumatoriaDeProductos mod 11

select case CalculoDeResiduo
case=0
dv=0
case=1
dv=1
case else
dv-CalculoDeResiduo
end select
end function

ojo: la matriz mval tiene como base 0 por eso es c+1




"ElProfe" escribió en el mensaje
news:
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
Respuesta Responder a este mensaje
#2 KL
14/02/2006 - 22:13 | Informe spam
Hola chicos,

Yo diria que el camino de funciones personalizadas es bastante piligroso especialmente si se quiere usar varias instancias de esa
funcion. Creo que no tiene ningun sentido usar VBA donde se puede usar formulas que son muchisimo mas rapidas.

Un par de cosas:
1) No consigo ver como el resultado de [SumatoriaDeProductos/11] podria ser 1
2) Creo que la unica posibilidad de que [SumatoriaDeProductos/11] sea 0 es si el numero es igual a 0 o vacio
3) Supongo que no hay que comprobar si los 15 caracteres son cifras.
4) A ver la siguiente formula:
=SI(Y(LARGO(A1);--A1>0);(11-SUMAPRODUCTO(--EXTRAE(A1;FILA(INDIRECTO("1:15"));1)*{71\67\59\53\47\43\41\37\29\23\19\17\13\7\3})/11);0)

Saludos,
KL


"Cristian" wrote in message news:u%
Hola:

Crea una funcion q tenga el siguiente codigo:

function dv(Numero) as integer
mVal=array(71,67,...,3) 'matriz de 15 elementos

for c=1 to 15
digito=mid(numero,c,1)
SumatoriaDeProductos =SumatoriaDeProductos +digito*mVal(c+1)
next
CalculoDeResiduo =SumatoriaDeProductos mod 11

select case CalculoDeResiduo
case=0
dv=0
case=1
dv=1
case else
dv-CalculoDeResiduo
end select
end function

ojo: la matriz mval tiene como base 0 por eso es c+1




"ElProfe" escribió en el mensaje
news:
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


Respuesta Responder a este mensaje
#3 KL
14/02/2006 - 22:54 | Informe spam
Hola chicos,

Creo que no habia entendido bien la tarea. Sigo pensando que es mejor usar formulas. Suponiendo que los numeros estan en la columna
[A]...

Op1. Usar dos formulas:
[B1] =RESIDUO(SUMAPRODUCTO(--EXTRAE(A1;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)

Op2. Usar un nombre definido y una formula.
-selecciona la celda [B1]
- menu Insertar>Nombre>Definir...
- nombre: RES
- se refiere a: =RESIDUO(SUMAPRODUCTO(--EXTRAE(!A1;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)


Saludos,
KL


"KL" wrote in message news:
Hola chicos,

Yo diria que el camino de funciones personalizadas es bastante piligroso especialmente si se quiere usar varias instancias de esa
funcion. Creo que no tiene ningun sentido usar VBA donde se puede usar formulas que son muchisimo mas rapidas.

Un par de cosas:
1) No consigo ver como el resultado de [SumatoriaDeProductos/11] podria ser 1
2) Creo que la unica posibilidad de que [SumatoriaDeProductos/11] sea 0 es si el numero es igual a 0 o vacio
3) Supongo que no hay que comprobar si los 15 caracteres son cifras.
4) A ver la siguiente formula:
=SI(Y(LARGO(A1);--A1>0);(11-SUMAPRODUCTO(--EXTRAE(A1;FILA(INDIRECTO("1:15"));1)*{71\67\59\53\47\43\41\37\29\23\19\17\13\7\3})/11);0)

Saludos,
KL


"Cristian" wrote in message news:u%
Hola:

Crea una funcion q tenga el siguiente codigo:

function dv(Numero) as integer
mVal=array(71,67,...,3) 'matriz de 15 elementos

for c=1 to 15
digito=mid(numero,c,1)
SumatoriaDeProductos =SumatoriaDeProductos +digito*mVal(c+1)
next
CalculoDeResiduo =SumatoriaDeProductos mod 11

select case CalculoDeResiduo
case=0
dv=0
case=1
dv=1
case else
dv-CalculoDeResiduo
end select
end function

ojo: la matriz mval tiene como base 0 por eso es c+1




"ElProfe" escribió en el mensaje
news:
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





Respuesta Responder a este mensaje
#4 ElProfe
15/02/2006 - 03:32 | Informe spam
Seguramente no fui lo suficientemente claro al exponer mi planteamiento
y buscando enmendar lo sucedido, aclaro:

-El número es un entero, positivo, máximo de de 15 cifras (puede ser
de menos; ej. 7654 que sería de 4 dígitos)

-Supongo que un paso previo es validar que se trata de un número.

a) Un primer paso es descomponer el número de 15 digitos, uno a uno
(7, 6, 5, y 4)

b) Cada dígito así extraido, se multiplica por la constante que le
corresponda según su propia posición (7 x 17) = 119 + (6 x 13) = 78 +
( 5 x 7) = 35 + (4 x 6) = 12

c) Se suman los productos anteriores (119 + 78 + 35 + 129 = 244

d) La sumatoria sedivide por 11 (244 / 11 = 22.2)

e) Se toma el residuo de la operación anterior (o sea 2)

Luego se evalua que:

f) Si el residuo es 0 (cero), defina como digito de verificación 0
(cero); (no se cumple para el ejemplo)

f) Si el residuo es 1 (uno), defina como digito de verificación 1
(uno); (no se cumple para el ejemplo)

g) Si el residuo es diferente de 0 (cero) y de 1 (uno), defina como
digito de verificación el rresultado de hacer la siguiente resta: 11 -
Residuo (o sea 11 - 2 = 9; que se cumple para el ejemplo, luego el
digito de verificación para el entero 7654 es 9)

Lo anterior me permite hacer claridad de que:
1) No es el resultado de [SumatoriaDeProductos/11] puedaser 1; es el
residuo el que puede ser uno (1)

2) [SumatoriaDeProductos/11] no puede llegar a ser 0; pero igual no
importa puesto que setrata es del residuo que si puede ser cero (0)

3) La suposición de KL es totalmente válida,se me pasó! hay que
comprobar si los 15 caracteres son cifras.

4) La solución que propone KL mediante formulación es muy válida,
además de interesante, pero el requerimiento es VBA, porque ese
dígito debe calcularse para 25 a 30 mil items de un inventario y esos
items estarán en una hoja de Excel, con muchos mas datos; luego la
formulación haría aun mas pesado el archivo, con el riesgo adicional
de que la fórmula en un momento dado llegue a ser adulterada por
accidente, dada la volatilidad en la que quedaría.

Aunque el resultado sería el mismo (con formula o con VBA), el código
resulta mas seguro en este caso, pues solo es ir a [Insertar]
[Funciones] [Definidas por el usuario] y hacer uso de la función
personalizada que allí se coloque para el propósito, sin riesgo de
adulterar ninguno de sus componentes.

De otra parte, no consigo que funcione el código enviado por Cristian,
pero esa sería la solución ideal.

Me quedó así (pero se que algo está mal trascrito a mi editor de
VBA):

Option Explicit
Function dv(Numero) As Integer
mVal Array(71, 67, 59, 53, 47, 43, 41, 37, 29, 23, 19, 17, 13, 7, 3)
'matriz de 15 elementos
For i = c1 To 15
digitomid(Numero,i,1) 'ERROR
SumatoriaDeProductos = SumatoriaDeProductos + digito * mVal(c + 1)
Next i
CalculoDeResiduo SumatoriaDeProductos Mod 11
Select Case CalculoDeResiduo
case0
dv0
case1
dv1
Case Else
dv-CalculoDeResiduo 'ERROR
End Select
End Function


Gracias KL y gracias Cristian; los dos son muy amables al atender mi
inquietud.

Saludos,

ElProfe
Respuesta Responder a este mensaje
#5 Cristian
15/02/2006 - 15:02 | Informe spam
Hola, creo que la pasada por la web le ha jugado en contra a mi funcion
pues perdio, aparentemente, su sintaxis veo errores en:

mVal = Array(71, 67, 59, 53, 47, 43, 41, 37, 29, 23, 19, 17, 13, 7, 3)

for c = 1 to 15

digito = mid(numero,c, 1)

pero ahora q comentas antecedentes adicionales cambio todo el codigo por el
siguiente:

function dv(Numero) as integer
if not isnumeric(numero) then exit function

mVal=array(71,67,...,3) 'matriz de 15 elementos

for c=1 to len(numero)
digito=mid(numero,c,1)
SumatoriaDeProductos =SumatoriaDeProductos +digito*mVal(c-1)
next
CalculoDeResiduo =SumatoriaDeProductos mod 11

if CalculoDeResiduo <2 then
dv=CalculoDeResiduo
else
dv-CalculoDeResiduo
end if

end function


ESPERO Q AHORA SI FUNCIONE SINO SOLO COMENTAS Y VEMOS Q HACER


Saludos, CRISTIAN





"ElProfe" escribió en el mensaje
news:
Seguramente no fui lo suficientemente claro al exponer mi planteamiento
y buscando enmendar lo sucedido, aclaro:

-El número es un entero, positivo, máximo de de 15 cifras (puede ser
de menos; ej. 7654 que sería de 4 dígitos)

-Supongo que un paso previo es validar que se trata de un número.

a) Un primer paso es descomponer el número de 15 digitos, uno a uno
(7, 6, 5, y 4)

b) Cada dígito así extraido, se multiplica por la constante que le
corresponda según su propia posición (7 x 17) = 119 + (6 x 13) = 78 +
( 5 x 7) = 35 + (4 x 6) = 12

c) Se suman los productos anteriores (119 + 78 + 35 + 129 = 244

d) La sumatoria sedivide por 11 (244 / 11 = 22.2)

e) Se toma el residuo de la operación anterior (o sea 2)

Luego se evalua que:

f) Si el residuo es 0 (cero), defina como digito de verificación 0
(cero); (no se cumple para el ejemplo)

f) Si el residuo es 1 (uno), defina como digito de verificación 1
(uno); (no se cumple para el ejemplo)

g) Si el residuo es diferente de 0 (cero) y de 1 (uno), defina como
digito de verificación el rresultado de hacer la siguiente resta: 11 -
Residuo (o sea 11 - 2 = 9; que se cumple para el ejemplo, luego el
digito de verificación para el entero 7654 es 9)

Lo anterior me permite hacer claridad de que:
1) No es el resultado de [SumatoriaDeProductos/11] puedaser 1; es el
residuo el que puede ser uno (1)

2) [SumatoriaDeProductos/11] no puede llegar a ser 0; pero igual no
importa puesto que setrata es del residuo que si puede ser cero (0)

3) La suposición de KL es totalmente válida,se me pasó! hay que
comprobar si los 15 caracteres son cifras.

4) La solución que propone KL mediante formulación es muy válida,
además de interesante, pero el requerimiento es VBA, porque ese
dígito debe calcularse para 25 a 30 mil items de un inventario y esos
items estarán en una hoja de Excel, con muchos mas datos; luego la
formulación haría aun mas pesado el archivo, con el riesgo adicional
de que la fórmula en un momento dado llegue a ser adulterada por
accidente, dada la volatilidad en la que quedaría.

Aunque el resultado sería el mismo (con formula o con VBA), el código
resulta mas seguro en este caso, pues solo es ir a [Insertar]
[Funciones] [Definidas por el usuario] y hacer uso de la función
personalizada que allí se coloque para el propósito, sin riesgo de
adulterar ninguno de sus componentes.

De otra parte, no consigo que funcione el código enviado por Cristian,
pero esa sería la solución ideal.

Me quedó así (pero se que algo está mal trascrito a mi editor de
VBA):

Option Explicit
Function dv(Numero) As Integer
mVal Array(71, 67, 59, 53, 47, 43, 41, 37, 29, 23, 19, 17, 13, 7, 3)
'matriz de 15 elementos
For i = c1 To 15
digitomid(Numero,i,1) 'ERROR
SumatoriaDeProductos = SumatoriaDeProductos + digito * mVal(c + 1)
Next i
CalculoDeResiduo SumatoriaDeProductos Mod 11
Select Case CalculoDeResiduo
case0
dv0
case1
dv1
Case Else
dv-CalculoDeResiduo 'ERROR
End Select
End Function


Gracias KL y gracias Cristian; los dos son muy amables al atender mi
inquietud.

Saludos,

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