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 :

condition ne fonctionne pas [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2012
    Messages : 18
    Par défaut
    Bonsoir

    Dans un tableau situé dans une feuille appelée "classe" je veux remplir un tableau où seront notés les 3 meilleurs de toutes les classes. Les résultats sont dans une autre feuille nommé "toutes"

    J'ai donc crée le code suivant pour un niveau et le sexe F. Problème dans le tableau seule la deuxième fonctionne, pour la première et la troisième rien ne s'écrit

    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
    54
    55
    Sub class_niveau()
     
    Application.ScreenUpdating = False
    Sheets("toutes").Select
    Range("A1").Select
     
    Do
     
    ActiveCell.Offset(1, 0).Select
    num_classement = ActiveCell.Value
     
    If ActiveCell.Value = "" Then
    Sheets("Classe").Select
    Application.ScreenUpdating = True
    Exit Sub
    End If
     
    If num_classement = 1 Then ActiveCell.Offset(0, 4).Select
        sexe = ActiveCell.Value
        If sexe = "F" Then ActiveCell.Offset(0, 1).Select
            n_classe = ActiveCell.Value
            If n_classe = "3EMEA" Or n_classe = "3EMEB" Or n_classe = "3EMEC" Or n_classe = "3EMED" Then
            ActiveCell.Offset(0, -3).Select
            nom = ActiveCell.Value
            ActiveCell.Offset(0, 1).Select
            prenom = ActiveCell.Value
            Range("Classe!R13").Value = nom & "     " & prenom
     
    End If
    If num_classement = 2 Then ActiveCell.Offset(0, 4).Select
        sexe = ActiveCell.Value
        If sexe = "F" Then ActiveCell.Offset(0, 1).Select
            n_classe = ActiveCell.Value
            If n_classe = "3EMEA" Or n_classe = "3EMEB" Or n_classe = "3EMEC" Or n_classe = "3EMED" Then
            ActiveCell.Offset(0, -3).Select
            nom = ActiveCell.Value
            ActiveCell.Offset(0, 1).Select
            prenom = ActiveCell.Value
            Range("Classe!R14").Value = nom & "     " & prenom
    End If
    If num_classement = 3 Then ActiveCell.Offset(0, 4).Select
        sexe = ActiveCell.Value
        If sexe = "F" Then ActiveCell.Offset(0, 1).Select
            n_classe = ActiveCell.Value
            If n_classe = "3EMEA" Or n_classe = "3EMEB" Or n_classe = "3EMEC" Or n_classe = "3EMED" Then
            ActiveCell.Offset(0, -3).Select
            nom = ActiveCell.Value
            ActiveCell.Offset(0, 1).Select
            prenom = ActiveCell.Value
            Range("Classe!R15").Value = nom & "     " & prenom
    End If
     
    Loop
     
    End Sub
    petite précision si j'enlève les deux dernières conditions la première s'exécute.
    De même si j'enlève les deux premières, la troisième s’exécute

  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
    13 173
    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 : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Difficile de déchiffrer tes lignes de codes sans savoir comment sont organisées tes données.
    Il serait intéressant que tu détailles la manière dont sont structurées les feuilles [Classe] et [Toutes] (Etiquettes de colonnes etc ...)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Ton problème vient de l’utilisation des Select et autres Activecell pour effectuer le traitement des données. Dans ta boucle, tu ne te repositionnes pas correctement après chaque itération.
    Voici ton code après correction de ce positionnement
    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
    54
    Sub class_niveau()
    Dim CelDeb As Range
        Application.ScreenUpdating = False
        Set CelDeb = Sheets("toutes").Range("A1")
        Sheets("toutes").Activate
        CelDeb.Select
        Do
            CelDeb.Offset(1, 0).Select
            num_classement = ActiveCell.Value
     
            If ActiveCell.Value = "" Then
                Sheets("Classe").Select
                Application.ScreenUpdating = True
                Exit Sub
            End If
     
            If num_classement = 1 Then ActiveCell.Offset(0, 4).Select
            sexe = ActiveCell.Value
            If sexe = "F" Then ActiveCell.Offset(0, 1).Select
            n_classe = ActiveCell.Value
            If n_classe = "3EMEA" Or n_classe = "3EMEB" Or n_classe = "3EMEC" Or n_classe = "3EMED" Then
                ActiveCell.Offset(0, -3).Select
                nom = ActiveCell.Value
                ActiveCell.Offset(0, 1).Select
                prenom = ActiveCell.Value
                Range("Classe!R13").Value = nom & "     " & prenom
            End If
     
            If num_classement = 2 Then ActiveCell.Offset(0, 4).Select
            sexe = ActiveCell.Value
            If sexe = "F" Then ActiveCell.Offset(0, 1).Select
            n_classe = ActiveCell.Value
            If n_classe = "3EMEA" Or n_classe = "3EMEB" Or n_classe = "3EMEC" Or n_classe = "3EMED" Then
                ActiveCell.Offset(0, -3).Select
                nom = ActiveCell.Value
                ActiveCell.Offset(0, 1).Select
                prenom = ActiveCell.Value
                Range("Classe!R14").Value = nom & "     " & prenom
            End If
     
            If num_classement = 3 Then ActiveCell.Offset(0, 4).Select
            sexe = ActiveCell.Value
            If sexe = "F" Then ActiveCell.Offset(0, 1).Select
            n_classe = ActiveCell.Value
            If n_classe = "3EMEA" Or n_classe = "3EMEB" Or n_classe = "3EMEC" Or n_classe = "3EMED" Then
                ActiveCell.Offset(0, -3).Select
                nom = ActiveCell.Value
                ActiveCell.Offset(0, 1).Select
                prenom = ActiveCell.Value
                Range("Classe!R15").Value = nom & "     " & prenom
            End If
            Set CelDeb = CelDeb.Offset(1, 0)
        Loop
    End Sub
    Voici un autre code après suppression des Select et Activecell
    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
    Sub class_niveau2()
    Dim Cel As Range, MaPlage As Range
    Dim WsS As Worksheet, WsC As Worksheet
    Dim num_classement As Integer
    Dim Sexe As String, nom As String, prenom As String, n_classe As String
        Set WsS = Worksheets("toutes")
        Set WsC = Worksheets("Classe")
        Application.ScreenUpdating = False
        Set MaPlage = WsS.Range("A2:A" & WsS.Range("A" & Rows.Count).End(xlUp).Row)
        For Each Cel In MaPlage
            num_classement = Cel.Value
            Sexe = Cel.Offset(0, 4)
            If Sexe = "F" Then
                n_classe = Cel.Offset(0, 5)
                If n_classe = "3EMEA" Or n_classe = "3EMEB" Or n_classe = "3EMEC" Or n_classe = "3EMED" Then
                    nom = Cel.Offset(0, 2)
                    prenom = Cel.Offset(0, 3)
                    WsC.Range("R" & num_classement + 12).Value = nom & "     " & prenom
                End If
            End If
        Next Cel
    End Sub
    Cordialement.

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

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

    j'ai essayé tes deux codes. Le premier fonctionne parfaitement et le deuxième me donne tout le classement alors que je veux que les trois premiers.

    A propos de ta première version :
    - j'avais cru lire sur internet qu'il ne fallait pas mélanger le .activate avec le .select : qu'en est il réellement ?

    - A la fin de la boucle tu rajoutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set CelDeb = CelDeb.Offset(1, 0)
    or au début de la boucle il y a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CelDeb.Offset(1, 0).Select
    . Et là j'ai du mal à comprendre car pour moi il doit descendre au total de 2 lignes au lieu de 1

    - Pour le reste du code je ne me suis pas trompé même si cela fait beaucoup de ligne de commande, il va falloir que je trouve de bonne référence pour assimiler tout ce langage

  5. #5
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,
    A propos de ta première version :
    - j'avais cru lire sur internet qu'il ne fallait pas mélanger le .activate avec le .select : qu'en est il réellement ?
    Tu as dû surtout lire qu’il fallait éviter de les utiliser (autant que faire se peut).
    j'ai du mal à comprendre car pour moi il doit descendre au total de 2 lignes au lieu de 1
    Avant de rentrer dans la boucle, on déclare que CelDeb va représenter la position initiale, soit A1.
    On se positionne sur la cellule initiale avec CelDeb.Select.
    Ensuite, on rentre dans la boucle et avec CelDeb.Offset(1, 0).Select , on se positionne donc sur la cellule A2.
    On effectue le traitement et après avoir butiné de cellule en cellule, on se trouve positionné à un endroit quelconque de la feuille.
    Pour se repositionner correctement avant une nouvelle itération, on utilise Set CelDeb = CelDeb.Offset(1, 0) qui permet de déclarer que la position initiale est modifiée et décalée d’une ligne par rapport à la précédente. Cette position initiale devient donc A2.
    Le traitement suivant va alors concerner CelDeb.Offset(1, 0), c'est-à-dire A3.
    Le deuxième code me donne tout le classement alors que je veux que les trois premiers.
    Tu peux limiter le nombre de classement en ajoutant une condition. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Sexe = "F" And num_classement <= 3 Then
    Tu auras compris que je te conseilles vivement de privilégier ce second code.

    Cordialement.

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2012
    Messages : 18
    Par défaut
    Citation Envoyé par gFZT82 Voir le message
    Avant de rentrer dans la boucle, on déclare que CelDeb va représenter la position initiale, soit A1.
    On se positionne sur la cellule initiale avec CelDeb.Select.
    Ensuite, on rentre dans la boucle et avec CelDeb.Offset(1, 0).Select , on se positionne donc sur la cellule A2.
    On effectue le traitement et après avoir butiné de cellule en cellule, on se trouve positionné à un endroit quelconque de la feuille.
    Pour se repositionner correctement avant une nouvelle itération, on utilise Set CelDeb = CelDeb.Offset(1, 0) qui permet de déclarer que la position initiale est modifiée et décalée d’une ligne par rapport à la précédente. Cette position initiale devient donc A2.
    Le traitement suivant va alors concerner CelDeb.Offset(1, 0), c'est-à-dire A3
    Ok là c'est clair

    Citation Envoyé par gFZT82 Voir le message
    Tu auras compris que je te conseilles vivement de privilégier ce second code.
    oui puisse que le code est plus court. Je vais essayer de comprendre la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaPlage = WsS.Range("A2:A" & WsS.Range("A" & Rows.Count).End(xlUp).Row)
    et tenter de le modifier pour appliquer çà au sexe masculin et pour 4 niveaux différents.

    Une fois fait mon classeur serait près pour le cross de mon établissement

    Si je patauge je viendrai vous solliciter à nouveau

    cordialement

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

Discussions similaires

  1. [XL-2010] Filtre sur plusieurs conditions ne fonctionne pas
    Par moi244 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/02/2013, 08h40
  2. [AJAX] responseText et condition ne fonctionne pas
    Par oceane751 dans le forum AJAX
    Réponses: 4
    Dernier message: 15/04/2012, 00h03
  3. le Style condition ne fonctionne pas.
    Par MAJIK_ENIS dans le forum iReport
    Réponses: 1
    Dernier message: 31/05/2010, 23h07
  4. [AC-2007] Ma requête avec condition ne fonctionne pas
    Par spike35s dans le forum VBA Access
    Réponses: 1
    Dernier message: 15/03/2010, 06h13
  5. [MySQL] Condition ne fonctionnant pas dans une classe
    Par lodan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/02/2007, 16h38

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