Cinc maneres de generar un número / valor únic per utilitzar-lo com a camp clau a VBA
https://www.accessyexcel.com/cinco-formas-de-generar-un-valor-unico-para-usarlo-como-campo-clave/
1 – Un auto numérico secuencial
Este sería el método más sencillo de emular el propio auto numérico de Access. Si necesitamos que cada registro tenga un número secuencial simplemente podemos leer el último número guardado, con la función de agregado Dmax y sumarle uno.
- Public Function NumId() As Long
- Dim Numero As Long
- Numero = DMax("Campo","Tabla")+1
- NumId = Numero
- End Function
Pero esta función, tal cual, tiene el problema de que si aún no hay registros, Dmax, devolverá un error, para ello podemos hacer uso de la función Nz que puede sustituir el Nulo por otro valor. Por ejemplo así:
- Public Function NumId() As Long
- Dim Numero As Long
- Numero = Nz(DMax("Campo","Tabla"),0) + 1
- NumId = Numero
- End Function
De esta forma, si no hubiera aún ningún registro la función devolvería el valor 1, el cero que devuelve Nz + el 1 que sumamos al final.
Se podría utilizar esta fórmula como parte del evento Current del formulario, analizando si es un nuevo registro y aplicando el valor a nuestro campo clave, más o menos así:
- Private Sub Form_Current()
- If Me.NewRecord Then
- Me.CampoClave = Nz(DMax("Campo","Tabla"),0) + 1
- End If
- End Sub
2 – A través de un número aleatorio
Podemos hacer uso de la función Rnd para conseguir un número aleatorio entre los valores que le especifiquemos, algo así:
- Public Function NumId() As Long
- Dim Numero As Long
- Randomize
- Numero = ((9999 - 1000 + 1) * Rnd + 1000)
- NumId = Numero
- End Function
El valor devuelto por esta función es un número comprendido entre el valor máximo, en este caso 9999 y el mínimo de 1000. Sobra decir que ambos valores se pueden cambiar sin problemas.
Y, como no te puedo asegurar que el número aleatorio no se repita de una vez a otra, aunque es sumamente difícil que esto ocurra pero no imposible, si quieres perfeccionar el método, podrías comprobar, antes de asignar el valor a un campo, si ya existe mediante DlookUp, por ejemplo.
3 – Utilizando la fecha y la hora del sistema
Este podría ser otro método para tener una especie de auto numérico combinando los dígitos del año, el mes, el día, la hora, los minutos y los segundos del sistema. Con este método sería complicado obtener dos números iguales, ya sería mucha casualidad que dos personas crearan un registro en el mismo segundo. Lo interesante de este método es que la numeración sigue una secuencia e incluso nos vale como referencia para saber en que momento se ha creado el registro. La función sería mas o menos así:
- Public Function NumId() As Double
- Dim Numero As Double
- Numero = CDbl(Format(Now(), "ddmmyyhhmmss"))
- NumId = Numero
- End Function
Esta función tiene el inconveniente de que el número que genera es demasiado grande y debemos usar un tipo de datos Double que ocupa el doble de bytes(8) en el sistema que el Entero Largo(4) del ejemplo anterior.
Esta función devolvería un número como este: 160414221136
4 – Secuencial con reinicio anual
Otra necesidad que en muchas ocasiones nos hemos encontrado consiste en tener que contabilizar las facturas y llevar una numeración que precisa, por un lado, añadir al principio los dígitos del año, y por otro, reiniciar la numeración a cada año nuevo. Por ejemplo podríamos estar haciendo facturas del 2013 así:
20130028, 20130029, 20130030, 20130031…….etc
y al llegar al 2014 tener que reiniciar la numeración:
20140001, 20140002, 20140003…..etc.
Comentaris
Publica un comentari a l'entrada