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 :

compréhension de mes devoirs


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 62
    Par défaut compréhension de mes devoirs
    Bonjour tout le monde,
    J'ai un souci au niveau de la compréhension d'un exercice. Voici l'énoncé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub mystere(ByVal i As Long)
    Dim j As Long
    Cells(i, 1).Value = 1
    Cells(i, i).Value = 1
    For j = 2 To i - 1
    Cells(i, j).Value = Cells(i - 1, j - 1).Value + Cells(i - 1, j).Value
    Next j
    colorierRectangle i, 1, i, i, jaune
    End Sub
    Pourriez-vous me commenter la fonction s'il vous plaît?
    Quel est le résultat de l’appel mystere 1 ? De l’appel. Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 203
    Par défaut
    Citation Envoyé par bolltt Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub mystere(ByVal i As Long)
    Dim j As Long
    Cells(i, 1).Value = 1
    Cells(i, i).Value = 1
    For j = 2 To i - 1
    Cells(i, j).Value = Cells(i - 1, j - 1).Value + Cells(i - 1, j).Value
    Next j
    colorierRectangle i, 1, i, i, jaune
    End Sub
    La macro Mystère effectue la somme des valeurs de cellules.
    Cells(i,j).Value donne la valeur LiCj (ligne i colonne j).

    Par contre, elle ne doit pas marcher avec la valeur i=1, car Cells ne fonctionne que pour des valeurs>0.
    La macro ne peut marcher que pour i>1.
    Colorier Rectangle doit être une fonction écrite plus loin et qui porte bien son nom...

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut bolltt et le forum
    Pourriez-vous me commenter la fonction s'il vous plaît?
    ce n'est pas une fonction : une fonction retourne un nombre !
    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
    Sub mystere(ByVal i As Long)
    'au lancement de cette macro
    'Reçoit le paramètre i qui est un entier long
    'représentant un numéro de ligne
    Dim j As Long
    'déclaration de variable j en entier long
    Cells(i, 1).Value = 1
    ' cellule clonne A ligne i = 1
    Cells(i, i).Value = 1
    'Cellule Colonne n°i ligne i = 1
    For j = 2 To i - 1
    'pour j=2 jusqu'à la valeur (i-1) nen augmentant de 1 à chaque boucle
        Cells(i, j).Value = Cells(i - 1, j - 1).Value + Cells(i - 1, j).Value
        'cellule colonne n°j, ligne i = cellule colonne n°(J-1), ligne i-1
        'additionné avec cellule colonne j ligne (i-1)
    Next j
    'Passer au j suivant
    colorierRectangle i, 1, i, i, jaune
    'Vraisemblablement colorier la plage A1:col(i)lig(i) en jaune
    End Sub
    Je suppose que cette macro est appelée par une autre macro, soit par "mystere(nombre)" soit par "Call mystere(nombre)", nombre étant le numéro de la ligne. Pour expliquer on admet que cette valeur i=4

    Cells(i, 1).Value = 1 / i=4 => A4=1
    Cells(i, i).Value = 1 / i=4 => D4=1
    For j = 2 To i - 1 / J=2
    Cells(i, j).Value = Cells(i - 1, j - 1).Value + Cells(i - 1, j).Value
    /i=4, j=2 => cells(4,2)=cells(3,1)+cells(3,2) <=>B4=A3+B3
    Next j / retourner à la ligne for
    For j = 2 To i - 1 / J=2+1=3 pas supérieur à i-1=4-1=3, on refait la boucle
    Cells(i, j).Value = Cells(i - 1, j - 1).Value + Cells(i - 1, j).Value
    /i=4, j=3 => cells(4,3)=cells(3,2)+cells(3,3) <=>C4=B3+C3
    Next j / retourner à la ligne for
    For j = 2 To i - 1 / J=3+1=4 supérieur à i-1=4-1=3, on passe à la ligne d'instruction suivant le next j
    Pour 4, on a : A4=1 B4=A3+B3 C4=B3+C3 D4=1
    ça me rappelle vaguement le calcul d'une ligne du triangle de Pascal, donc je suppose que la macro "mère" fait évoluer le nombre représenté par la variable i de 1 à 256 max
    A+

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 62
    Par défaut
    Bonsoir,
    tout d'abord merci à vous deux pour votre intervention, je comprends mieux maintenant ce que fais la procédure. Comme vous dîtes c'est pour le triangle de Pascal. J'ai une autre fonction où j'ai petit souci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function nombreDiviseurs(ByVal n As Long) As Long
    ’ Hypothèse : n > 0
    ’ Renvoie : le nombre de diviseurs de n
    Dim i As Long, res As Long
    res = 0
    For i = 1 To n \ 2
    If n Mod i = 0 Then
    res = res + 1
    End If
    Next i
    nombreDiviseurs = res + 1
    End Function
    Moi je voulais boucler de i = 1 to n or la correction qui m'est porposé va jusqu'à n/2. De plus, j'ai testé la fonction ma version avec i=1 to n pose un problème lorsque je choisis un nombre qui a un seulement deux diviseurs lui-même et 1. Merci

  5. #5
    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
    Par défaut
    Bonjour,

    1) Je ne vois pas ce qui te choque que l'on n'aille pas (mathématiquement logique) au delà de la moitié du nombre !!!!
    2) n/2 n'est pas égal à n\2 (la 2ème expression est l'entier de la division)
    3) il te suffit de ne pas lancer la boucle si n < 2

    genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    nombrediviseurs =0 
    If n > 1 then
      for i = 1 to n\2
      '
      '
      '
      Next
    end if
    nombrediviseurs = nombrediviseurs + 1
    4) il ne convient pas de traiter 2 sujets dans la même discussion.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 62
    Par défaut
    Re,
    je suis désolé de vous dire que j'ai toujours pas compris pourquoi il y a n\2 et non pas n. Merci

  7. #7
    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
    Par défaut
    Citation Envoyé par bolltt Voir le message
    Re,
    je suis désolé de vous dire que j'ai toujours pas compris pourquoi il y a n\2 et non pas n. Merci
    Parce que l'on ne fait jamais d'opérations inutiles

    Mais tout cela est de la logique mathématique et on s'écarte de VB !

    Prends donc un papier et un crayon (et tu devrais en tirer une conclusion ...)

    Edit : tiens ! Trouve-moi un nombre dont la moitié (et en dessous de la moitié) aurait un diviseur que n'aurait pas l'entier !!!!

    De manière plus générale : trouve-moi un nombre qui aurait un diviseur que n'aurait pas un multiple de ce nombre !!! (et le double est un multiple)...

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

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