Excel VBA création tableau sous conditions
Résolu
Dario
-
pijaku Messages postés 13513 Date d'inscription Statut Modérateur Dernière intervention -
pijaku Messages postés 13513 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
je me permets à mon tour d'exposer mon problème.
Je travaille sur un fichier excel composé de 6 feuilles. Chaque feuille correspond à un sous ensemble d'une machine.
Chaque sous ensemble est composé de pièces (une pièce par ligne) et chaque pièce a 5 paramètres (colonne 1=désignation; colonne 2= n°; colonne 3 = statut; colonne 4 = kilométrage).
Je cherche à présent à créer une autre feuille "entretien" avec la démarche suivante
- pour chaque sous-ensemble, sélectionner les pièces dont le statut est "HS"
- insérer chaque pièce hs dans la feuille "entretien" mais uniquement avec les paramètres désignation, n° et kilométrage (colonnes A, B et D).
J'ai essayé toutes sortes de méthode disons "bricolés" mélangeant, des boucles Si, Tant que etc mais je ne m'en sort pas.
Si une personne plus experte que moi aurait la gentillesse de me mettre sur la voie je lui en serait très reconnaissant.
D'avance merci beaucoup.
Dario
je me permets à mon tour d'exposer mon problème.
Je travaille sur un fichier excel composé de 6 feuilles. Chaque feuille correspond à un sous ensemble d'une machine.
Chaque sous ensemble est composé de pièces (une pièce par ligne) et chaque pièce a 5 paramètres (colonne 1=désignation; colonne 2= n°; colonne 3 = statut; colonne 4 = kilométrage).
Je cherche à présent à créer une autre feuille "entretien" avec la démarche suivante
- pour chaque sous-ensemble, sélectionner les pièces dont le statut est "HS"
- insérer chaque pièce hs dans la feuille "entretien" mais uniquement avec les paramètres désignation, n° et kilométrage (colonnes A, B et D).
J'ai essayé toutes sortes de méthode disons "bricolés" mélangeant, des boucles Si, Tant que etc mais je ne m'en sort pas.
Si une personne plus experte que moi aurait la gentillesse de me mettre sur la voie je lui en serait très reconnaissant.
D'avance merci beaucoup.
Dario
A voir également:
- Excel VBA création tableau sous conditions
- Tableau word - Guide
- Trier un tableau excel - Guide
- Imprimer tableau excel sur une page - Guide
- Liste déroulante excel - Guide
- Tableau ascii - Guide
2 réponses
Bonjour,
Il te faut :
1- parcourir toutes les feuilles du classeur:
1a- exclure la feuille nommée "Entretien" :
ou plus simplement :
2- on parcourt les colonnes C (toujours sur chaque feuille...)
2a- en déterminant au préalable la dernière ligne remplie de la colonne C :
2b- en bouclant sur toutes les lignes de cette colonne C, si on trouve "HS" alors...
3- Si on a "HS" en C on copie colle les colonnes A, B et D en feuille "Entretien", colonnes A, B, C, dans la première ligne vide
3a- première ligne vide colonne A feuille Entretien :
Ce qui nous donne un code :
Si beaucoup de données (+ de 5000 / feuille), dis le ...
Il te faut :
1- parcourir toutes les feuilles du classeur:
Dim Wsh As WorkSheet For Each Wsh In ThisWorkBook.WorkSheets
1a- exclure la feuille nommée "Entretien" :
If Wsh.Name = "Entretien" Then 'on fait rien Else 'ici le code de "on fait quelque chose"
ou plus simplement :
If Wsh.Name <> "Entretien" Then
2- on parcourt les colonnes C (toujours sur chaque feuille...)
2a- en déterminant au préalable la dernière ligne remplie de la colonne C :
Dim DernLigne As Long
DernLigne = Wsh.Range("C" & Rows.Count).End(xlUp).Row
2b- en bouclant sur toutes les lignes de cette colonne C, si on trouve "HS" alors...
Dim Lig As Long
For Lig = 2 To DernLigne
If Wsh.Cells(Lig, 3).Value = "HS" Then
'blabla
End If
Next
3- Si on a "HS" en C on copie colle les colonnes A, B et D en feuille "Entretien", colonnes A, B, C, dans la première ligne vide
3a- première ligne vide colonne A feuille Entretien :
Dim LigVide As Long
With Sheets("Entretien")
LigVide = .Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row
End With
Wsh.Range("A" & Lig).Copy Sheets("Entretien").Range("A" & LigVide)
Wsh.Range("B" & Lig).Copy Sheets("Entretien").Range("B" & LigVide)
Wsh.Range("D" & Lig).Copy Sheets("Entretien").Range("C" & LigVide)
Ce qui nous donne un code :
Dim Wsh As Worksheet
Dim DernLigne As Long
Dim Lig As Long
Dim LigVide As Long
For Each Wsh In ThisWorkbook.Worksheets
If Wsh.Name <> "Entretien" Then
DernLigne = Wsh.Range("C" & Rows.Count).End(xlUp).Row
For Lig = 2 To DernLigne
If Wsh.Cells(Lig, 3).Value = "HS" Then
With Sheets("Entretien")
LigVide = .Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Row
End With
Wsh.Range("A" & Lig).Copy Sheets("Entretien").Range("A" & LigVide)
Wsh.Range("B" & Lig).Copy Sheets("Entretien").Range("B" & LigVide)
Wsh.Range("D" & Lig).Copy Sheets("Entretien").Range("C" & LigVide)
End If
Next Lig
End If
Next Wsh
Si beaucoup de données (+ de 5000 / feuille), dis le ...
merci beaucoup pour ces indications.
Je vais essayer et revenir vers le forum pour mon verdict (réussi ou problèmes).
Mes feuilles font maximum 100 lignes et j'ai 6 feuilles à synthétiser.
Encore merci!
Cdlt.
Grand merci pour ton aide précieuse.
J'ai essayé en ajoutant .Value et une égalité mais ça ne fonctionne pas...
Merci.