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 :

Pyramide VBA excel


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 Pyramide VBA excel
    Bonsoir,
    Je dois faire un exos à la maison que mon prof m'a donné le souci est que j'ai beaucoup de mal. Voici l'énoncé:
    Question 1 : Écrire une procédure colorierPyramide ayant comme en-tête :
    Sub colorierPyramide(ByVal ligneSommet As Integer, _
    ByVal colSommet As Integer, _
    ByVal n As Integer, _
    ByVal c As Long)
    qui construit une pyramide de hauteur n et de couleur c et dont le sommet a comme coordonnées
    (ligneSommet; colSommet).
    voici ma réponse
    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
    Sub colorierPyramide(ByVal ligneSommet As Integer, _
                         ByVal colSommet As Integer, _
                         ByVal n As Integer, _
                         ByVal C As Long)
     Dim i As Integer
     For i = 1 To n
     colorierPyramide ligneSommet + i, colSommet - i, ligneSommet + 2 * (i - 1), C
     Next i
    End Sub
     
    Sub colorierrectangle(ByVal i1 As Long, ByVal j1 As Long, ByVal i2 As Long, ByVal j2 As Long, ByVal C As Long)
     coloriercase i1, j1, C
     colorierrectangle i1, j1, i2, i2 + L, C
    End Sub
    Sub testcolorierPyramide()
    colorierPyramide 5, 5, 3, rouge
    End Sub
    Sachant que la fonction colorierrectangle et coloriercase sont déjà definis dans notre bibliothèque. Merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    SAlut
    Vu que c'est un cours je vais pas te donner une solution toute faite mais voici des pistes (de plus je n'ai pas excel sous la main).

    Pourquoi avoir utilisé une fonction récursive (procédure qui s'appelle elle même) ? Dans ton cas je pense pas que ce soit une solution pratique. Mais je crois que tu n'as pas bien compris l'utilisation des fonctions et la création de leur contenu. Tu devrais relire tes cours ou lire les tutos qui se trouve sur ce même forum et qui sont très instructifs je pense.

    Pour ma part j'utiliserai la propriété offset (plus d'info -> F1).

    Ainsi en réfléchissant a la structure d'une pyramide on vois que pour chaque ligne supplémentaire on a une colonne de plus a gauche et une de plus a droite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i = 0 to n
      'On selectionne les cellule a colorier  
      range(cells(lignesommet + i,colonnesommet - i);cells(lignesommet + i,colonnesommet + i)).interior.colorindex = C
    Next
    Heuu ben je peux pas tester mais si ça fonctionne, je pense pas que tu ais besoin de grand chose d'autre en faite.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  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
    je ne comprend pas tout !
    Si c'est suite à un cours, pense que le prof est une bonne source d'information, et que reconnaître qu'on n'a pas compris, n'est une faute que pour les imbéciles. Et que tout le monde est susceptible de commettre des erreurs, y compris les enseignants et les super têtes.

    La définition de ton problème reste vague et comme c'est un exo, t'auras pas une solution toute faite, na !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub colorierrectangle(ByVal i1 As Long, ByVal j1 As Long, ByVal i2 As Long, ByVal j2 As Long, ByVal C As Long)
     coloriercase i1, j1, C
     colorierrectangle i1, j1, i2, i2 + L, C
    End Sub
    C'est quoi ? je suppose que c'est une macro qui correspond à la coloration d'une plage rectangulaire Ax:By ?
    Mais elle me gêne : elle s'appelle elle-même, elle fait apparaître une variable "L", non-définie, elle utilise une autre macro...

    Si tu veux travailler sur Excel, il faut être rigoureux et logique.
    Comme je suis feignant, je simplifie l'écriture (L_S=lignesommet)
    tu dois construire une coloration de (L_S) à (L_S+N) ayant une forme de pyramide :
    1re ligne : Cells(L_S, C_S)
    2ème ligne : de cells(L_S+1,C_S-1) à cells(L_S+1,C_S+1)

    donc, tu vas avoir une boucle qui va aller de 0 à N
    et qui va colorier les cellules se trouvant à la ligne L_S+N
    entre les colonnes C_S-N et C_S+N, soit en coloriant directement la plage colonne(C_S-N) ligne(L_S+n) : Colonne(C_S+N) Ligne(L_S+N), soit en coloriant les cellule à travers une deuxième boucle de C_S-N à C_S+N pour chaque ligne L_S+N

    Quand on pose le problème de cette nanière, apparaissent quelques obligations :
    L_S doit être une ligne admissible pas excel : comme je ne connais pas la version, je vais partir sur les limites de la version 2003

    L_S doit êtr positive et au minimum égale à 1
    suivant la définition, c'est une ligne : par principe, elle doit accepter la limite des lignes et peut avoir la valeur de 65536 => elle doit être déclarée en Long et être un entier compris entre 1 et 65536

    N comme c'est le nombre de lignes, on le suppose positif, mais... rien ne dit dans l'énoncé que c'est le cas :une pyramide inversée reste une pyramide
    L_S+N doit donc être comprise entre 1 et 65536 pour ne pas génèrer d'erreur
    Par contre la boucle va de 0 à N. Mais si N est négative il faut changer le pas en décrémentant la valeur jusqu'à atteindre N
    Soit on fait 2 branches de programme, soit on différencie la valeur du pas, au choix, suivant les capacités.

    Le même raisonnement se tient pour les colonnes :
    1<=C_S-N et C_S+N<=256

    C dans ton énoncé est un entier long qui définit soit la couleur(en RVB par exemple) soit l'index de la couleur => dans ton test tu lances la macro avec les paramètres suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    colorierPyramide 5, 5, 3, rouge
    Donc tu colories ta pyramide en couleur rouge. Mais c'est quel nombre rouge ? Pour moi, rouge est du texte et non un nombre, mais je peux me tromper !
    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
    Bonjour,
    Tout d'abord merci à vous.
    En fait j'ai réussi la question 1 et 2 :

    Question 1 : Écrire une procédure colorierPyramide ayant comme en-tête :
    Sub colorierPyramide(ByVal ligneSommet As Integer, _
    ByVal colSommet As Integer, _
    ByVal n As Integer, _
    ByVal c As Long)
    qui construit une pyramide de hauteur n et de couleur c et dont le sommet a comme coordonnées
    (ligneSommet; colSommet).


    Question 2 : Écrire une procédure colorierPyramideBas ayant comme en-tête :
    Sub colorierPyramideBas(ByVal ligneSommet As Integer, _
    ByVal colSommet As Integer, _
    ByVal n As Integer, _
    ByVal c As Long)
    qui construit une pyramide, « tête en bas », de hauteur n et de couleur c et dont le sommet a
    comme coordonnées (ligneSommet; colSommet).
    Pour la question 3, je ne sais pas coment y prendre:
    Question 3 : Écrire une procédure colorierSablier ayant comme en-tête :
    Sub colorierSablier(ByVal ligneIntersection As Integer, _
    ByVal colIntersection As Integer, _
    ByVal n As Integer, _
    ByVal c As Long)
    qui construit un sablier, de couleur c, de hauteur 2n􀀀1 et dont le point central a comme coordonnées
    (ligneIntersection; colIntersection).

    Je vous montre les solutions pour la questions 1 et 2
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Sub colorierPyramide(ByVal ligneSommet As Integer, _
                         ByVal colSommet As Integer, _
                         ByVal n As Integer, _
                         ByVal c As Long)
     
        Dim i As Integer
        Dim L As Integer
        L = 1
        For i = 0 To n
        colorierSegment ligneSommet + i, colSommet - i, L + 2 * i, c
        Next i
     
    End Sub
    Sub colorierSegment(ByVal ligne As Integer, _
                         ByVal col As Integer, _
                         ByVal L As Integer, _
                         ByVal c As Long)
            colorierRectangle ligne, col, ligne, col + (L - 1), c
    End Sub
     
    Sub colorierPyramideBas(ByVal ligneSommet As Integer, _
                            ByVal colSommet As Integer, _
                            ByVal n As Integer, _
                            ByVal c As Long)
     Dim i As Integer
        Dim L As Integer
        L = 1
        For i = 0 To n
        colorierSegment ligneSommet - i, colSommet - i, L + (2 * i), c
        Next i
    End Sub
    Pourriez-vous me donner des astuces s'il vous plaît pour la question 3.

  5. #5
    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
    quand je fais une macro de ce type, j'évite les appels à d'autres macros, mais bon...

    Question 3 : Écrire une procédure colorierSablier ayant comme en-tête :
    Sub colorierSablier(ByVal ligneIntersection As Integer, _
    ByVal colIntersection As Integer, _
    ByVal n As Integer, _
    ByVal c As Long)
    qui construit un sablier, de couleur c, de hauteur 2n��1 et dont le point central a comme coordonnées
    (ligneIntersection; colIntersection).

    il semble que je sois pas le seul feignant
    un peut de réflexion ne nuit pas : le sablier n'est rien d'autre qu'une pyramide inversée associée à une pyramide normale.
    donc,tu vas faire une boucle qui va aller de -N à +N
    A+

Discussions similaires

  1. [VBA-Excel,VB6,Fichier texte]enregistrer un classeur excel..
    Par Tarul dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/01/2005, 13h09
  2. [vba-excel] Le temps de fermeture trop court ?
    Par Damsou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/01/2005, 10h03
  3. [VBA-Excel]
    Par Damsou dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/01/2005, 10h17
  4. [VBA EXCEL] Réduire/Agrandir UserForms
    Par Fench dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/11/2003, 16h02
  5. [VBA Excel] Effacer rapidement une feuille
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2002, 13h12

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