Bonjour, je souhaiterais créer une fonction qui par exemple si j'ai 12 me sort toutes les multiplications qui peuvent donner 12: c'est à dire: 4x3;3x4;2x6;6x2;12x1;1x12.
Une idée de comment faire ça?je galère!
Bonjour, je souhaiterais créer une fonction qui par exemple si j'ai 12 me sort toutes les multiplications qui peuvent donner 12: c'est à dire: 4x3;3x4;2x6;6x2;12x1;1x12.
Une idée de comment faire ça?je galère!
Bonjour,
des pistes ce n'est pas très méchant quand on la les bon outils
regarde ceci
\ donne la partie entière de la division
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 i=12\5 msgbox i
Il te suffit de voir si 12/a =12\a si c'est le cas alors a est un multiple de 12
Ensuite pour sortir le résultat tu fait une chaine de caratère avec de la concaténation
Tu boucle sur tout les entiers entre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 dim chaine as integer a=3 b=4 chaine=chaine & a & "x" & b & ";" a=2 b=6 chaine=chaine & a & "x" & b & ";" msgbox chaine
1 et tonnombre/2
tu réalise le teste si c'est le cas tu rajoute un morceau a ta chaine de carctère et tu as gagné
Bon il va te faloir faire un test pour t'assurer que tu ne mette pas deux fois le même résultat, le plus simple serais stocker les résultats déjà trouvé dans un tableau et de tester si ce que tu viens de trouver existe déjà.
Une collection avec une gestion d'erreur peut être une solution mais pas la plus facile, reste sur un tableau
J'ai pas envie de faire le travail a ta place, si tu galère sur le test on verra ensemble. Commence ton code et montre le nous (avec les balise code)
ensuite on le corigera s'il le faut
Salut,
Un exemple :
++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Option Explicit Sub TrouveMultiple() Dim ValeurCible As Variant Dim Cpt1 As Long, Cpt2 As Long Feuil1.Cells.Clear ValeurCible = InputBox("Valeur cible") If IsNumeric(ValeurCible) Then Application.ScreenUpdating = False For Cpt1 = 1 To ValeurCible For Cpt2 = 1 To ValeurCible If Cpt1 * Cpt2 = ValeurCible Then Feuil1.Range("A" & Feuil1.Range("A65536").End(xlUp).Row + 1).Value = Cpt1 & " X " & Cpt2 & " = " & ValeurCible End If Next Cpt2 Next Cpt1 Application.ScreenUpdating = True End If End Sub
Minick
EDIT :
Oops désolé Krovax, j'avais pas rafraichit. Je suis moins pedagogue, j'offre la solution...
Pas de problème mais par contre avec ce code tu auras des doublons, et on peut arrêter les compteur a la motié, et lcommencer a 2 en ajoutant 1xValeur dans la chaine de résultat a chaque fois. (si c'est pour un exo ca fera une meilleur note et sinon ca tournera plus rapidement)
Du coup il a quand même un peu de travaille alors je suis content
Sinon il y a des algos vachement classe pour ce genre de truc si j'ai le temps je vais essayer d'en retrouver un
Edit : premier tips, pour éviter les doublons s'arréter au plus petit des multiple trouvé
ici on test 1, 2 3 la on trouve 4 plus besoin de tester 4 et plus
Oui effectivement il y a les doublons mais dans son exemple ils y sont donc j'ai laissé...
++
Minick
Je n'avais pas fait attention a l'exemple tu as bien raison
Mais du coup ce n'est plus rigolo du tout
On peut toujour optimiser, par exemple sortir de la 2de boucle quand on trouve une solution.
Mettre les 2 combinaisons en doublons 4x6 et 6x4 directement et limiter ainsi le nombre de passage...(donc tester quand le maximun de combinaison est atteint)
, sur ce point il y a de quoi s'amuser un peu...
Au travail calvin_sd
++
Minick
salut à vous,
je vous remercie pour vos réponses. C'est pas que je veux rien glander c'est juste que je débute avec VBA donc c'est un peu difficile; puis c'est pas pour les cours!!
Bref j'ai compris ce que tu veux dire; et en effet il me faut les doublons. Je vais l'écrire avec mes variables et je renvoie dès que c'est fini! MErci!
re-moi
En fait Minick y'a un petit problème avec ton code puisqu'il affiche les résultats dans les cases de suite; i.e:
1 X 54 = 54
2 X 27 = 54
3 X 18 = 54
6 X 9 = 54
9 X 6 = 54
18 X 3 = 54
27 X 2 = 54
54 X 1 = 54
1 X 84 = 84
2 X 42 = 84
3 X 28 = 84
4 X 21 = 84
6 X 14 = 84
7 X 12 = 84
12 X 7 = 84
14 X 6 = 84
21 X 4 = 84
28 X 3 = 84
42 X 2 = 84
84 X 1 = 84
1 X 84 = 84
2 X 42 = 84
3 X 28 = 84
4 X 21 = 84
6 X 14 = 84
7 X 12 = 84
12 X 7 = 84
14 X 6 = 84
21 X 4 = 84
28 X 3 = 84
42 X 2 = 84
84 X 1 = 84
Pour cet exemple là j'ai exécuté avec 84 deux fois et il faut qu'il me l'écrive dans la case du début. Et aussi vu que la valeur dont j'ai besoin est dans une case j'utilise pas le InputBox mais Sheets("Feuil1").Range("J12").Value
Pas compris .....
En fait,
si je prends ton exemple dans la colonne A;
j'exécute une première fois avec dans le input box une valeur de 54 par exemple, il m'écrit tous les résultats de A1 à A5 et ensuite si j'exécute encore avec une valeur dans le inputbox de 84, il m'écrit les résultats de A6 à A10 par exemple.
Mais pour mois faudrait que à chaque fois que j'éxécute, il efface la précédente et commence toujours à écrire le résultat dans A1. Parcequ'après je fait appel à ces cases. Tu vois?
Bonjour,
1) x * y et y * x sont la même expression et il ne convient pas de la répéter !
2) voici comment éviter cela simplement :
Une précision : je fais ici exprès de me contenter de chaînes de caractères (juste pour t'obliger à t'exercer un peu) alors que l'emploi de listboxes ou de tableaux permettrait la même chose.
3) comment écraser les cellules d'une plage (les effacer et les reconstruire) est un autre aspect (de surcroît élémentaire) que je me refuse de traiter dans ce sujet qui est présenté comme celui de la recherche des multiplications parvenant au même résultat (un chiffre de base, que celui-ci se trouve dans une cellule ou dans une variable) ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Private Sub Command1_Click() Dim nb As Integer, toto As String, titi As String nb = 54 For i = 1 To nb / 2 If InStr(toto, "#" & i & "#") = 0 Then If nb Mod i = 0 Then titi = titi & vbCrLf & i & "*" & nb / i & vbCrLf toto = toto & "#" & nb / i & "#" End If End If Next MsgBox titi End Sub
Dsl Hucfoutu je comprends rien à ton code! comme je l'ai dit plus haut, je débute avec vba donc un peu de compassion!
Au fait, Minick j'ai trouvé en fait fallait pas que je vire le cells.clear de ma feulle c'est pourquoi ça réécrivait sur les lignes d'après.
MErcI!
Est ce que tu as essayé le code de ucfoute? en mode pas a pas avec des espion? en affichant les variables locals?
Essaye tu verra qu'il est bien sympa.
Et cela te permettra d'apprendre de nouvelle fonction (la touche F1 est ton ami), si tu veux apprendre le VBA il va te faloir faire plus d'effort que "je n'ai pas compris". La compassion été la, tu débutes il te montre de nouvelle fonction et une nouvelle méthode de raisonnement, c'est plus didactique qu'autre chose.
Sinon c'est sur que si tu enlève des lignes des code que tu reçois il tourne moins bien
Mon algo a moi sans doublon
La solution dans une seule chaine de caractère
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Sub test() Dim i As Integer Dim rep As String Dim valeur As Integer, min As Integer Dim solution As String rep = InputBox("Entrer un entier :") If Not IsNumeric(rep) Then Exit Sub valeur = CInt(rep) solution = "1x" & valeur min = valeur For i = 2 To valeur If i >= min Then Exit For If valeur / i = valeur \ i Then solution = solution & ";" & i & "x" & valeur / i min = valeur / i End If Next i MsgBox solution End Sub
Bonjour, calvin,
la compassion s'exprime à l'égard de ceux qui subissent, sont des victimes, etc... et non à l'égard de ceux qui font un choix délibéré.
Tu fais le choix de développer ... Personne ne te l'impose ... C'est ta volonté ...
Cela sous-tend celle (la volonté) de faire comme tous les développeurs : lire (ton aide en ligne), apprendre (y compris ce dont tu n'as pas forcément besoin immédiatement) et t'exercer d'abord (encore et encore) puis créer ensuite.
Bonne étude.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager