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 multiplication qui disfonctionne


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Nicolas JACQUIN
    Homme Profil pro
    .
    Inscrit en
    Avril 2014
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : .
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2014
    Messages : 556
    Par défaut Fonction multiplication qui disfonctionne
    Bonjour les amis,

    Dans la but de m'entrainer dans la création de fonction et que cela serve à mes enfants, j'ai créé une fonction multiplication qui marche bien sur 1 seul chiffre,
    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
    Public Function table_multiplication2(nbre As Long)
    Dim col As Integer, ligdeb As Integer, nb_par_col As Integer, lig As Integer, x As Integer
    ligdeb = 4: col = 2: nb_par_col = 37: lig = ligdeb
      For x = 1 To 100
        If lig = nb_par_col Then lig = ligdeb: col = col + 6
            If x Like "*1" Then lig = lig + 1
                Cells(lig, col).Value = nbre
                Cells(lig, col + 1).Value = "x"
                Cells(lig, col + 2).Value = x
                Cells(lig, col + 3).Value = "="
                Cells(lig, col + 4).Value = nbre * x
        lig = lig + 1
      Next
    End Function
    Sub test2()
    table_multiplication2 Range("F2").Value
    End Sub
    donc j'ai voulu en faire une autre pour toutes les tables mais la ça coince un peu, ça continu après 10 et va pas dans le sens que je veux

    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
    Public Function table_multiplication1(nbre As Long)
    Dim col As Integer, ligdeb As Integer, nb_par_col As Integer, lig As Integer, x As Integer
    ligdeb = 4: col = 2: nb_par_col = 37: lig = ligdeb
      For x = 1 To 100
        If lig = nb_par_col Then lig = ligdeb: col = col + 6
            If x = "11" Then lig = lig + 1: x = 1: nbre = nbre + 1:
                Cells(lig, col).Value = nbre
                Cells(lig, col + 1).Value = "x"
                Cells(lig, col + 2).Value = x
                Cells(lig, col + 3).Value = "="
                Cells(lig, col + 4).Value = nbre * x
        lig = lig + 1
      Next
    End Function
    Sub test1()
    table_multiplication1 Range("F2").Value 'mettre 1
    End Sub
    j'ai essayé avec 1 to 10 mais ça me fait que la table de 1,
    et si je fait 1 to 11 ou plus, cela continu indéfiniment avec dépassement de capacité sans suivre le sens voulu

    cela doit être tout bête mais je coince

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Tu n'expliques pas ce que tu veux obtenir...

    Ce qui me gêne dans ta fonction ce sont tes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Cells(lig, col).Value = nbre
                Cells(lig, col + 1).Value = "x"
                Cells(lig, col + 2).Value = x
                Cells(lig, col + 3).Value = "="
                Cells(lig, col + 4).Value = nbre * x
    Une fonction retourne une valeur et ne peut en aucun cas aller modifier autre chose, il faut faire un Sub pour ça.
    Que tu dises que ça fonctionne est étonnant.
    eric

  3. #3
    Membre émérite Avatar de Nicolas JACQUIN
    Homme Profil pro
    .
    Inscrit en
    Avril 2014
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : .
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2014
    Messages : 556
    Par défaut
    Bonjour,
    Avec la première fonction ça me donne ça:
    Nom : Capture.PNG
Affichages : 369
Taille : 73,3 Ko
    Et avec la 2eme que je viens de remodifier ça donne ça: erreur défini par l'application ou par l'objet (1004)
    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
    Public Function table_multiplication1(nbre As Long)
    Dim col As Integer, ligdeb As Integer, nb_par_col As Integer, lig As Integer, x As Integer
    ligdeb = 4: col = 2: nb_par_col = 37: lig = ligdeb
      For x = 1 To 100
        If lig = nb_par_col Then lig = ligdeb: col = col + 6
            If x Like "*1" Then lig = lig + 1: nbre = nbre + 1: x = 1
                Cells(lig, col).Value = nbre
                Cells(lig, col + 1).Value = "x"
                Cells(lig, col + 2).Value = x
                Cells(lig, col + 3).Value = "="
                Cells(lig, col + 4).Value = nbre * x
        lig = lig + 1
     
      Next
    End Function
    Nom : Capture.PNG
