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 :

Puis-je optimiser mes if else avec des plages et variables aux noms différents ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 94
    Points : 55
    Points
    55
    Par défaut Puis-je optimiser mes if else avec des plages et variables aux noms différents ?
    Bonjour,

    J'ai conscience que le titre est sans doute mal trouvé, mais j'ai du mal à voir comment rédiger autrement.
    Mon problème est le suivant :*j'ai un ensemble de fichiers (qu'on dira de type A, dans lesquels j'ai à chaque fois 3 cellules toujours nommées :*PtFaibles, PtForts, Date) et j'ai un fichier « tableau de bord » qui compile ces 3 valeurs pour chaque fichier A.

    Quand j'ouvre un fichier de type A, le modifie, j'ai une macro pour faire la mise à jour dans mon tableau de bord si un contenu a changé. En l'état, je ne vois pas d'autre possibilité que de passer par une succession de if du type :
    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
     
    'Si la valeur de ma cellule Date a changé, la modifier et valider le marqueur CtrlDate, sinon, ne rien faire
        If Range("Date").Rows(ColNumAction) = Date Then 'Rows(ColNumAction) correspond à la ligne propre à mon fichier de type A initial 
            CtrlDate = False
        Else
            Range("Date").Rows(ColNumAction) = Date
            CtrlDate = True
        End If
     
    'Si la valeur de ma cellule PtFaibles a changé, la modifier et valider le marqueur CtrlPtFaibles, sinon, ne rien faire
        If Range("PtFaibles").Rows(ColNumAction) = PtFaibles Then 
            CtrlDate = False
        Else
            Range("PtFaibles").Rows(ColNumAction) = PtFaibles
            CtrlDate = True
        End If
     
    'Si la valeur de ma cellule PtForts a changé, etc..
      if ...
    Else...
    End if
    Je me demandais dans quelle mesure il était possible de passer par une boucle pour simplifier, notamment si je suis amené à copier de nouvelles cellules pas encore créées ?
    J'avais pensé copier mes ranges dans un Array et utiliser un for, ce qui me permet effectivement de passer d'un range à l'autre, mais du coup, je suis à nouveau bloqué pour mes valeurs de cellules qui ont aussi un nom différent. Il me faudrait à nouveau passer par un Array.

    Voyez-vous plus simple ?

    J'espère que je ne suis pas trop incompréhensible, d'autant que je n'ai qu'un petit niveau de vrai débutant sur vba et la programmation en général.
    Merci par avance !

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 936
    Points : 28 932
    Points
    28 932
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Alors avant de regarder plus loin, si une cellule ou une variable doit contenir une valeur booléenne, il n'y a aucune raison de faire une comparaison avec IF
    Ainsi ces lignes de codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If Range("Date").Rows(ColNumAction) = Date Then 'Rows(ColNumAction) correspond à la ligne propre à mon fichier de type A initial 
            CtrlDate = False
        Else
            ' Range("Date").Rows(ColNumAction) = Date
            CtrlDate = True
        End If
    seront remplacées par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CtrlDate = Range("Date").Rows(ColNumAction) <> Date
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CtrlDate = Not(Range("Date").Rows(ColNumAction) = Date)
    et il me semble que la ligne que j'ai mise en rouge et en commentaire ne devait pas être présente.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 271
    Points : 335
    Points
    335
    Par défaut
    Bonjour,

    Au moins tu sais que l'on a du mal à te comprendre

    Peut tu nous joindre un classeur type?

    Peux-tu nous dire ce que tu veux:
    - Je veux que mon ficher A alimente mon Tableau de bord automatiquement à chaque modification
    - Je veux pouvoir ajouter un quatrième colonne
    - je veux pouvoir ajouter X lignes à mon tableau

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 94
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Alors avant de regarder plus loin, si une cellule ou une variable doit contenir une valeur booléenne, il n'y a aucune raison de faire une comparaison avec IF

    et il me semble que la ligne que j'ai mise en rouge et en commentaire ne devait pas être présente.
    Effectivement, l'approche est intéressante, mais la finalité première n'est pas de donner une valeur true / false à ma variable Ctrl, mais bien, si les valeurs de mes deux cellules sont différentes, leur donner la même valeur. Ma variable Ctrl, boolean, n'est là que pour me valider si oui ou non, une modification sur la cellule a été faite, pour que je puisse à la fin dire à l'utilisateur : cette cellule a été modifiée, cette cellule n'a pas été modifiée, etc.
    C'est donc bien la ligne que tu as mise en rouge et en commentaire qui est centrale et qui fait que je passe par un if.

    Citation Envoyé par had4789 Voir le message
    Bonjour,

    Au moins tu sais que l'on a du mal à te comprendre

    Peut tu nous joindre un classeur type?

    Peux-tu nous dire ce que tu veux:
    - Je veux que mon ficher A alimente mon Tableau de bord automatiquement à chaque modification
    - Je veux pouvoir ajouter un quatrième colonne
    - je veux pouvoir ajouter X lignes à mon tableau
    Je n'ai pas joint de classeur type, il me faudrait effacer beaucoup de données voire réécrire un modèle pour des soucis de confidentialité.
    Je veux que mon fichier A alimente mon tableau de bord automatiquement à chaque modification, sans ajouter de colonne ou de lignes. Et je mets un contrôle (ma variable boolean) pour savoir ce qui a été modifié ou pas (si les valeurs de départ étaient déjà à jour).

    Du coup, j'ai passé mes if en for à l'aide de deux tableaux ce qui donne :

    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
        Set DateMAJRange = Range("DateMAJ")
        Set PtFortsRange = Range("TB_PtForts")
        Set PtFaiblesRange = Range("TB_PtFaibles")
     
        plage = Array(DateMAJRange, PtFortsRange, PtFaiblesRange)
        NomVar = Array(DateMAJ, PtForts, PtFaibles)
     
        For i = 0 To 2
            If plage(i).Rows(ColNumAction) = NomVar(i) Then
                Select Case i
                    Case Is = 0: CtrlDateMAJ = False
                    Case Is = 1: CtrlPtForts = False
                    Case Is = 2: CtrlPtFaibles = False
                End Select
            Else
                plage(i).Rows(ColNumAction) = NomVar(i)
                Select Case i
                    Case Is = 0: CtrlDateMAJ = True
                    Case Is = 1: CtrlPtForts = True
                    Case Is = 2: CtrlPtFaibles = True
                End Select
            End If
       Next i
     
    MsgBox ("Modifications faites pour l'action " & NumAction & " :*" & Chr(10) & "Date de mise à jour = " & CtrlDateMAJ & Chr(10) & "Points forts = " & CtrlPtForts & Chr(10) & "Points Faibles = " & CtrlPtFaibles)

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 936
    Points : 28 932
    Points
    28 932
    Billets dans le blog
    53
    Par défaut
    Bonjour,

    J'ai effectivement vu que la ligne mise en rouge était utile.

Discussions similaires

  1. If Else avec des dates
    Par dandy-kun dans le forum AngularJS
    Réponses: 2
    Dernier message: 06/02/2015, 17h15
  2. Optimisation de l'espace avec des subplots
    Par MaMart dans le forum Images
    Réponses: 2
    Dernier message: 13/02/2012, 18h43
  3. Créer un graphique avec des données sources variables
    Par Tom1402 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 02/12/2008, 18h19
  4. Comment optimiser une lourde requête avec des index
    Par Romalafrite dans le forum Requêtes
    Réponses: 10
    Dernier message: 01/12/2006, 19h18
  5. Optimisation d'une base avec des tables liés
    Par snoopy69 dans le forum Access
    Réponses: 2
    Dernier message: 28/04/2006, 09h11

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