Autres chalenge vba

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

patricktoulon

XLDnaute Barbatruc
salut à tous
je doit créer des Ids une par une avec un bouton ou créer a la chaine tout un paquet d'id sans faire de doublons à coup sur
le chalenge c'est de faire sans RND
et pour couronner le tout la seule donnée disponible que l'on peut utiliser c'est le nombre d'id déjà créés

je donnerais ma méthode quand il y aura eu quelques participations

les condition d’élaborations pour la fonction
  1. ne doit pas faire appel a la fonction RND
  2. ne doit pas faire appel a un name ou registre ou toute autre source de memoring
  3. elle doit s'auto suffire
  4. et le must si je transfert cette fonction dans un autre classeur( et même plus loin , autre pc) elle ne doit pas créer des id déjà crées au par avant
 
Dernière édition:
Solution
re
@Oui sylvanu c'est juste pour te montrer que le moteur va (difficile de calculer tu prend un peu plus d'une seconde pour 100 je prends 0.6xxx pour 60 000

mais dans tout les cas personne n'a trouver l'astuce pour justement ne pas retirer les même
alors je vous le dis
la chose et simple la fonction réécrit son propre ADN
Code:
'+------------------------------------------------------------+
'¦                        PATRICKTOULON                       ¦
'¦                   collection fonction perso DNA            ¦
'¦   FONCTION AUTOSUFFISANTE PATRICKIENNE — VERSION 1.0       ¦
'¦ Cette fonction est vivante.Elle réecrit son propre ADN.   ¦
'¦ Elle ne dépend de rien. Il ne laisse rien derrière ELLE.   ¦
'¦ Elle est unique...
Bonjour à tous
et pour augmenter la difficulté
je dois avoir la possibilité de fermer le fichier et le rouvrir a volonté sans qu'il y ai la possibilité de retomber sur un id déja créé
et je dois puvaoir copier coller cette fonction ou sub dans n'importe quel fichier et la aussi je ne dois pas avoir la possibilité de retomber sur un id déjà créé
 
Bonjour Patrick,
Comme il faut bien se lancer, un essai en PJ basé sur une variable Now+Timer qui donne une variable dont la valeur ne peut se répéter.
Discutable Ô combien car impossible de prouver l'unicité en particulier avec l'hypothèse :
je dois pouvoir copier coller cette fonction ou sub dans n'importe quel fichier et la aussi je ne dois pas avoir la possibilité de retomber sur un id déjà créé
Est ce que l'ID product est considéré dans la rubrique "ne doit pas faire appel a un name ou registre ou toute autre source de memoring" ?
 

Pièces jointes

Bonjour à tous😉,

Pas certain d'avoir compris la question 🤨.

et pour couronner le tout la seule donnée disponible que l'on peut utiliser c'est le nombre d'id déjà créés
Si on connait le nombre d'IDs déjà créés alors le nombre d'ID est lui-même l'ID, non ?

Sur ce principe une macro. On a rajouté une lettre au début juste pour faire joli😄.
VB:
Sub TEST()
Const Lettres = "ABCDEFGHJKMNPRSTUWXYZ"
Dim DejaCree&, rep&, IDs, i&
   DejaCree = [d2]
   rep = Int(Val(Application.InputBox("Nombre de ID à créer: ?", , 1, Type:=1)))
   If rep > 0 Then
      ReDim IDs(1 To rep, 1 To 1)
      For i = 1 To rep: IDs(i, 1) = Mid(Lettres, 1 + i Mod Len(Lettres), 1) & Format(DejaCree + i, String(15, "0")): Next
      Cells(Rows.Count, "a").End(xlUp).Offset(1).Resize(UBound(IDs)) = IDs
   End If
End Sub
 

Pièces jointes

Bonjour tout les deux
@sylvanu
c'est pas mal du tout on est dépendant timer qui donne le même tout les jour a la même heure je suis pas sur que x même si le nombre est grand qu'il n'y ai pas de possibilité de doublon

@mapomme ça j'aurais pu le faire
je m'attendais a plus tordu venant de toi 😉 🤣 🤣

et vous avez oublié un détail important
c'est qu'un copier coller dans un module d'un autre classeur réinitialisera les compteurs


j'ai bien l'api CoCreateGuid mais je trouvais plus amusant de proposer ce chalenge vba et uniquement vba

je répète donc

les condition d’élaborations pour la fonction
  1. ne doit pas faire appel a la fonction RND
  2. ne doit pas faire appel a un name ou registre ou toute autre source de mémoring(cellule ou autre)
  3. elle doit s’ auto suffire
  4. et le must si je transfert cette fonction dans un autre classeur( et même plus loin , autre pc) elle ne doit pas créer des id déjà crées au par avant
le type de chaine m'importe peu tant que ça fait au moins 12/15 caractères et/ou plus (30 max sinon c'est des romans )
le point 4 est en rouge car c'est un point important

j'attends que vous me disiez le mot 🙃🤣🙃🤣
 
