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 :

Macro Vérification puis changement de valeur


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Par défaut Macro Vérification puis changement de valeur
    Bonjour,

    J'ai créé il y a quelques temps de cela une macro qui parcoure un tableau excel, vérifie si une cellule contient un "2" et modifie son contenu en fonction. (si 4 cellules a la suite ont un "2" les valeurs sont prise aux cellules i-4).

    Malheureusement la sortie de ma boucle n'est pas génial (l'argument étant la couleur de ma case que je modifie...) et cela apporte des problèmes. Je voudrais donc savoir si quelqu'un pouvait m'indiquer comment améliorer cette macro, pour :

    1/ Eviter de reparcourir le tableau depuis le début a chaque fois

    2/ Trouver une autre condition de sortie de boucle.


    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
    Sub verification()
    Application.ScreenUpdating = False
    ligne = Range("e65536").End(xlUp).Row
    Dim X As Integer
    Cells.Font.ColorIndex = 1
    start:
    X = 0
    Cells.Font.ColorIndex = 1
    For i = 2 To ligne
        If Cells(i, 5).Value = "2" Then
        X = X + 1
        End If
        If Cells(i - 1, 5).Value = "2" And Cells(i, 5).Value <> "2" Then
        GoTo copie
        End If
        If Cells(i, 5).Value = "" Then
        GoTo fin
        End If
    Next i
     
     
    copie:
    For f = 2 To ligne
        If Cells(f, 5).Value = "2" And f > X Then
        Cells(f, 5).Value = Cells(f - X, 5).Value
        Cells(f, 5).Font.ColorIndex = 4
        Cells(f, 9).Value = Cells(f - X, 9).Value
        Cells(f, 9).Font.ColorIndex = 4
        Cells(f, 10).Value = Cells(f - X, 10).Value
        Cells(f, 10).Font.ColorIndex = 4
        End If
        If Cells(f + 1, 5).Value <> "2" And Cells(f, 5).Font.ColorIndex <> 1 Then
        GoTo start
        End If
        If Cells(f, 5).Value = "" Then
        GoTo fin
        End If
     
    Next f
    fin:
    End Sub
    J'espère être clair (mais ce n'est pas évident à expliquer, si vous avez besoin de précision, ou même d'un exemple, je peux vous préparer ça!)

    Merci d'avance!

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Je ne comprend pas pourquoi tu appels la boucle copie (qui repart depuis le début). tu devrais gérer les modifs directement dans le if (ligne 14)

    A noter que pour sortir d'une boucle for il est plus propre d'écrire Exit For à la place de Goto fin

  3. #3
    Membre émérite Avatar de keygen08
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 545
    Par défaut
    Bonjour

    Je veux bien une vingtaine de ligne pour faire les test.
    Sinon je crois que ceci fait cela (a quelque reglage prés).

    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 devellopez()
    Dim cell As Range
    Dim i As Integer
    For Each cell In Range("e2:e" & Range("e65536").End(xlUp).Row)
    Cells(cell.Row, 5).Font.ColorIndex = 35
     
        If Cells(cell.Row - 1, 5) <> 2 Then i = 0
            If Cells(cell.Row, 5) = 2 Then i = i + 1
                If i = 4 Then
                Cells(cell.Row, 5) = Cells(cell.Row - 4, 5)
                End If
     
    Cells(cell.Row, 5).Font.ColorIndex = 0
    Next cell
    End Sub

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Par défaut
    D'abord, Merci pour vos réponses rapides!

    J'ai préparé un exemple avec les explications peut-être plus claires

    1/ Parcourir le fichier jusqu’à arrivé à un "2" , si plusieurs "2" se suivent il faut compter le nombre de deux, et stocker ce résultat (variable X par exemple).
    2/ Remplacer les lignes contenant ces "2" par les valeurs des cellules i - X
    3/ remettre la valeur de X à zéro une fois tous les "2" remplacés et continuer la recherche jusqu'au prochain groupe de "2"...


    Nouvelles de dernière minute : lorsque la dernière valeur avant un "2" est "PORT" il faut que cela re-décale d'un cran supplémentaire (compter le PORT comme un "2" peut-être?).
    Fichiers attachés Fichiers attachés

  5. #5
    Membre émérite Avatar de keygen08
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 545
    Par défaut
    Ce qui est fait dans le code que je t'ai donné
    (A quelque réglage prés). Le plus gros est fait, il suffit d'adapté.

    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
    Sub devellopez()
    Dim cell As Range
    Dim i As Integer
    For Each cell In Range("e2:e" & Range("e65536").End(xlUp).Row)
    Cells(cell.Row, 5).Font.ColorIndex = 3 'cette ligne est pour le fun
     
        If Cells(cell.Row - 1, 5) <> 2 And Cells(cell.Row - 1, 5) <> "PORT" Then i = 0
            If Cells(cell.Row, 5) = 2 Or Cells(cell.Row, 5) = "PORT" Then i = i + 1
                If i = 4 Then
                Cells(cell.Row, 5) = Cells(cell.Row - 4, 5)
                Cells(cell.Row - 1, 5) = Cells(cell.Row - 4, 5)
                Cells(cell.Row - 2, 5) = Cells(cell.Row - 4, 5)
                Cells(cell.Row - 3, 5) = Cells(cell.Row - 4, 5)
                End If
     
    Cells(cell.Row, 5).Font.ColorIndex = 0 'cette ligne est pour le fun
    Next cell
    End Sub
    Donc à peu prés cela

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Par défaut
    Merci, je n'avais pas vu ton message, désolé!

    En fait le problème que j'ai rencontré avec un seul if, c'est que la macro parcours tout la tableau d'un coup et ne s’arrête pas au premier groupe de "2" pour en modifier les valeurs et passer au groupe suivant.

    Je ne sais pas si le problème est le même mais t'as macro rencontre le même problème (lors du défilement pas à pas)


    C'est pour ça que j'étais rapidement passé à une réflexion en deux boucles. Une pour compter les "2" et s'arrêter a la fin d'un groupe, et la deuxième pour parcourir ce groupe et en changer les valeurs. Je ne vois pas d'autre moyen que d'utiliser deux boucles...

Discussions similaires

  1. [XL-2007] Lancer une macro suite à un changement de valeur de cellule
    Par jnauche dans le forum Excel
    Réponses: 1
    Dernier message: 21/03/2014, 17h38
  2. Réponses: 1
    Dernier message: 06/11/2013, 16h41
  3. [XL-2007] Macro événementielle sur changement de valeur dans cellule
    Par lagratteCchouette dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 12/06/2009, 15h53
  4. Charger Macro apres changement de valeur d'une cellule
    Par jackfred dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/07/2007, 14h51
  5. [VBA-E]Lancer une macro sur changement de valeur cellule ?
    Par jeremiegrenoble dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/03/2006, 14h22

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