Affichages : 288
Taille : 84,6 Ko

    J'aimerai juste simplement avoir les tables de 1 à 10, mais j'y arrive pas

  4. #4
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 572
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 572
    Par défaut
    Bonjour

    Pour les 10 tables je ferais

    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
    Public Sub table_multiplication()
    Dim col As Integer, ligdeb As Integer, nb_par_col As Byte, lig As Byte, Multiplicateur As Byte, Table As Byte
    col = 2: ligdeb = 4: nb_par_col = 3
      lig = ligdeb
      For Table = 1 To 10
        For Multiplicateur = 1 To 10
                Cells(lig, col).Value = Table
                Cells(lig, col + 1).Value = "x"
                Cells(lig, col + 2).Value = Multiplicateur
                Cells(lig, col + 3).Value = "="
                Cells(lig, col + 4).Value = Table * Multiplicateur
                lig = lig + 1
            Next Multiplicateur
            lig = lig + 1
            If Table Mod nb_par_col = 0 Then col = col + 6: lig = ligdeb
        Next Table
    End Sub
    Il y a une double boucle :
    • une pour gérer les tables de 1 à 10
    • une pour gérer les multiplicateurs de 1 à 10 également


    Ici, comme le dit eriiic, c'est une Sub pas une Function car tu écris dans des cellules, tu ne renvoies pas de valeur à la procédure appelante.
    Si tu ne passes pas d'arguments, par exemple, table de début, table de fin, cellule de début..., c'est une simple Sub mais tu peux prévoir une Sub à laquelle on passe des arguments depuis une autre Sub.

    J'ai modifié tes noms de variable pour faciliter la compréhension et leur type (Byte suffit dans la plupart des cas ici)

    Edit : petite correction sur le nom...

    Edit 2 : remarque sur ton tableau : la règle est de ne JAMAIS centrer des nombres : les unités doivent être sous les unités; les dizaines sous les dizaines, les centaines... Utilise le format comptabilité (le bouton avec 000) sans décimales pour les colonnes de nombres. L'objectif étant pédagogique, il est mieux de respecter les règles ;-)

  5. #5
    Membre émérite Avatar de Nicolas JACQUIN
    Homme Profil pro
    .
    Inscrit en
    Avril 2014
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : .
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2014
    Messages : 556
    Par défaut
    Merci beaucoup c'est au top
    je me doutais un peu de la double boucle mais j'y arrivais pas
    et pour la première que j'ai faite c'est pas bon non plus ?
    merci beaucoup toutefois

  6. #6
    Membre émérite Avatar de Nicolas JACQUIN
    Homme Profil pro
    .
    Inscrit en
    Avril 2014
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : .
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2014
    Messages : 556
    Par défaut
    Edit 2 : remarque sur ton tableau : la règle est de ne JAMAIS centrer des nombres : les unités doivent être sous les unités; les dizaines sous les dizaines, les centaines... Utilise le format comptabilité (le bouton avec 000) sans décimales pour les colonnes de nombres. L'objectif étant pédagogique, il est mieux de respecter les règles ;-)
    je vous comprend pas trop

  7. #7
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 572
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 572
    Par défaut
    Bonjour

    Citation Envoyé par Nicolas JACQUIN Voir le message
    je vous comprend pas trop
    Quand on apprend l'addition en école primaire, on apprend dès l'addition de nombres à deux chiffres, à bien aligner verticalement les unités sous les unités, les dizaines... etc

    Cette règle s'applique à tous les nombres qu'on aligne dans un tableau Excel, ne serait-ce que pour différencier instantanément visuellement les grandes valeurs des plus petites.

    Dans Excel, les formats spécifiques pour les nombres, comme le format nommé Comptabilité qu'on obtient avec le bouton 000 ou le bouton avec un billet et des pièces (dans le groupe Nombre du ruban Accueil), empêchent d'ailleurs l'alignement centré.

    Pour répondre à ta question, le code de ta 1ère fonction marche mais n'est pas le plus logique.
    Tu peux partir sur une procédure générique avec des paramètres pour couvrir 1 à n table avec un multiplicateur de 1 à N et une limite par colonne par 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
    Public Sub table_multiplication(Table_Debut As Byte, Table_Fin As Byte, Multiplicateur_maxi As Byte, nb_tables_par_col As Byte)
    Dim col As Integer, ligdeb As Integer, lig As Integer, Multiplicateur As Integer, Table As Integer
    col = 2: ligdeb = 4
      lig = ligdeb
      For Table = Table_Debut To Table_Fin
        For Multiplicateur = 1 To Multiplicateur_maxi
                Cells(lig, col).Value = Table
                Cells(lig, col + 1).Value = "x"
                Cells(lig, col + 2).Value = Multiplicateur
                Cells(lig, col + 3).Value = "="
                Cells(lig, col + 4).Value = Table * Multiplicateur
                lig = lig + 1
            Next Multiplicateur
            If Table Mod nb_tables_par_col = 0 Then col = col + 6: lig = ligdeb Else lig = lig + 1
        Next Table
    End Sub

  8. #8
    Membre émérite Avatar de Nicolas JACQUIN
    Homme Profil pro
    .
    Inscrit en
    Avril 2014
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : .
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2014
    Messages : 556
    Par défaut
    ok merci beaucoup pour vos explication je vais corriger, merci encore

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/11/2010, 17h27
  2. [MFC] fonction ReadFile qui bloque
    Par r0d dans le forum MFC
    Réponses: 9
    Dernier message: 15/04/2005, 13h21
  3. fonction javascript qui rassemble une date
    Par Dizystorm dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/12/2004, 10h03
  4. Fonction utilisateur qui renvoie la date du jour
    Par falcon dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 13/12/2004, 11h03
  5. fonction postgresql qui delete un enr
    Par access dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/11/2003, 14h44

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