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 :

Boucle pour controler valeurs de cellules et faire des actions ensuite


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Boucle pour controler valeurs de cellules et faire des actions ensuite
    Bonjour,

    J'ai un tableau dans lequel les cellules de la colonne "F" prennent des valeurs de 0 à 4 (en fonction de saisies sur une autre feuille).
    Je voudrais avoir une macro qui contrôle cette valeur sur toutes les cellules de "F3 à Fx".
    Si la valeur de "F3" est >1, je vais à la cellule "L3" et j'y insére la valeur 0 en décalant les cellules à droite.
    Si la valeur de "F3" est 0 ou 1, je vais à la cellule "L3" et je rajoute 1 à la valeur de celle-ci (par ex. si L3= 55 elle sera mise à 56).
    Et ainsi de suite jusqu'à "Fx"

    J'ai déjà fait pas mal d'essais mais n'y connaissant rien en VBA, je n'arrive pas au résultat souhaité !

    Help SVP

    Merci d'avance.

  2. #2
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    j'ai pas trop saisie l'histoire du décalage et de la mise à zéro
    on met L3 à zero et on pousse à droite ?
    (enfin c'est ce que j'ai fait)

    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
    Sub note_col_L()
    Dim table As Variant
    With Sheets(1)  ' le travail se fait sur la premiere feuille
    table = .Range("f3:f" & .Range("f65535").End(xlUp).Row)
    For t = 3 To UBound(table, 1) + 2
    If table(t - 2, 1) > 1 Then
    .Cells(t, 12).Value = 0
    .Cells(t, 12).Select
    Selection.Insert Shift:=xlToRight
    Else
    .Cells(t, 12).Value = .Cells(t, 12).Value + 1
    End If
    Next
    End With
    End Sub

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse rapide Daranc,

    Pour le décalage, j'insère la valeur 0 après avoir décalé les cellules vers la droite, çàd que si les cellules "L3" et "M3" ont pour valeur respectives par ex. 54 et 18 avant l'exécution de la macro, eles seront de 0 et 54 après l'exécution de la macro si la condition concernant "F3" est vraie.

    J'ai essayé ta macro:
    comme mon tableau d'essai ne comporte que 10 lignes j'ai modifié la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table = .Range("f3:f12" & .Range("f65535").End(xlUp).Row)
    mais la macro ne s'arrête pas à la ligne 12 (F3 à F12), elle se poursuit jusqu'à la fin de la feuille apparemment !!

    Sinon le reste est impeccable je pense qu'on n'est pas loin de la solution totale !

    Cordialement.

    Le Rom

  4. #4
    Membre émérite
    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
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut Le Rom et le forum
    comme mon tableau d'essai ne comporte que 10 lignes j'ai modifié la ligne:

    table = .Range("f3:f12" & .Range("f65535").End(xlUp).Row)

    mais la macro ne s'arrête pas à la ligne 12
    Comme quoi adapter une macro demande de comprendre le code d'origine avant d'y mettre les doigts
    tu as des valeurs jusqu'à F12
    Range("f65535").End(xlUp)
    revient à mettre le curseur sur la dernière ligne de F (65536) et à faire <Ctrl> + flèche de déplacement vers le haut => ce qui amène le curseur sur la dernière ligne non vide en F (ligne 12 dans le cas traité) et la propriété .Row en extrait le numéro de la ligne. Avec
    table = .Range("f3:f12" & .Range("f65535").End(xlUp).Row)
    tu as donc écrit :
    table = .Range("f3:f12" & 12) => F3:F1212 => la macro s'arrêtera donc après avoir traité la ligne 1212

    Une autre proposition :
    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 note_col_L()
    Dim Plage As Range, Cel As Range
    Set Plage = Range([F3], Cells(Rows.Count, "F").End(xlUp))
    'on fixe la zone de travail à F3 à dernière non vide en F
    For Each Cel In Plage
    'pour chaque cellule dans la plage
        If Cel = 0 Or Cel = 1 Then Cel.Offset(0, 6) = Cel.Offset(0, 6) + 1
        'si la cellule est égale à 0 ou 1, j'ajoute 1 à la cellule située 6 colonnes à droite
        If Cel > 1 Then
        'si la cellule est supèrieure à 1 alors
            Cells(Cel.Row, "L").Insert Shift:=xlToRight
            'j'insère une cellule en L même ligne en décalant vers la droite
            Cells(Cel.Row, "L") = 0
            'je mets 0 dans la cellule insérée
        End If 'fin du test
    Next Cel 'cellule suivante
    End Sub
    Comme c'est un code simple, je ne l'ai pas testé.
    Juste des réflexions :

    Je m'oblige à déclarer toutes mes variables

    Je ne déclare en Variant que les variables qui être de plusieurs types : si le type ne correspond pas, ça déclenche une erreur, ce qui est un avantage pour moi, autrement, si la valeur n'est pas ce que la macro attend, l'erreur peut se déclencher des dizaines de lignes de code plus tard, et de manière aléatoire.

    J'indente mes codes : ce n'est pas pour l'esthétique, mais pour savoir où commence et où fini une boucle, un test.

    Je renseigne mes codes avec des commentaires.

    Je comprends un code avant de le modifier : soit en demandant des renseignements sur les forums, soit en testant en pas-à-pas avec des valeurs connues et en vérifiant les variables avec la fenêtre "variables locales" ou avec des espions

    Ça fait perdre du temps, mais je le rattrape sur les dépannages éventuels (ouais, je sais, je ne fais jamais d'erreur ) et sur les modifications quand on n'est plus dans le code. Un code doit rester lisible, même à 3h00 le mardi matin quand tu as fait la fête le W-E.

    Ce ne sont que des réflexions personnelles et pas des critiques.
    A+

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Salut Gorfael,

    Je n'ai qu'un mot à te dire: MERCI

    Je suis complètement d'accord avec toi sur le fait que, lorsque qu'on ne connaît pas, il ne faut pas essayer "d'adapter" à sa sauce un code fait par quelqu'un d'autre !
    En fait je n'avais pas tout compris de la macro de Darang (que je remercie encore de s'être penché sur mon problème) et tes commentaires m'ont éclairé sur son fonctionnement.
    Par exemple, sur ma colonne "F" j'avais d'autres cellules, après la fin de mon tableau, qui contenaient du texte ou d'autres valeurs, et qui étaient donc prises en compte par la macro. J'ai donc épuré tout çà avec tes explications !

    En plus, comme le dit ta signature, je me suis rendu compte qu'il fallait être très précis dans l'énoncé du problème pour avoir une réponse bien adaptée.

    Merci donc, et d'avoir répondu à 5h du matin çà m'épate encore plus ...!

    Le Rom

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/12/2012, 07h07
  2. Boucle pour récuperer valeurs manquantes
    Par mamiche dans le forum SAS Base
    Réponses: 10
    Dernier message: 29/10/2012, 15h58
  3. Réponses: 3
    Dernier message: 24/07/2009, 16h51
  4. boucle pour la valeur min d'un champ
    Par averooès dans le forum VBA Access
    Réponses: 6
    Dernier message: 23/01/2009, 14h41
  5. Réponses: 3
    Dernier message: 24/06/2008, 11h40

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