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 :

VBA Boucle qui ne se reproduit pas dans les mêmes conditions [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2017
    Messages : 7
    Points : 4
    Points
    4
    Par défaut VBA Boucle qui ne se reproduit pas dans les mêmes conditions
    Bonjour à tous,

    Je suis nouveau ici et c'est mon 1er message.
    N'hésitez pas à corriger ma présentation.

    Je rencontre un problème sur boucle VBA avec IF (ci-dessous)
    Cela fonctionne une fois, pour l'enregistrement 16 (par exemple), mais pas pour les suivants, qui respectent pourtant la même condition que la ligne 16.

    Je m'explique.
    Tant que la cellule (i, 38) n'est pas vide, et SI la valeur = 1 (sachant que le 1 est calculé), ALORS exécute les quelques commandes qui suivent, SINON on passe à la cellule du dessous.

    Merci d'avance pour tous conseils ! :-)

    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
    Sub Liste_des_mvt_injustiées()
     
    Sheets("Saisie").Activate
     
    Dim i As Integer
     
    i = 7
     
    While Sheets("Saisie").Cells(i, 38).Value <> ""                      'boucle qui contrôle l'ensemble de la liste cariste
     
     If Cells(i, 38).Text = "1" Then                                     'Si le contrôle(soupçon de fraude) est vrai
     
        Sheets.Add.Move After:=Sheets(Sheets.Count)                     'Je crée une nouvelle feuille et la déplace en dernier
        ActiveSheet.Name = Sheets("Saisie").Cells(i, 4).Value           'Je renomme la feuille au nom du cariste
     
        Sheets("Check").Select
     
       With Selection
            .AutoFilter Field:=2, Criteria1:=Sheets("Saisie").Cells(i, 5).Value        'Détail: Je filtre sur les mvt du cariste
       End With
     
        Range("A2").Select                                                             'Je sélectionne le détail de ses mouvements
        Selection.CurrentRegion.Select
        Selection.Copy
        Sheets(Sheets.Count).Select                                                    'Je colle sur la dernière feuille
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
                                                                              'Je passe au contrôle suivant
     End If
     
    i = i + 1
     
    Wend
     
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    Sélectionner les feuilles ne sert à rien la plupart du temps.
    Par contre, nommer les feuilles avant le Range permet d'éviter bien des erreurs...
    MPi²

  3. #3
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,

    Par exemple :
    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 Liste_des_mvt_injustiées()
    Dim i As Long, f As Worksheet
      i = 7
      With Sheets("Saisie")
        While .Cells(i, 38).Value <> ""                                             'Boucle qui contrôle l'ensemble de la liste cariste
          If .Cells(i, 38).Text = "1" Then                                          'Si le contrôle(soupçon de fraude) est vrai
            Worksheets.Add.Move After:=Sheets(Sheets.Count)                         'Je crée une nouvelle feuille de calcul et la déplace en dernier
            Set f = ActiveSheet                                                     'Je défini la feuille créée
            f.Name = Worksheets("Saisie").Cells(i, 4).Value                         'Je renomme la feuille au nom du cariste
            Worksheets("Check").AutoFilter Field:=2, Criteria1:=.Cells(i, 5).Value  'Détail: Je filtre sur les mvt du cariste
            Worksheets("Check").Range("A2").CurrentRegion.Copy                      'Je copie le détail de ses mouvements
            f.Range("A1").PasteSpecial Paste:=xlPasteValues                         'Je colle le détail de ses mouvements
          End If
          i = i + 1                                                                 'Je passe au contrôle suivant
        Wend
      End With
    End Sub
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  4. #4
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Je te conseille aussi de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim i As Integer
    i = 7
    While Sheets("Saisie").Cells(i, 38).Value <> ""
     
    i = i + 1
    Wend
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim i As Long
    For i = 7 To Sheets("Saisie").Cells(Rows.Count, 38).End(xlUp).Row
     
    Next i
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2017
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci à tous pour vos 1ères corrections

    Mais hélas elle ne répondent pas à ma problématique principale, étant:

    - Mon IF fonctionne à la 1ère ligne respectant les conditions, mais pas sur les lignes suivantes respectant pourtant les mêmes conditions.
    - La condition est cells(i, 38) = "1"
    - Ce "1" est calculé. D'où le ".Text" (et non un ".Value")

    Sauriez-vous pourquoi mon IF ne se répète pas ?

    Patrice merci, j'ai essayé ta proposition mais VBA se met en bugue. l'argument suivant n'étant pas défini:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Worksheets("Check").AutoFilter Field:=2, Criteria1:=.Cells(i, 5).Value

  6. #6
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    Je pense que ton problème se situe bien dans les Selection/Select. C'est dangeureux de travailer avec des Select/Activate ...
    Si tu ne spécifie rien devant Cells(i,j), alors on s'intéresse à la cellule de la feuille active, or :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Liste_des_mvt_injustiées()
    Sheets("Saisie").Activate
    Dim i As Integer
    i = 7
    While Sheets("Saisie").Cells(i, 38).Value <> ""                      
     If Cells(i, 38).Text = "1" Then                                     
          [...]
        Sheets("Check").Select    '----------> la feuille active devient donc "Check" et le prochain Cells(i,38) sera donc étudié sur cette feuille.
          [...]
     End If
    i = i + 1
    Wend
    End Sub
    D'où le conseil de Patrice740 depasser par des objets.

    En ce qui concerne le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Check").AutoFilter Field:=2, Criteria1:=.Cells(i, 5).Value
    AutoFilter s'effectue sur un objet Range.
    Supposons que ton tableau va de la colonne A à la colonne Z :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Sheets("Check")
        .Range("A1:Z" & .Range("A" & .Rows.Count).End(xlUp).Row).AutoFilter Field:=2, Criteria1:=Sheets("Saisie").Cells(i,5).Value
    End With
    .Range("A" & .Rows.Count).End(xlUp).Row permet de trouver la dernière ligne non vide.

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Juillet 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2017
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Oui c'est tout à fait ça !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If Sheets("Saisie").Cells(i, 38).Text = "1" Then
    Grand merci à Patrice et Riaolle

    Cordialement,

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

Discussions similaires

  1. [HTML 5] Background-image qui ne s'affiche pas dans les navigateurs
    Par patnour dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/06/2015, 14h56
  2. Page PHP qui ne s'affiche pas dans le site
    Par cyberdevelopment dans le forum Langage
    Réponses: 2
    Dernier message: 11/08/2006, 11h49
  3. excel: colonne qui ne s'affiche pas dans une liste
    Par fast&furious dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/07/2006, 18h12
  4. Champs qui ne s'affichent pas dans formulaire
    Par capitaine dans le forum Access
    Réponses: 1
    Dernier message: 02/06/2006, 15h00
  5. [VBA-E]une boucle qui ne s'arrète pas
    Par vivelesgnous dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/02/2006, 18h05

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