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 :

Modification d'une fonction pour selectionner une plage de cellule


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 42
    Points : 18
    Points
    18
    Par défaut Modification d'une fonction pour selectionner une plage de cellule
    Bonjour à tous,

    j'ai la fonction suivante "progression" qui me permet de m'alerter lorsque j'ai sept points croissants consécutifs. Lorsque l'on insère cette fonction, il faut selectionner manuellement une plage de cellule.
    Je voulais savoir comment modifier ce code afin que ceci ne se fasse plus manuellement mais en fonction d'une cellule.
    Je m'explique, j'ai une macro qui m'extrait des valeurs et ma fonction progression
    étudie les 7 dernières valeurs extraites.
    Je voudrais modifier le code de la fonction afin qu'elle sélectionne automatiquement les 7 dernières lignes. Mais je ne sais pas comment faire!

    PS: Dans mon classeur excel, j'ai une cellule qui a pour valeur le numéro de la dernière ligne extraite, je pensais donc l'utiliser pour sélectionner la plage de cellule.

    Merci d'avance

    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
    Function Progression(ParamArray x() As Variant) As Boolean
    Dim maxi As Variant
    Dim boucle As Variant
    Dim compose As Variant
    Dim Réponse_1 As Variant
    Dim Réponse_2 As Variant
     
    maxi = -10 ^ 308
    For Each boucle In x
        If VarType(boucle) > 8192 Then
            For Each compose In boucle
                If maxi >= compose Then
                    GoTo fin
                Else
                    maxi = compose
                End If
            Next compose
        Else
            If maxi >= boucle Then
                GoTo fin
              Else
                maxi = boucle
            End If
        End If
    Next boucle
    Beep
    Beep
    Beep
    Progression = True
    'Réponse_1 = MsgBox("Attention, il y a sept points consécutifs croissants. Vérifier qu'il n'y ait pas de dérive du Process")
     
    Exit Function
    fin:
    Progression = False
    End Function

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Quelques questions qui me viennent
    - Où apparaît ta plage de cellules dans ta fonction ?
    - Que représente le tableau x() ?
    - Où se trouve ta sélection de cellules ?
    - Quand connais-tu la plage à analyser ? A quel moment ? Une fois renseignée ?
    - Comment connais-tu la dernière ligne ? Où apparaît-elle dans ton code ?

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    La plage de cellule est à selectionner manuellement lorsque tu lances la fonction.
    C'est ParamArray qui définit ma plage de cellule et c'est Vartype qui en fait un tableau de valeurs.

    C'est tout du moins ce que je crois car cette fonction n'est pas de moi.

    Et dernière chose la dernière ligne ne fait pas partie de mon code ( pas encore)
    Le numéro de cette dernière ligne est notifié sur une feuille de mon classeur et je cherche à l'utiliser afin de rendre cette fonction un peu plus automatique.

    J'espere que c'est un peu plus clair pour toi.

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Je voudrai juste qu'à chaque fois que j'insère une ligne, cette fonction selectionne automatiquement cette ligne ci.

    Peut etre que ça serait plus simple de faire un Sub et non une fonction mais je ne sais pas comment faire.

  5. #5
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 314
    Points
    314
    Par défaut
    Je modifie ta fonction en live donc à tester et à modifier selon ton désir !

    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
    Function Progression(ParamArray x() As Variant) As Range
    Dim maxi As Variant
    Dim boucle As Variant
    Dim compose As Variant
    Dim Réponse_1 As Variant
    Dim Réponse_2 As Variant
    Dim Selec as Range
    Dim SelectionVide as Boolean 
     
    maxi = -10 ^ 308
    SelectionVide = True
    For Each boucle In x
        If VarType(boucle) > 8192 Then
            For Each compose In boucle
                If maxi >= compose Then
                    GoTo fin
                Else
                    maxi = compose
                    If SelectionVide then
                        Selec = "La ligne ou est la valeur"
                    Else
                        Selec = Union(Selec,"La ligne ou est la valeur")
                        SelectionVide = False
                    Endif
                End If
            Next compose
        Else
            If maxi >= boucle Then
                GoTo fin
            Else
                maxi = boucle
                If SelectionVide then
                    Selec = "La ligne ou est la valeur"
                Else
                    Selec = Union(Selec,"La ligne ou est la valeur")
                    SelectionVide = False
                Endif
            End If
         End If
    Next boucle
    Beep
    Beep
    Beep
    Progression = Selec
    'Réponse_1 = MsgBox("Attention, il y a sept points consécutifs croissants. Vérifier qu'il n'y ait pas de dérive du Process")
     
    Exit Function
    fin:
    Progression = Empty
    End Function
    Je suis pas trop sur de ce que ca donnera mais je te donne une idée.
    Normalement, s'il y a une valeur supérieur, il créé ou incrémente la sélection, puis te renvoie la sélection ainsi crée.

    Tiens nous au courant si ca marche et sinon ce qui ne va pas

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Tout d'abord merci de ton aide.

    J'ai essayé ta modification mais ça me dit "Erreur de compilation, incompatibilité de type".

    Dès que je selectionne mes valeurs, ça stoppe en m'affichant ce que j'ai ecrit au dessus et en me surlignant "La ligne ou est la valeur"
    Si tu veux essayer la fonction, il te suffit juste d'avoir quelques valeurs sur une feuille excel et de la tester.

    Par contre j'ai pas très bien compris ta modification, à quoi correspond ton
    selectionVide= True/False?

  7. #7
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 314
    Points
    314
    Par défaut
    Dès que je selectionne mes valeurs, ça stoppe en m'affichant ce que j'ai ecrit au dessus et en me surlignant "La ligne ou est la valeur"
    "La ligne ou est la valeur", il faut que tu change par ce que tu voudrais rajouter comme sélection (par exemple Rows(4), ou encore Range("B5:D9"), etc..) comme il semblerait que tu veuille faire une selection des 7 derniere lignes si elles ont toute une valeur croissante ....

    Par contre j'ai pas très bien compris ta modification, à quoi correspond ton
    selectionVide= True/False?
    encore une fois c'est du "one shot code", donc mon selectionVide en Bouléen me sert a dire,
    si je n'ai pas de selection pour le moment -> alors j'en cré une avec la ligne qu'il faut
    sinon -> je rajoute la ligne qu'il faut à ma séléction.

    mais je pense que tu peux remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                    If SelectionVide then
                        Selec = "La ligne ou est la valeur"
                    Else
                        Selec = Union(Selec,"La ligne ou est la valeur")
                        SelectionVide = False
                    Endif
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selec = Union(Selec,La_Ligne)

  8. #8
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Dans la FAQ et dans les Contributions.

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    il semblerait que tu veuille faire une selection des 7 derniere lignes si elles ont toute une valeur croissante
    En fait, il ne s'agit pas de selectionner les 7 dernières lignes si elles ont un ordre croissant mais de les selctionner quoi qu'il arrive et ensuite de m'afficher si oui ou non elles sont croissantes.

    Le pbl avec ce que tu me proposes (que je n'arrive pas à faire fonctionner mais cela doit venir de mes débuts laborieux en VB) et qu'ayant plusieurs colonnes de données à analyser, il faudrait que j'ai un code différent pour chaque colonne.

    Ce que j'avais penser à faire (et essayer sans résultat) était de chercher automatiquement la dernière cellule non vide et de faire ensuite un offset de -7 pour récuperer ces 7 dernières cellules.

    Mon plus gros probleme est que je n'arrive pas à avoir un code cohérent et surtout je sèche devant l'utilisation de la fonction ParamArray.


    Merci encore de ton aide

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    En fait, j'ai changé complètement ma façon de voir les choses et j'ai réalisé ce code qui marche pour ceux que ça peut intéresser.

    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
    Sub osef()
       'l=19 correspond à ma première ligne de valeurs
       'col = 6 correspond à ma première colonne de valeurs
        l = 19
        col = 6
        Feuil4.Activate
        Range("A1").Activate
        'TQ on n'est aps sur une colonne vide
        Do While Not ActiveCell.Offset(l, col) = ""
            'on prend la derniere ligne
             lastrow = ActiveCell.Offset(l, col).End(xlDown).Row
             'on prend la ligne à partir de laquelle on va tester
             i = lastrow - 7
             ok = True
             'on parcourt nos 7 valeurs
             Do While i <> lastrow - 1 And ok = True
                 If ActiveCell.Offset(i, col) >= ActiveCell.Offset(i + 1, col) Then
                     ok = False
                     ActiveCell.Offset(lastrow + 1, col) = "FAUX"
                 End If
                 i = i + 1
             Loop
             If i = lastrow - 1 And ok = True Then
                 ActiveCell.Offset(lastrow + 1, col) = "VRAI"
             End If
             col = col + 1
     
        Loop
     
    End Sub
    Merci à tous

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/11/2010, 18h22
  2. Existe t il une fonction pour effacer une page
    Par teen6517 dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2007, 14h20
  3. Réponses: 12
    Dernier message: 25/07/2006, 18h36
  4. Réponses: 8
    Dernier message: 02/12/2005, 18h07
  5. Utiliser une touche pour appeller une fonction
    Par Hide dans le forum Langage
    Réponses: 2
    Dernier message: 13/10/2005, 16h59

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