boucle vba avec condition multi colonne et multi feuille Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Avatar du membre
pyro206
Membre habitué
Membre habitué
Messages : 56
Appréciations reçues : 3
Inscrit le : 3 mars 2014
Version d'Excel : 2016fr

Message par pyro206 » 7 décembre 2017, 08:44

bonjour

je fait appel a votre savoir car le mien arrive a saturation

je souhaite récupérer les valeur des colonne dont la condition est oui sur plusieurs feuille, jusque la le code fonctionne bien :¬OL:

mon problème est que la lecture ne ce fait pas part colonne mes en ligne ce qui fait si deux valeur successive on oui l'une écrase l'autre :cry: :cry: :cry: .

je souhaiterais que ma macro termine une condition avec de débuter la suivante en ce mettant sous la dernier ligne écrite

merci pour votre aide



mon code est e suivant

Const nomFO = "TEMPORAIRE" ' nom de la feuille Origine 1
Const nomFO2 = "GLOBAL" ' nom de la feuille Origine 1
Const nomFD = "TEST" ' nom de la feuille Destination

Sub TEST_fin()

'Déclaration d'une variable entière pour stocker le nombre de ligne de ton tableau
Dim NombreLigne As Integer

'Enregistrement du nombre de ligne de ton tableau
NombreLigne = InputBox("Nombre de ligne à traiter ?")

'Boucle qui va de 1 au nombre total de ligne
For i = 1 To NombreLigne

'Si la cellule de la ligne i et de la colonne est égale à Oui, alors

If Sheets(nomFO).Cells(i, 25) = "Oui" Then

'Je vais sur la feuille de destination sur la celulle i en collonne et copier la cellulle

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO).Cells(i, 23).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO).Cells(i, 24).Value

ElseIf Sheets(nomFO).Cells(i, 37) = "Oui" Then


Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO).Cells(i, 35).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO).Cells(i, 36).Value


ElseIf Sheets(nomFO2).Cells(i, 27) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 25).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 26).Value

ElseIf Sheets(nomFO2).Cells(i, 39) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 37).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 38).Value

ElseIf Sheets(nomFO2).Cells(i, 51) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 49).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 50).Value

ElseIf Sheets(nomFO2).Cells(i, 63) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 61).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 62).Value

ElseIf Sheets(nomFO2).Cells(i, 75) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 73).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 74).Value

ElseIf Sheets(nomFO2).Cells(i, 87) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 85).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 86).Value
'Fin de la condition If
End If






'Fin de la boucle For
Next

Exit Sub

End Sub
:ordi3: :grr: :bof: 8-)
m
medas
Membre habitué
Membre habitué
Messages : 90
Inscrit le : 8 janvier 2016
Version d'Excel : 2003-2010

Message par medas » 7 décembre 2017, 09:13

Bonjour pyro206, Excelleurs(es),

Merci d'utiliser les quotes quand tu mets du code
Const nomFO = "TEMPORAIRE" ' nom de la feuille Origine 1
Const nomFO2 = "GLOBAL" ' nom de la feuille Origine 1
Const nomFD = "TEST" ' nom de la feuille Destination

Sub TEST_fin()

'Déclaration d'une variable entière pour stocker le nombre de ligne de ton tableau
Dim NombreLigne As Integer

'Enregistrement du nombre de ligne de ton tableau
NombreLigne = InputBox("Nombre de ligne à traiter ?")

'Boucle qui va de 1 au nombre total de ligne
For i = 1 To NombreLigne

'Si la cellule de la ligne i et de la colonne est égale à Oui, alors

If Sheets(nomFO).Cells(i, 25) = "Oui" Then

'Je vais sur la feuille de destination sur la celulle i en collonne et copier la cellulle

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO).Cells(i, 23).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO).Cells(i, 24).Value

ElseIf Sheets(nomFO).Cells(i, 37) = "Oui" Then


Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO).Cells(i, 35).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO).Cells(i, 36).Value


ElseIf Sheets(nomFO2).Cells(i, 27) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 25).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 26).Value

ElseIf Sheets(nomFO2).Cells(i, 39) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 37).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 38).Value

ElseIf Sheets(nomFO2).Cells(i, 51) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 49).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 50).Value

ElseIf Sheets(nomFO2).Cells(i, 63) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 61).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 62).Value

ElseIf Sheets(nomFO2).Cells(i, 75) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 73).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 74).Value

ElseIf Sheets(nomFO2).Cells(i, 87) = "Oui" Then

Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 85).Value
Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 86).Value
'Fin de la condition If
End If

'Fin de la boucle For
Next

Exit Sub

End Sub
pyro206 a écrit :
7 décembre 2017, 08:44
je souhaiterais que ma macro termine une condition avec de débuter la suivante en ce mettant sous la dernier ligne écrite
Peux tu reformuler ta phrase?


A te lire,
Medas
Avatar du membre
pyro206
Membre habitué
Membre habitué
Messages : 56
Appréciations reçues : 3
Inscrit le : 3 mars 2014
Version d'Excel : 2016fr

Message par pyro206 » 7 décembre 2017, 09:25

Bonjour medas

Désolé pour la mauvaise formulation :oops: :oops: :oops: :oops: je vais essayer d'être plus claire


J'ai plusieurs boucle dans le code

Je voudrais que chaque boucle termine avec d'exécuter la suivante.

En gros je voudrais que mon code tourne de la manière suivante

J'ai plus leurs feuille
Dans ces feuille mes tableau on un grandeur et forme différente

Je doit récupérer les informations des collonees ayant la condition oui uniquement

Exemple

Cellule A 23 = Oui je récupère la case b23
Cellule a24 = code je passe à cellule a25 etc.. ..

Mon souci est que les conditions oui ne sont pas systématiquement en colonne À il peuvent ce trouver en aa en bb etc. ...

Ce que je voudraique ma boucle termine sont traitement en colonne À avant de commencer le traitement des colonne aa

Et quel dérive lien en dessous de l'autre
:ordi3: :grr: :bof: 8-)
m
medas
Membre habitué
Membre habitué
Messages : 90
Inscrit le : 8 janvier 2016
Version d'Excel : 2003-2010

Message par medas » 7 décembre 2017, 09:33

pyro206 a écrit :
7 décembre 2017, 08:44

mon problème est que la lecture ne ce fait pas part colonne mes en ligne ce qui fait si deux valeur successive on oui l'une écrase l'autre :cry: :cry: :cry: .
C'est tout à fait normal que ta macro te fait ligne par ligne. Tu fais un parcours avec une multitude if donc je te le fais en français.
pour i égale un à nombreLigne si ma cellule égale oui alors copie moi sinon si ma cellule égale oui copie moi .......
En gros c'est tout à fait normal qu'il écrase la donnée au fur à mesure qui vérifie tes conditions.
Je peux comprendre que tu t'y connais rien dans la programmation. Mais avant d'écrire quoi se soit sur un éditeur VB; prends le temps de faire une simulation avec juste un crayon et un papier sa te suffit pour résoudre ton problème et d'écrire le bon code.
Quand j'ai lu ton poste et ton code j'ai éclaté de rire désolé :-P
m
medas
Membre habitué
Membre habitué
Messages : 90
Inscrit le : 8 janvier 2016
Version d'Excel : 2003-2010

Message par medas » 7 décembre 2017, 09:56

pyro206,

à tester:
Sub test_Fin()
    'variable
    Dim derLg, i,nbLg As Integer
    Dim wsFo, wsFO2, wsFd As Worksheet
    'initialisation des feuilles
    Set wsFo = ThisWorkbook.Sheets("TEMPORAIRE")
    Set wsFO2 = ThisWorkbook.Sheets("GLOBAL")
    Set wsFd = ThisWorkbook.Sheets("TEST")
    
    nbLg = InputBox("Nombre de ligne à traiter ?")
    'sert pour la copie des autres colonnes les uns sous les autres
    derLg = 0
    
    For i = 1 To nbLg
        If wsFo.Cells(i, 25) = "Oui" Then
            wsFd.Cells(i, 1).Value = Sheets(nomFO).Cells(i, 1).Value
            wsFd.Cells(i, 2).Value = Sheets(nomFO).Cells(i, 23).Value
            wsFd.Cells(i, 3).Value = Sheets(nomFO).Cells(i, 24).Value
            derLg = derLg + 1
        End If
    Next i
    For i = 1 To nbLg
        If wsFo.Cells(i, 37) = "Oui" Then
            wsFd.Cells(i + derLg, 1).Value = Sheets(nomFO).Cells(i, 1).Value
            wsFd.Cells(i + derLg, 2).Value = Sheets(nomFO).Cells(i, 35).Value
            wsFd.Cells(i + derLg, 3).Value = Sheets(nomFO).Cells(i, 36).Value
            derLg = derLg + 1
        End If
    Next i
    
    For i = 1 To nbLg
        If wsFO2.Cells(i, 27) = "Oui" Then
            wsFd.Cells(i + derLg, 1).Value = Sheets(nomFO).Cells(i, 1).Value
           wsFd.Cells(i + derLg, 2).Value = Sheets(nomFO).Cells(i, 25).Value
            wsFd.Cells(i + derLg, 3).Value = Sheets(nomFO).Cells(i, 26).Value
            derLg = derLg + 1
        End If
    Next i
    For i = 1 To nbLg
        If wsFO2.Cells(i, 39) = "Oui" Then
            wsFd.Cells(i + derLg, 1).Value = Sheets(nomFO).Cells(i, 1).Value
            wsFd.Cells(i + derLg, 2).Value = Sheets(nomFO).Cells(i, 37).Value
            wsFd.Cells(i + derLg, 3).Value = Sheets(nomFO).Cells(i, 38).Value
            derLg = derLg + 1
        End If
    Next i
    
    For i = 1 To nbLg
        If wsFO2.Cells(i, 51) = "Oui" Then
            wsFd.Cells(i + derLg, 1).Value = Sheets(nomFO).Cells(i, 1).Value
           wsFd.Cells(i + derLg, 2).Value = Sheets(nomFO).Cells(i, 49).Value
            wsFd.Cells(i + derLg, 3).Value = Sheets(nomFO).Cells(i, 50).Value
            derLg = derLg + 1
        End If
    Next i
    For i = 1 To nbLg
        If wsFO2.Cells(i, 63) = "Oui" Then
            wsFd.Cells(i + derLg, 1).Value = Sheets(nomFO).Cells(i, 1).Value
            wsFd.Cells(i + derLg, 2).Value = Sheets(nomFO).Cells(i, 61).Value
            wsFd.Cells(i + derLg, 3).Value = Sheets(nomFO).Cells(i, 62).Value
            derLg = derLg + 1
        End If
    Next i
    
    For i = 1 To nbLg
        If wsFO2.Cells(i, 75) = "Oui" Then
            wsFd.Cells(i + derLg, 1).Value = Sheets(nomFO).Cells(i, 1).Value
           wsFd.Cells(i + derLg, 2).Value = Sheets(nomFO).Cells(i, 73).Value
            wsFd.Cells(i + derLg, 3).Value = Sheets(nomFO).Cells(i, 74).Value
            derLg = derLg + 1
        End If
    Next i
    For i = 1 To nbLg
        If wsFO2.Cells(i, 87) = "Oui" Then
            wsFd.Cells(i + derLg, 1).Value = Sheets(nomFO).Cells(i, 1).Value
            wsFd.Cells(i + derLg, 2).Value = Sheets(nomFO).Cells(i, 85).Value
            wsFd.Cells(i + derLg, 3).Value = Sheets(nomFO).Cells(i, 86).Value
            derLg = derLg + 1
        End If
    Next i
End Sub
alors je t'ai pour chaque feuille et chaque colonne dans la feuille un parcours avec la condition. Si la condition est respecté on copie et on compte le nombre de fois qu'on copie. on récupère le nombre de copie faites sur la première colonne pour l'ajouter à la suite quand il va vérifier les autres colonnes des autres feuilles et continue de compter
j'espère qui fera sa sinon je suis mauvais :-P

A te lire,
Medas
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 7 décembre 2017, 10:12

Bonjour,
mon problème est que la lecture ne ce fait pas part colonne mes en ligne ce qui fait si deux valeur successive on oui l'une écrase l'autre :cry: :cry: :cry: .
Je ne vois pas où deux "oui" successifs pourraient entraîner un télescopage ! tes conditions étant exclusives l'une des autres. Si la feuille destination ne contient rien au départ tout ce qui peut t'arriver ce sont des lignes vides...

Mais reprenons dans l'ordre :mrgreen: :
Ton code mis sous balises Code, indenté et nettoyé des commentaires dont l'indigence est la caractéristique principale (exemple : 'Fin de la condition If pour commenter la ligne qui suit : End If :lol: )
J'aurais trouvé ce code ainsi :
Sub TEST_fin()
    Dim NombreLigne As Integer
    NombreLigne = InputBox("Nombre de ligne à traiter ?")
    For i = 1 To NombreLigne
        If Sheets(nomFO).Cells(i, 25) = "Oui" Then
            Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO).Cells(i, 1).Value
            Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO).Cells(i, 23).Value
            Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO).Cells(i, 24).Value
        ElseIf Sheets(nomFO).Cells(i, 37) = "Oui" Then
            Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO).Cells(i, 1).Value
            Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO).Cells(i, 35).Value
            Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO).Cells(i, 36).Value
        ElseIf Sheets(nomFO2).Cells(i, 27) = "Oui" Then
            Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
            Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 25).Value
            Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 26).Value
        ElseIf Sheets(nomFO2).Cells(i, 39) = "Oui" Then
            Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
            Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 37).Value
            Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 38).Value
        ElseIf Sheets(nomFO2).Cells(i, 51) = "Oui" Then
            Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
            Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 49).Value
            Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 50).Value
        ElseIf Sheets(nomFO2).Cells(i, 63) = "Oui" Then
            Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
            Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 61).Value
            Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 62).Value
        ElseIf Sheets(nomFO2).Cells(i, 75) = "Oui" Then
            Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
            Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 73).Value
            Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 74).Value
        ElseIf Sheets(nomFO2).Cells(i, 87) = "Oui" Then
            Sheets(nomFD).Cells(i, 1).Value = Sheets(nomFO2).Cells(i, 1).Value
            Sheets(nomFD).Cells(i, 2).Value = Sheets(nomFO2).Cells(i, 85).Value
            Sheets(nomFD).Cells(i, 3).Value = Sheets(nomFO2).Cells(i, 86).Value
        End If
    Next
    Exit Sub
End Sub
J'aurais passé beaucoup beaucoup moins de temps à le lire ! :( Et on voit vite un certain nombre de choses :
- un Exit Sub précédant End Sub : on ne voit pas bien pourquoi ! On ne sort qu'une fois ! :lole:
- une répétition en nombre conséquent de la feuille destination : ça mérite une mise sous bloc With, on ne l'indiquera qu'une fois, moins à écrire et de plus l'exécution en sera accélérée...
- une régularité de la succession des colonnes testées, laquelle n'est pas mise à profit pour raccourcir le code (par une boucle imbriquée...)
- une InputBox pour indiquer le nombre de lignes à traiter : si on doit traiter toutes les lignes, ce qui semble être le cas, la méthode paraît farfelue...
- des constantes pour les noms de feuilles : efficacité douteuse, il y a mieux à faire, en utilisant des variables objet pour améliorer le code...

On va donc procéder à quelques aménagements... :wink:
Sub TEST_fin()
    Dim FO As Worksheet, FO2 As Worksheet, n%, i%, k%, tft, vu As Boolean
    Set FO = Worksheets("TEMPORAIRE")
    Set FO2 = Worksheets("GLOBAL")
    n = FO.Cells(Rows.Count, 1).End(xlUp).Row
    With Worksheets("TEST")
        For i = 1 To n
            For k = 25 To 37 Step 12
                If FO.Cells(i, k) = "Oui" Then
                    tft = Array(FO.Cells(i, 1), FO.Cells(i, k - 2), FO.Cells(i, k - 1))
                    .Cells(i, 1).Resize(, 3).Value = tft
                    vu = True: Exit For
                End If
            Next k
            If Not vu Then
                For k = 27 To 87 Step 12
                    If FO2.Cells(i, k) = "Oui" Then
                        tft = Array(FO2.Cells(i, 1), FO2.Cells(i, k - 2), FO2.Cells(i, k - 1))
                        .Cells(i, 1).Resize(, 3).Value = tft
                        Exit For
                    End If
                Next k
            End If
            vu = False
        Next i
    End With
End Sub
Voilà qui est tout de même plus court, un peu plus concis comme code, et roulera un peu plus vite... :oui:
Tu noteras que bouclant sur les colonnes, pour conserver le caractère exclusif de chaque condition (impliqué par les ElseIf du code initial) on a utilisé une variable booléenne, en raison de la dualité de feuilles origine, de façon que si la condition est satisfaite sur FO on puisse occulter FO2...

Ce code doit donc faire exactement ce que faisait le code initial, ce qui laisse intactes des interrogations :
- le caractère exclusif des conditions : est-ce qu'elles doivent l'être ? est-ce bien ce qu'on voulait faire ?
- le fait que si aucune condition n'est satisfaite sur une ligne, cette ligne restera vide sur la feuille destination (sauf si des valeurs y préexistaient) : est-ce bien aussi ce que l'on veut ?

Cordialement.

edit : pendant que je rédigeais ce post, je n'ai pu prendre connaissance du déroulement de la discussion, mais il apparaît que les 2 questions que je pose ci-dessus devraient être tranchées pour un caractère non exclusif de chaque condition et un remplissage normal de la feuille destination, ce que fera semble-t-il la proc. de Medas que j'ai rapidement parcourue (qui reste à raccourcir...). Ordre d'inscription à confirmer car elle ne produira pas le même ordre que celui impliqué par la proc. initiale.
m
medas
Membre habitué
Membre habitué
Messages : 90
Inscrit le : 8 janvier 2016
Version d'Excel : 2003-2010

Message par medas » 7 décembre 2017, 10:45

Mferrand, pyro206,

Je n'ai même pas fait attention sur le pas bien vu 8[] .
Je n'ai pas cherché à analyser le code :bof: .
J'ai fait ce qu'il a écrit pas chercher midi à quatorze heures :roll: .
En tous cas bravo pour ton résultat 8[] .
J'aurai pas fait mieux :oops: .

Cordiales,
Medas
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 7 décembre 2017, 10:53

Re à tous !

Version aménagée pour tester toutes les cellules (toutes les colonnes indiquées par lignes) et remplir normalement la feuille :
Sub TEST_fin()
    Dim FO As Worksheet, FO2 As Worksheet, n%, i%, k%, lgn%, tft
    Set FO = Worksheets("TEMPORAIRE")
    Set FO2 = Worksheets("GLOBAL")
    n = FO.Cells(Rows.Count, 1).End(xlUp).Row
    With Worksheets("TEST")
        For i = 1 To n
            For k = 25 To 37 Step 12
                If FO.Cells(i, k) = "Oui" Then
                    lgn = lgn + 1
                    tft = Array(FO.Cells(i, 1), FO.Cells(i, k - 2), FO.Cells(i, k - 1))
                    .Cells(lgn, 1).Resize(, 3).Value = tft
                End If
            Next k
            For k = 27 To 87 Step 12
                If FO2.Cells(i, k) = "Oui" Then
                    lgn = lgn + 1
                    tft = Array(FO2.Cells(i, 1), FO2.Cells(i, k - 2), FO2.Cells(i, k - 1))
                    .Cells(lgn, 1).Resize(, 3).Value = tft
                End If
            Next k
        Next i
    End With
End Sub
On continue de procéder par lignes, en défilant les colonnes sur chaque ligne, comme dans la proc. initiale. En procédant par colonne, on prélèvera les mêmes valeurs mais l'ordre d'inscription ne sera pas le même.

Cordialement.
Avatar du membre
pyro206
Membre habitué
Membre habitué
Messages : 56
Appréciations reçues : 3
Inscrit le : 3 mars 2014
Version d'Excel : 2016fr

Message par pyro206 » 7 décembre 2017, 15:16

Mercuriale testxlsb.xlsb
(239.41 Kio) Téléchargé 59 fois
MFerrand

tous d'abord un très grand merci pour ce temps que vous m'avez accorder,

votre macro a fonctionné parfaitement au debut mes il analyse uniquement une feuille sur les deux ::( ::( ::( ::( ::(

je cherche la raison
:ordi3: :grr: :bof: 8-)
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 7 décembre 2017, 22:04

Bonsoir,
votre macro a fonctionné parfaitement au debut mes il analyse uniquement une feuille sur les deux ::( ::( ::( ::( ::(

je cherche la raison
Tu es tombé sur mon interruption repas et quelques autres activités accessoires... je vois maintenant ton post.
Pas de mystère sur le problème que tu soulèves : il n'y a aucun Oui sur la feuille GLOBAL, donc rien n'est extrait, logique ! :)

Ayant vu ton fichier, je vais te faire une nouvelle version : pour conserver l'en-tête sur TEST et effacer les données antérieures, faire partir les boucles de la ligne 4, la première ligne de données sur tes feuilles, et opérer avec un tableau global résultats. Ce devrait être plus rapide...

a+

edit : et traiter une feuille après l'autre, parce que le nombre de lignes n'est pas le même !
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message