je débute un nouveau projet sur la base de calcul autour de la radioactivité.
Dans l'exemple ci-joint, vous trouverez un userform dans lequel on doit saisir des données (3 ou 4).
En fonction de l'utilisation, nous n'aurons pas toujours les mêmes données.
D'où ma question : comment obtenir un résultat de calcul dès que l'on a assez de données?
Je sais que ce n'est pas clair, mais c'est pas facile à expliquer, l'exemple sera beaucoup plus parlant.
Cher pierrejean, ne vous cassez pas trop la tête. La boucle
Code:
Dim p As Byte, i As Byte
For i = 1 To 5
If Me.Controls("TextBox" & (i)).Text <> "" Then p = p + 2 ^ (i - 1)
Next
qu'on peut aussi écrire
Code:
Dim p As Byte, i As Byte
For i = 1 To 5
p = p - (Me.Controls("TextBox" & (i)).Text <> "") * 2 ^ (i - 1)
Next
renvoie p avec une valeur entière comprise entre 0 et 31 inclus décrivant l'état de chargement des boîtes de texte TextBox1 à TextBox5. p = 0 : toutes les boîtes sont vides ; p = 1 : la boîte 1 n'est pas vide, toutes les autres boîtes sont vides ; p = 2 : la boîte 2 n'est pas vide, toutes les autres boîtes sont vides ; p = 3 : les boîtes 1 et 2 ne sont pas vides, toutes les autres boîtes sont vides ; p = 4 : la boîte 3 n'est pas vide, toutes les autres boîtes sont vides ; p = 5 : les boîtes 1 et 3 ne sont pas vides, toutes les autres boîtes sont vides ; p = 6 : les boîtes 2 et 3 ne sont pas vides, toutes les autres boîtes sont vides ; p = 7 : les boîtes 1, 2 et 3 ne sont pas vides, les boîtes 4 et 5 sont vides.
... p = 31 : aucune boîte n'est vide.
Le résultat est plus clair si on exprime p en base 2 sur cinq chiffres.
Par exemple : p = 25 base 10 : 11001 base 2 signifie que les boîtes 5, 4 et 1 ne sont pas vides et 3, 2 sont vides.
Cela permet d'appliquer un traitement approprié à chaque situation dans une structure
Code:
Select Case p
End Select
au lieu d'écrire une ribambelle de "Si boîte1 est vide et si boîte 2 et vide etc., etc... alors..." propre à rendre le code illisible.
Un tout grand Merci à ROBERT pour son explication lumineuse : je retiens la methode visant a repertorier un nbre important de cas differents
Je salue par ailleurs l'autre noctambule (dit aussi l'Agrafe ) qui nous gratifie de codes aussi elegants qu'efficaces
Edit: Euh !!! je reviens un peu sur l'efficacité des codes "Agrafés" mais je n'ai malheureusement pas le temps d'aller plus loin
Bsr ou Bonjour à tous ( à cette heure là je ne sais plus trop....)
il va me falloir quelque temps pour décortiquer toutes vos réponses, comme j'ai la nuit devant moi (si pas trop d'activité opérationnelle) çà tombe bien...
Je reviens vers vous après.
En tout cas, une fois de plus merci à tous pour votre investissement.
je reviens déjà après avoir testé vos différentes solutions :
- @ tototiti2008 : #33, la mise en forme du résultat sous cette forme rend la lecture vraiment plus aisée
- @ roger : # 34, çà a l'air d'être une super solution, mais je suis encore très loin de bien comprendre et d'adapter ce genre de code
- @ staple1600 : #35, première chose, je viens d'apprendre que l'on pouvait importer un Userform...., pour autant les résultats n'ont pas l'air d'être cohérent, je vais "retester" après ce post
-@ pierrejean : # 36, l' Userform revu et corrigé fonctionne bien. Lorsque l'on saisi des chiffres avec des virgules, on est tenté par le point du pavé numérique et du coup : Débogage...Faut que je retourne au début du post voir comment on peut contourner çà
-@fo_rum : #37, le résultat proposé sous 2 formes est une très bonne idée, je prends.
Je vais me pencher sur le nombre d'Userform dont j'ai besoin (nombre de formules que l'on peut d'utiliser), avant d'attaquer le fichier définitif pour que çà ne ressemble pas trop à un gros "Patchwork"...
Re,
je vous joins une petite pièce jointe (rien à voir avec le projet définitif), pour vous poser encore quelques questions.
la valeur t s'exprime en secondes. Sur la feuille1 de mon classeur, j'arrive à calculer la différence entre 2 dates et à la convertir en secondes mais en VBA pour l'intégrer à l'userform1??
sur la même feuille j'ai fait un petit tableau pour les conversions de Curie en Becquerel ou l'inverse, De Gray en Rad... mais de là à le mettre en VBA et l'intéger à un Userform??
dernière chose (pour le moment), pour revenir à l'userform qui concerne les puissances de 10 et préfixe, Fo_rum propose un résultat sous 2 formes, je verrai bien une troisieme, exemple 12 000 000 000 ou 12Tera ou 12E+12 (comme sait nous l'annoncer EXCEL dans une cellule de tableur)
Ah j'oubliais : rien d'urgent, profitez de votre dimanche
oui j'étais en train de bosser dessus c'est ce que je viens de voir, j'ai même compris l'explication.
j'ai avancé sur l'userform3 pour la présentation du résultat sous les 2 formes, reste à trouver la 3ème, mais mon code n'est pas des plus beau, pour reprendre une expression, c'est plus un Patchwork.... qu'un code construit...
Je me doutais bien que mon code est aussi efficace que je suis doué pour faire des galettes au sarrasin (pourtant j'en ai tâté du billig )
J'ai déjà évoqué dans plusieurs fils que les maths et moi cela fait quatre ( à mon regret )
Tu peux stp, préciser où sont les grumeaux dans ma pâte VBA soumise plus bas dans le fil ?
@ l'ami Staple
les grumaux n'etaient pas si nombreux:
Il manquait le 1er / dans Const pfs As String = "/Tera/Giga/Mega/Nano/pico" ne serait-ce que pour avoir le même nbre d'items
Ensuite, dans IIf(IsEmpty(TextBox2), 0, CDbl(TextBox2)) , même si TextBox2 est vide Cdbl(TextBox2) est evalué et envoie en Debug
Pour ma part , je n'utilise jamais IIf et meme rarement If .... Then....
je prefere
If
else
end if
Cela allonge certes les macros , mais l'efficacité est rarement liée à la concision (la comprehension non plus)
Par contre il y a bien eu apport (la preuve en est que hypo retient notre version laquelle a demandé un petit ajustement supplementaire voir derniere version)