@mapomme ça j'aurais pu le faire
je m'attendais a plus tordu venant de toi 😉 🤣 🤣
Et pour une fois que je fais dans le simple et le trivial, on me renvoie dans mes foyers. Je boude 😠.

En passant, j'ai d'emblée écarté les méthodes basées sur la date et le temps car comme le machin doit être exécutable sur n'importe quelle machine, on ne peut pas affirmer que la même date et heure ne figurent pas sur un autre PC ou MAC à un autre autre instant quelque part dans le monde... Je me suis peut-être fourvoyé.
 
j'ai bien l'api CoCreateGuid mais je trouvais plus amusant de proposer ce chalenge vba et uniquement vba
Salut,
c'est effectivement ce que j'aurais utilisé :
La probabilité de générer un GUID (ou UUID) identique à un autre déjà existant est extrêmement faible, bien que non nulle. Pour les versions récentes, notamment la version 4 basée sur des nombres pseudo-aléatoires, le nombre total de combinaisons possibles est de l'ordre de 3,4 × 10³⁸. Même en générant un milliard de GUID par seconde pendant 100 ans, la probabilité d'obtenir un doublon serait d'environ 50 %. Cette probabilité est si faible qu'elle est généralement considérée comme négligeable pour tous les usages pratiques, bien que techniquement, une collision ne soit pas garantie à 100 %
Nullosse
 
bon je vous donne deux indices
indice 1: 01/01/100
indice 2: ADN
🤣 🤣 🤣
pour info @sylvanu 1.3xx chez moi ta fonction

la mienne 0.0115xx pour 10 Id mais c'est pas le même type de chaine
voici le type de chaine même si c'est pas une condition du chalenge
CF_8_15_A6_1_1B_B5_A_19
D0_2_13_B6_2_2_A6_3_12
A6_5_7_B6_5_D_D0_8_13
D1_2_11_A6_6_1A_B6_8_15
D1_8_12_B6_B_1D_A6_8_F
A6_A_4_B7_3_9_D2_2_10
D2_8_11_A6_B_17_B7_6_11
D3_2_F_B7_9_19_A7_1_C
A7_3_3_B8_1_3_D3_8_10
D4_2_E_A7_4_16_B8_4_C
D4_8_E_B8_7_15_A7_6_B
A7_7_1F_B8_A_1D_D5_2_C
D5_8_D_A7_9_13_B9_2_6
D6_2_B_B9_5_11_A7_B_8
A7_C_1C_B9_8_19_D6_8_C
D7_2_A_A8_2_10_B9_C_3
D7_8_B_BA_3_D_A8_4_6
A8_5_1A_BA_6_15_D8_2_9
D8_8_9_A8_7_F_BA_9_1D
D9_2_7_BB_1_7_A8_9_3
A8_A_17_BB_4_11_D9_8_8
DA_2_6_A8_C_C_BB_7_1A
je vous previens c'est tordu hein 🤣🤣
 
@sylvanu
fait tourner une simple boucle for en vba sur now tu va voir si ça se répète pas et même avec timer
les 10 tours ne dépasse pas un seul ticks du coup ben ..........
VB:
Sub test()
 For i = 1 To 10
 Debug.Print Now & "-" & Timer
Next
End Sub
resultat
29/10/2025 18:21:11-66071,7
29/10/2025 18:21:11-66071,7
29/10/2025 18:21:11-66071,7
29/10/2025 18:21:11-66071,7
29/10/2025 18:21:11-66071,7
29/10/2025 18:21:11-66071,7
29/10/2025 18:21:11-66071,7
29/10/2025 18:21:11-66071,7
29/10/2025 18:21:11-66071,7
29/10/2025 18:21:11-66071,7
 
Timer effectivement se répète chaque jour, par définition.
Now+Timer ne se répètent jamais. 🙂
Bonsoir Sylvanu 😉 ,
Comme je disais, on n'est sûr de rien puisqu'on ballade la macro sur différentes machines qui peuvent avoir des dates et l'heure identiques à des instants différents.
Personne ne peut assurer que la date et l'heure sur deux bécanes sont différentes à différents moments. Tout comme deux montres.
Il faut donc qu'avec exactement la même date et heure, l'ID résultant soit différent, me semble-t-il ?
 
@sylvanu
fait tourner une simple boucle for en vba sur now tu va voir si ça se répète pas et même avec timer
les 10 tours ne dépasse pas un seul ticks du coup ben ..........
Ce n'est pas bien grave. Une boucle infinie Do...Loop permet d'ôter les doublons de date et heures (mais sur la même bécane - et encore ne faut-il pas, par exemple, revenir à une date passée - or on n'a aucun contrôle sur ce que fait l'utilisateur au niveau des réglages de la date et de l'heure sur sa bécane) :
VB:
Sub test()
Dim T1#, T2#
   For i = 1 To 1000
      Do
         T2 = Timer
         If T2 <> T1 Then Debug.Print Date & "-" & CDbl(Timer): T1 = T2: Exit Do
      Loop
   Next
End Sub
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
0
Affichages
560
Retour