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 :

Plusieurs if imbriqués


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 21
    Par défaut Plusieurs if imbriqués
    Salut; Je veux parcourir une liste de rangée pour trouver une valeur. Chaque rangée à beaucoup de condition à remplir afin qu'il me donne la valeur du prix coutant. Mon problème c'est qu'on dirait qu'après 3 if imbriqués vba ne lis plus les valeurs


    Voici la manière dont je procède

    'A B C D E F G H'ce sont les collones d'excel
    '20; 2004; Je; Pn; EYI; 8,505; 9; 8.50;
    'ci-haut c'est la colonne que je recherche pour afficher le prix coûtant


    dans une boucle For
    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
    '1- si la cellule x1 n'est pas vide fait ceci;
    '2- si la cellule x1 est égale à 20$ fait ceci;
    '3- si la cellule x5 est égale à "EYI" fait ceci;
    '4- si la cellule x3 est égale à "Je" et la cellule x4 est égale à "Pn" fais ceci;
    '5- si la cellule x6 est égale à 2004 fait ceci
    '6- si la cellule x6 est < valeur et la cellule x6 est > valeur alors pour terminer
    'Affiche "J'ai trouvé sinon
    'MsgBox "pas de correspondance"
     
    Sub prixCoutant()
    Dim compteur, argentVal, annee_impresson As Integer
    Dim dossier As String
    Dim valeur As Single
     
    'initialization des variables
    dossier = "EYI8600000"
    argentVal = 20 ' 20$
    valeur = Right(dossier, 7) / 1000000 '8,6
    annee_impresson = 2004
     
    Sheets("try").Select
     
    For compteur = 1 To 45 'row.count
    'Désolé pour l'indentation:(
        If Not IsEmpty(Cells(compteur, 1).Value) Then
            If Cells(compteur, 1).Value = argentVal Then
                If Cells(compteur, 5).Value Like Left(dossier, 3) Then
                    If Cells(compteur, 3).Value Like "Je" And Cells(compteur, 3) Like "Pn" Then
                        If Cells(compteur, 2).Value = annee_impression Then
                            If Cells(compteur, 6) <= valeur And Cells(compteur, 7).Value > valeur Then
                                MsgBox "J'ai trouvé"
                                MsgBox Cells(compteur, 8).Value
                            Else
                                MsgBox "Il n'y a pas de correspondance"
                            End If '(6ième)
                        End If '(5ième)
                    End If '(4ième)
                End If '(3ième)
            End If '(2ième)
        End If '(1er)
     
    Next compteur
     
     
    '1- si la cellule x1 n'est pas vide fait ceci;
    '2- si la cellule x1 est égale à 20$ fait ceci;
    '3- si la cellule x5 est égale à "EYI" fait ceci;
    '4- si la cellule x3 est égale à "Je" et la cellule x4 est égale à "Pn" fais ceci;
    '5- si la cellule x6 est égale à 2004 fait ceci
    '6- si la cellule x6 est < valeur et la cellule x6 est > valeur alors pour terminer
    'Affiche "J'ai trouvé sinon
    'MsgBox "pas de correspondance"
     
    End Sub
    merci

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    Une proposition à essayer (successions de filtres automatiques)
    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
    Sub prixCoutant()
    Dim Annee_Impresson As Integer, ArgentVal As Integer, Nb As Integer
    Dim Dossier As String
    Dim Valeur As Long, LastLig As Long
     
    Application.ScreenUpdating = False
    'initialization des variables
    Dossier = "EYI8600000"
    ArgentVal = 20                                                       ' 20$
    Valeur = Right(Dossier, 7) / 1000000                                 '8,6
    Annee_Impresson = 2004
     
    With Sheets("try")
        .AutoFilterMode = False
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        With .Range("A1:H" & LastLig)
            .AutoFilter field:=1, Criteria1:="<>"
            .AutoFilter field:=2, Criteria1:=Annee_Impresson
            .AutoFilter field:=3, Criteria1:="Je"
            .AutoFilter field:=4, Criteria1:="Pn"
            .AutoFilter field:=5, Criteria1:=Left(Dossier, 3) & "*"
            .AutoFilter field:=6, Criteria1:="<=" & Valeur
            .AutoFilter field:=7, Criteria1:=">" & Valeur
        End With
        Nb = .Range("A1:A" & LastLig).SpecialCells(xlCellTypeVisible).Count - 1
        If Nb > 1 Then
            MsgBox Nb & " résultat(s) trouvé(s)"
            If Nb = 1 Then MsgBox "Le résultat trouvé  " & .Range("H2:H" & LastLig).SpecialCells(xlCellTypeVisible).Value
        Else
            MsgBox "Il n'y a pas de correspondance"
        End If
        .AutoFilterMode = False
    End With
    End Sub

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    Sinon, l'approche "code pur", c'est de mettre des and :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    If (Not IsEmpty(Cells(compteur, 1).Value)) And _
       (Cells(compteur, 1).Value = argentVal) And _
       (Cells(compteur, 5).Value Like Left(dossier, 3) And _
       (Cells(compteur, 3).Value Like "Je" And Cells(compteur, 3) Like "Pn") And _
       (Cells(compteur, 2).Value = annee_impression) And _
       (Cells(compteur, 6) <= valeur And Cells(compteur, 7).Value > valeur)) Then
        MsgBox "J'ai trouvé"
        MsgBox Cells(compteur, 8).Value
    Else
        MsgBox "Il n'y a pas de correspondance"
    End If
    Mais dans ce cas précis, c'est lourd, et comme il ne s'agit que de valeurs de cellules, la solution de mercatog est plus élégante.

  4. #4
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 21
    Par défaut plusieurs if imbriqués: autoFilter; Criteria
    Je tiens à remercier el_slapper et mercatog pour leur aide!

    Concerant l'algorithme de mercatog; je n'arrive pas à trouver la valeur pour le champ 6 ou 7; quand je lui mets une variable:
    exemple: si j'écris :
    a: .AutoFilter field:=7, Criteria1:=">" & Valeur 'valeur=8.6
    b: .AutoFilter field:=7, Criteria1:=">8.6"
    l'exemple (b) marchera; mais l'exemple (a) ne marche pas; Or je voudrais plutôt mettre une variable parce que je pourrais faire d'autres requêtes (ou recherches)
    J'ai essayer d'écrire la Variable 'valeur' dans une cellule pour que le critère plus le lire par la suite mais ça ne marche pas non plus
    ex:
    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
    range(F150).value = 8.6
    .AutoFilter field:=7, Criteria1:=">" & range(F150).value
    'mais ça ne marche pas non plus
     
     
    Sub prixCoutant2()
    Dim Annee_Impresson As Integer, ArgentVal As Integer, Nb As Integer
    Dim Dossier As String
    Dim Valeur As Double, LastLig As Double
     
    Application.ScreenUpdating = False
     
    'initialization des variables
    Dossier = "EYI8600000"
    ArgentVal = 20                                                       ' 20$
    Valeur = Right(Dossier, 7) / 1000000
    'MsgBox Valeur '8,6
    Annee_Impresson = 2004
    'Valeur des colonnes
    ' A   B       C   D   E   F      G       H    I
    '20  2004    Je  Pn  EYI 7,92    8,28    20  25
    '20  2004    Je  Pn  EYI 8,505   9       20  25
    '20  2004    Je  Pn  EYI 9,36    10      20  25
     
    'pour trouver la réponse de la deuxième colonne: Instruction
    With Sheets("try2")
        .AutoFilterMode = False
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
     
        With .Range("A1:H" & LastLig)
            .AutoFilter field:=1, Criteria1:="<>"
            .AutoFilter field:=2, Criteria1:=Annee_Impresson
            .AutoFilter field:=3, Criteria1:="Je"
            .AutoFilter field:=4, Criteria1:="Pn"
            .AutoFilter field:=5, Criteria1:="EYI" 'Left(Dossier, 3) & "*"
            .AutoFilter field:=6, Criteria1:="<=8.6" ' & Valeur
            'la colonne 6 doit être plus petit que 8.6
            .AutoFilter field:=7, Criteria1:=">8.6" '& Valeur
            ''la colonne 7 doit être plus grand que 8.6
        End With
     
        Nb = .Range("A1:A" & LastLig).SpecialCells(xlCellTypeVisible).Count - 1
        If Nb > 1 Then
            MsgBox Nb & " résultat(s) trouvé(s)"
            ElseIf Nb = 1 Then MsgBox "Le résultat trouvé  " & _
                .Range("H2:H" & LastLig).SpecialCells(xlCellTypeVisible).Value
            Else
                MsgBox "Il n'y a pas de correspondance"
        End If
        .AutoFilterMode = False
    End With
     
    End Sub

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonsoir
    J'ai testé le code sur un fichier exemple.
    Tu peux mettre en PJ un extrait de ton fichier avec des données bidons?

  6. #6
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 21
    Par défaut fichier exemple
    Merci;

    Ceci est un fichier exemple. Il y a normalement beaucoup plus de colonnes mais ceux que je voudrais appliquer un filtre sont là.
    Fichiers attachés Fichiers attachés
    • Type de fichier : xls try.xls (63,0 Ko, 203 affichages)

Discussions similaires

  1. Plusieurs while imbriqués
    Par fedexpress dans le forum Langage
    Réponses: 2
    Dernier message: 15/10/2009, 15h36
  2. Expression régulière - gestion de plusieurs spans imbriqués en HTML
    Par Kayan dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 27/04/2009, 16h06
  3. [MySQL] Plusieurs while imbriqués pour expoitation de résultats
    Par jojo57 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/03/2008, 15h01
  4. Plusieurs strtok imbriqués
    Par HaTnuX dans le forum C
    Réponses: 7
    Dernier message: 10/12/2006, 16h02
  5. [excel] Plusieurs if imbriqués
    Par steps5ive dans le forum Access
    Réponses: 2
    Dernier message: 08/11/2005, 19h25

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