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 :

Difficultés pour la création d'une macro sur deux colonnes de nombres [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 28
    Points : 24
    Points
    24
    Par défaut Difficultés pour la création d'une macro sur deux colonnes de nombres
    Bonjour à tous

    Voilà, je dois donc créer un programme sous excel qui me semble assez complexe à réaliser, j'ai en effet assez peu de notions de programmation. Je vais vous exposer le problème

    Mon fichier de base se compose de deux colonnes de nombres positifs(placés par exemple dans les colonnes A et B). Les nombres sont classés par ordre croissant dans la colonne A, et à chaque nombre est associé un nombre supérieur dans la colonne B.

    Je dois en fait comparer chacun des Ai avec les (B1,...,Bi-1). Des qu'on a un Ai tel que Ai > max(B1,...,Bi-1), on considère que les cellules allant de A1 à Bi forment un "groupe". Une fois que l'on a identifié un groupe, on recommence l'opération à partir de Ai+1.

    Exemple :

    Colonne A Colonne B
    1 10
    2 9
    3 7
    11 13
    12 13


    Ici on voit que les couples (A,B) des trois premières lignes forment un groupe, car 2 < 10, 3 < max(10,9)=10, mais 11 > max(10, 9, 7). Vu que les trois premières lignes forment un groupe, on n'en tient plus compte, et on recommence l'opération à partir de la quatrième ligne. On voit d'ailleurs que les deux dernières lignes forment également un groupe (je sais pas si c'est clair^^)

    Mon programme doit donc, pour deux colonnes A et B données, renvoyer le nombre de groupes, et pour chacun de ces groupes, le nombre de couples (A,B) le composant, ainsi que la valeur max(Bi)-min(Ai).

    Voila, je me doute bien que cela se fait grace à une quelconque boucle, mais je ne sais vraiment pas comment mener mon affaire. Si quelqu'un pouvait me donner une idée, une piste à suivre, ou autre, je lui serai vraiment très reconnaissant.

    Merci d'avance

  2. #2
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Est ce que ce code répond à ton problème :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Option Explicit
     
    Sub titi()
        Dim plage As Range
        Set plage = Range(Range("A1"), Range("A1").End(xlDown))
     
        Dim cellule As Range
        Dim max As Integer
        Let max = 0
        Dim nbGroupes As Integer
        Let nbGroupes = 0
        Dim plageA As Range
        Dim plageB As Range
        Dim binaire As Boolean
        binaire = True
        For Each cellule In plage
    '        On Error Resume Next
            cellule.Select
            If binaire = True Then
                Set plageA = cellule
                binaire = False
            Else
                Set plageA = Range(plageA, cellule)
                Set plageB = Range(plageA.Item(1).Offset(0, 1), cellule.Offset(-1, 1))
            End If
            If Not (plageB Is Nothing) Then
                If cellule.Value > maximum(plageB) Then
                    nbGroupes = nbGroupes + 1
                    binaire = True
                    Debug.Print "Le Groupe " + CStr(nbGroupes) + " correspond à la plage des Ai : " + plageA.Address + ", à la plage des Bi :" + plageB.Address
                    Debug.Print "Max(Bi)-min(Ai) = " + CStr(maximum(plageB) - minimum(plageA))
                End If
            End If
        Next cellule
    End Sub
    Function maximum(ByVal plage As Range) As Integer
        Dim cellule As Range
        maximum = 0
        For Each cellule In plage
            If cellule.Value > maximum Then
                maximum = cellule.Value
            End If
        Next cellule
    End Function
    Function minimum(ByVal plage As Range) As Integer
        Dim cellule As Range
        minimum = 32767
        For Each cellule In plage
            If cellule.Value < minimum Then
                minimum = cellule.Value
            End If
        Next cellule
    End Function
    En mettant tes données en A1:B5, j'obtiens dans la fenêtre exécution :

    Le Groupe 1 correspond à la plage des Ai : $A$1:$A$4, à la plage des Bi :$B$1:$B$3
    Max(Bi)-min(Ai) = 9
    Le Groupe 2 correspond à la plage des Ai : $A$5, à la plage des Bi :$B$1:$B$3
    Max(Bi)-min(Ai) = -2


    Du coup, ça a l'air de répondre à ta problématique, bien que je ne voie pas trop à quoi cela peut bien servir...mais c'est une autre question.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Bonjour Anova,

    Tout d'abord merci de ta reponse et de te reactivité (je pose une question le soir, et le lendemain matin j'ai ma reponse ^^)

    Ton programme est tres clair, je pense l avoir plutot bien compris. Neanmoins, quand je lance celui ci rien ne s'affiche sur mon ecran. Je pense que la partie chargée de renvoyer un resultat est celle située à la 28eme et 29eme ligne (la fonction debug.print). Donc voila, sais tu si c'est a cause du fait que je n'ai pas activé tel module ou telle fonction ? En tout cas merci beaucoup pour ton programme

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Points : 127
    Points
    127
    Par défaut
    La procédure Debug.Print écrit dans la fenêtre d'exécution que tu peux activer via Ctrl + G ou Affichage/Fenêtre d'exécution dans l'éditeur VBA

    Sinon, tu peux faire un MsgBox à la place du Debug.Print ou encore écrire les résultats dans des cellules de ta feuille...tout dépend de ce que tu veux faire.

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par mr_hodor Voir le message
    Voilà, je dois donc créer un programme sous excel
    Dans quel contexte se situe cette réalisation ? C'est un devoir qu'ont t'a donné à faire ?
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Menhir : oui, c'est pour un projet

    Anova, je te remercie pour tes precisions concernant l'affichage des reponses.

    Neanmoins, le programme me renvoie des valeurs incorrectes pour l'exemple que j'ai donné. Pour le groupe 1, les plages devraient etre A1A3 et B1B3(selon les explications que j ai donné dans mon premier post, mais le programme me renvoie les plages A1A4 et B1B3. Même chose pour le second groupe, alors que les plages devraient etre A4A5 et B4B5 et max(Bi)-min(Ai) = 2 (13-11, en somme), le programme renvoie les plages A5 et B1B3, ainsi qu'une valeur max(Bi)-min(Ai) de -2.

    Je ne saurai pas trop dire d'où vient l'erreur dans le programme. Une idee ? ^^
    En tour cas merci beaucoup, cela m'aide déjà enormement :-)

  7. #7
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Je ne pense pas que faire tes devoir à ta place soit un service positif à te rendre.
    Il serait préférable pour toi que tu améliore tes "notions de programmation".

    Je ne saurai pas trop dire d'où vient l'erreur dans le programme.
    As-tu au moins pris la peine de chercher ?
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Oui, quand même ^^

    Je pense que c'est à la 22ème ligne, Set PlageB = (Range,etc..)
    A vrai dire, je vois pas vraiment à quoi cela correspond concretement, donc je pense que le problème vient de la, les autres lignes ont l'air de marcher :s
    Ou bien ya autre chose qui m'echappe ^^

    Donc, en ce qui concerne la plageA, je pense avoir trouvé, il faut en fait remplacer "cellule" par "cellule.offset(1,0)"(ligne 25) pour eviter qu'une cellule n'appartenant pas a un groupe se retrouve comptabilisée comme telle.
    Par contre je ne sais toujours pas pourquoi cela ne marche pas avec la plageB, en effet, elle reste toujours fixe(et ceci meme si je la defini comme etant egale a plageA.offset(0,1) ), ce qui par consequent fausse les calculs.

    Savez vous pour quelles raisons cette plage reste fixe ?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Bon,,j'ai trouvé en fin de compte ^^
    Merci beaucoup Anova !

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

Discussions similaires

  1. [AC-2007] Aide pour la création d'une macro
    Par Jiben59 dans le forum VBA Access
    Réponses: 21
    Dernier message: 25/01/2015, 15h02
  2. [XL-2007] Appliquer une macro sur certaines colonnes
    Par Junior75002 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/11/2012, 11h57
  3. [XL-2007] Aplliquer une macro sur deux feuil d'un classeur
    Par anasleco dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/02/2010, 19h25
  4. [XL-2002] Difficultés pour le fonctionnement d'une macro
    Par chti'me dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 16/09/2009, 14h09
  5. Création d'une macro sur bouton
    Par guenfood dans le forum IHM
    Réponses: 1
    Dernier message: 13/12/2007, 17h06

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