IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Fonction qui renvoit les multiples d'un nombre!


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Fonction qui renvoit les multiples d'un nombre!
    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!

  2. #2
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    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
    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
    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
    Tu boucle sur tout les entiers entre
    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

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    434
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 434
    Points : 547
    Points
    547
    Par dé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...

  4. #4
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    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

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    434
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 434
    Points : 547
    Points
    547
    Par défaut
    Oui effectivement il y a les doublons mais dans son exemple ils y sont donc j'ai laissé...

    ++
    Minick

  6. #6
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    Je n'avais pas fait attention a l'exemple tu as bien raison

    Mais du coup ce n'est plus rigolo du tout

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    434
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 434
    Points : 547
    Points
    547
    Par défaut
    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

  8. #8
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    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!

  9. #9
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    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

  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    434
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 434
    Points : 547
    Points
    547
    Par défaut
    Pas compris .....

  11. #11
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    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?

  12. #12
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    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.

    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
    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) ...

  13. #13
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    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!

  14. #14
    Membre chevronné Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Points : 2 168
    Points
    2 168
    Par défaut
    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

  15. #15
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par calvin_sd Voir le message
    Dsl Hucfoutu je comprends rien à ton code! comme je l'ai dit plus haut, je débute avec vba donc un peu de compassion!
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction qui renvoit les coefficients d'un polynôme
    Par lisenette dans le forum MATLAB
    Réponses: 7
    Dernier message: 31/03/2014, 13h35
  2. [XL-2003] fonction qui renvoit les coordonnées d'une cellule (As Range)
    Par hallscar dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/12/2011, 08h56
  3. Fonction qui définie les nombres des chiffres
    Par aliassaf dans le forum MATLAB
    Réponses: 3
    Dernier message: 02/04/2009, 01h38
  4. Réponses: 4
    Dernier message: 04/05/2007, 22h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo