Insertion de ligne selon conditions
Bonjour,
J'ai un classeur dans lequel se trouve 5 onglets : A, B, C, D & Agrégation. Dans les onglets A, B, C & D j'ai 6 colonnes dans lesquelles se trouvent des données.
Ce que je souhaite faire c'est la chose suivante lorsque je clique sur le bouton "Mettre à jour les priorités": IF condition 1, condition 2 & condition 3 des onglets A, B, C & D sont set à "Yes" THEN insérer dans l'onglet Agrégation les lignes correspondantes.
J'ai ajouté un fichier dans lequel j'ai illustré mes exemples.
Merci d'avance pour votre aide.
Pablito
Bonjour,
Voici une tentative:
Le code:
Sub test()
Dim Feuille As Worksheet
Dim colDep As Integer, colFin As Integer, nbCol As Integer, numLigne As Integer
Dim Lignes As New Collection
Dim infos As Variant, tableau As Variant, agregation As Variant
Dim conditionOk As Boolean
Dim nomFeuille As String
ReDim infos(1 To 1, 1 To 2)
colDep = 2
colFin = 4
nbCol = Sheets("Agrégation").Range("A1").CurrentRegion.Columns.Count
'dimensionnement tableau final
For Each Feuille In ThisWorkbook.Worksheets
If Not Feuille.Name = "Agrégation" Then
infos(1, 1) = Feuille.Name
'initialisation tableau de la feuille
tableau = Feuille.Range("A1").CurrentRegion.Value
'boucle pour vérifier les conditions sur chaque ligne
For i = 2 To UBound(tableau, 1)
conditionOk = True
'regarde si quelque chose d'autre qu'un "oui" est présent dans les colonnes condition
For j = colDep To colFin
If Not LCase(tableau(i, j)) = "oui" Then
conditionOk = False
Exit For
End If
Next j
'si que des "oui" trouvés
If conditionOk Then
infos(1, 2) = i 'on enregistre la ligne de la feuille dans les infos
Lignes.Add infos 'on ajoute les infos à la liste de lignes avec nom de feuille et numéro de ligne
End If
Next i
End If
Next Feuille
'agrégation dans un tableau
If Lignes.Count > 0 Then
ReDim agregation(1 To Lignes.Count, 1 To nbCol)
For i = 1 To Lignes.Count
infos = Lignes(i)
numLigne = infos(1, 2)
If nomFeuille = "" Or Not infos(1, 1) = nomFeuille Then 'changement de nom de feuille et initialisation
nomFeuille = infos(1, 1)
tableau = Sheets(nomFeuille).Range("A1").CurrentRegion.Value 'initialisation du tableau pour chaque nouvelle feuille rencontrée
End If
For j = 1 To nbCol
agregation(i, j) = tableau(numLigne, j) 'copie de la ligne du tableau dans l'agrégation
Next j
Next i
End If
'export agrégation
Sheets("Agrégation").Range("A2").Resize(Lignes.Count, nbCol).Value = agregation
End SubBonjour @Ausecour,
Super merci pour cette tentative qui répond à mon besoin.
Question : Si je veux faire évoluer la condition à savoir IF "condition 1" et "condition 2" set à "Oui" AND "condition 3" set à "P1", comment je fais ? J'ai ajouté le classeur avec la MAJ.
Merci encore pour votre aide
Pablito
Bonjour,
Ah, en effet ce n'était pas prévu,
du coup j'ai préféré créer une zone pour les conditions, qu'on peut appeler ensuite dans le code, voici le résultat:
Bonjour @Ausecour,
La création du tableau de correspondance fait partie de l'exécution de cette boucle :
ligFin = Sheets("Agrégation").Range("A" & Rows.Count).End(xlUp).Row
If ligFin >= 5 Then
Sheets("Agrégation").Range("A5", "F" & ligFin) = ""
End IfY a t-il un autre moyen ? Car j'essaie d'avoir un template dans l'onglet "Agrégation" qui est celui de la version 1 et non la version avec la zone de création.
Merci
Bonjour,
Hmm pour que le code s'adapte facilement il faudrait quand même stocker quelque part les conditions, afin qu'on ait pas à aller dans le code à chaque fois, après c'est un avis, on peut toujours masquer les lignes qui servent à préciser les conditions, ou alors les mettre sur une autre feuille, ou dans le pire des cas, mettre les conditions directement dans le code.