VBA: copie de ligne si contenue d'une colonne = 0

zored

XLDnaute Nouveau
Bonjour,

Après quelques recherche je suis tombé sur 2 sujets intéressant, je cherchais à (comme le titre l'indique) copier des lignes d'une feuille vers une autre, si au moins unedes cellule de la ligne est = à 0 ou est vide

En effet, je dois enfaite relever le nombre de "lignes" en anomalies suivant les critères suivants:
1393421725-sisi-excel.png


Le problème est qu'un OT contient 10 colonnes, donc il m'est impossible de compter exactement le nombre d'OT en anomalie, car un OT pourra en contenir plusieurs (valeur de colonne = à 0 ou vide) :rolleyes:

Je cherche donc un code VBA pour copier chaque ligne dont au moins une des colonnes est = à zéro ou est vide

Je suis tombé sur ces sujets:

copier/coller certaines lignes en fonction d'un critère : Forum d'entraide : Bureautique - Astuces-Internet : Les forums
et
Exporter lignes d'une feuilles selon critère vers une autre : Forum d'entraide : Bureautique - Astuces-Internet : Les forums

Toutefois je n'ai pas réussit pour le moment à faire fonctionner les 2 exemples données dans les sujets ci dessus
Je vous joint un fichier modèle / exemple, je n'ai obtenue que des erreurs de compilation...

Merci d'avance à quiconque se donnerait la peine de m'aider :)

Cordialement,
H.
 

Pièces jointes

  • Exemple 1.0.xlsx
    13.6 KB · Affichages: 57
  • Exemple 1.0.xlsx
    13.6 KB · Affichages: 62
  • Exemple 1.0.xlsx
    13.6 KB · Affichages: 56

sousou

XLDnaute Barbatruc
Re : VBA: copie de ligne si contenue d'une colonne = 0

bonsoir
Voici le code que je te propose à mettre dans un module

Public Const nbcol = 10
Sub deb()
Set Destination = Sheets("test").Range("a3")
With Sheets("extraction")
Set zone = .Range(.Cells(4, 2), .Cells(.Cells(4, 2).End(xlDown).Row, nbcol + 2))

End With
n = 0
For Each lg In zone.Rows
For Each col In lg.Columns
If col = "" Then
lg.Copy Destination.Offset(n, 0)
n = n + 1

Exit For
End If
Next
Next
End Sub
 

zored

XLDnaute Nouveau
Re : VBA: copie de ligne si contenue d'une colonne = 0

Bonsoir joss56, sousou

J'ai tester vos 2 idées, mais cela n'a malheureusement pas fonctionné :(
n = n + 1 apparait en jaune, après arrêt (avec echap) car excel avait +/- planter, en ayant fait le test sur le fichier exemple
Je teste d'autres moyens de mon côté

EDIT: votre formule fonctionne en revanche elle a durée environ 15minutes pour s'exécuter, y aurait-il possibilité de la racourcir ? je vais également tester la formule de PAF ci dessous



Cordialement,
H.
 
Dernière édition:

Paf

XLDnaute Barbatruc
Re : VBA: copie de ligne si contenue d'une colonne = 0

Bonsoir à tous,

une macro à essayer. On masque les lignes non anomalie, on copie celles qui restent et on réaffiche les lignes masquées.

Code:
Sub zored()
Dim WS1 As Worksheet, WS2 As Worksheet, DerLig As Long, DebLig As Byte, i As Long

Set WS1 = Worksheets("Extraction")
Set WS2 = Worksheets("test")
DebLig = 4 'ligne début tableau
DerLig = WS1.Range("B" & Rows.Count).End(xlUp).Row

'masquage des lignes non anomalies
For i = DebLig To DerLig
    If Application.CountIf(WS1.Range(WS1.Cells(i, 3), WS1.Cells(i, 12)), ">0") = 9 Then
        WS1.Rows(i).EntireRow.Hidden = True
    End If
Next
'copie des lignes  affichées
WS1.Range("B4:L" & DerLig).SpecialCells(xlCellTypeVisible).Copy WS2.Range("A3")

' "démasquage des lignes
WS1.Rows("4:" & DerLig).EntireRow.Hidden = False
End Sub

A+
 
Dernière édition:

zored

XLDnaute Nouveau
Re : VBA: copie de ligne si contenue d'une colonne = 0

Bonjour Paf,

Merci je vais tester :)

je reviens vers vous après

EDIT: ça fonctionne, super rapide (instantané) au TOP :cool:

EDIT2: enfaite cela ne fonctionne pas, si je mets la ligne 2 en non anomalie (comme la troisième), il ne me la copie pas
EDIT3: j'ai changer le début de mon tableau de "4" à "2" et maintenant ça me copie tout le contenue de mon tableau (anomalie ou pas lol :D )

Sub zored()
Dim WS1 As Worksheet, WS2 As Worksheet, DerLig As Long, DebLig As Byte, i As Long

Set WS1 = Worksheets("Extraction")
Set WS2 = Worksheets("test")
DebLig = 2 'ligne début tableau => j'ai mis 2 à la place de 4
DerLig = WS1.Range("B" & Rows.Count).End(xlUp).Row

'masquage des lignes non anomalies
For i = DebLig To DerLig
If Application.CountIf(WS1.Range(WS1.Cells(i, 3), WS1.Cells(i, 12)), ">0") = 10 Then
WS1.Rows(i).EntireRow.Hidden = True
End If
Next
'copie des lignes affichées
WS1.Range("B2:L" & DerLig).SpecialCells(xlCellTypeVisible).Copy WS2.Range("A3") 'j'ai mis B2 à cet endroit

' "démasquage des lignes - j'ai remis 2 également aussi
WS1.Rows("B2:" & DerLig).EntireRow.Hidden = False
End Sub



Merci beaucoup à tous :eek::)


Cordialement
H.
 
Dernière édition:

sousou

XLDnaute Barbatruc
Re : VBA: copie de ligne si contenue d'une colonne = 0

Bonjour.
Le tableau d'extraction n'était pas au même endroit d'où le dysfonctionnement.
Voici le module intégré à l'exemple
 

Pièces jointes

  • Exemple 1.0.1.xlsm
    43.8 KB · Affichages: 56

Paf

XLDnaute Barbatruc
Re : VBA: copie de ligne si contenue d'une colonne = 0

Re,

en refaisant des tests, effectivement il y a un souci:
en utilisant Application.CountIf(WS1.Range(WS1.Cells(i, 3), WS1.Cells(i, 12)), ">0 ")
si les cellules contiennent des chiffre >=0 elles sont prises en compte, par contre ne sont pas prises celles contenant du texte (colonne E)

en utilisant Application.COUNTA... toutes les cellules sont prises en compte, y compris si =0.

Une solution passer par une boucle testant les lignes. Je réfléchis.

A+
 

Paf

XLDnaute Barbatruc
Re : VBA: copie de ligne si contenue d'une colonne = 0

Re,

en faisant un mix de Application.CountIf et Application.COUNTA on arrive à ça qui fonctionne:

Code:
Private Sub CommandButton1_Click()
Dim WS1 As Worksheet, WS2 As Worksheet, DerLig As Long, DebLig As Byte, i As Long
Dim Zero As Byte, NonVide As Byte
Set WS1 = Worksheets("Extraction")
Set WS2 = Worksheets("test")
DebLig = 4 'ligne début tableau
DerLig = WS1.Range("B" & Rows.Count).End(xlUp).Row

'masquage des lignes non anomalies
For i = DebLig To DerLig
    Zero = Application.CountIf(WS1.Range(WS1.Cells(i, 3), WS1.Cells(i, 12)), "=0")
    NonVide = Application.CountA(WS1.Range(WS1.Cells(i, 3), WS1.Cells(i, 12)))
    
    If Zero = 0 And NonVide = 10 Then
        WS1.Rows(i).EntireRow.Hidden = True
    End If
Next
'copie des lignes  affichées
WS1.Range("B" & DebLig &":L" & DerLig).SpecialCells(xlCellTypeVisible).Copy WS2.Range("A3")

' "démasquage des lignes
WS1.Rows(DebLig & ":" & DerLig).EntireRow.Hidden = False
End Sub

Attention le tableau commence en B4 sur ce code; juste changer la valeur de DebLig pour modifier

Si le tableau venait à s'étoffer en colonnes, il faudrait adapter If Zero = 0 And NonVide = 10 Then 10 est le nombre de colonnes testées

A+
 
Dernière édition:

zored

XLDnaute Nouveau
Re : VBA: copie de ligne si contenue d'une colonne = 0

Bonjour,

Super merci cela fonctionne :) :) j'avais toutefois quelques points à aborder avec vous si vous le voulez bien


1.
Est - il possible de préciser quelle colonnes ne doivent pas être vide ou = à 0 ?
Auquel cas qu'il ne copie que les lignes où ces colonnes seraient vides (je vous ai joint un fichier, voir l'onglet TEST2 où sont en jaunes les données à controler (si elles ne sont pas vide ou = à 0)

2.
actuellement les lignes n'étant pas en anomalies sont copiés dans une autre feuille(dont aucunes des paramètres sensibles n'est en erreur (qui ne doivent pas être = à 0 ou vide))
Est il possible de faire l'inverse ? qu'il ne me copie que les lignes dont au moins une des colonnes contenant une donnée sensible est vide ou égale à 0

3.
existerait il un moyen de noter automatiquement quelles colonnes (de données sensibles) sont vides (de copier l'entête de la colonne dans une case à la fin de ma ligne, comme une remarque par exemple, et d'y indiquer quelles sont les colonnes vides)
par exemple, la quantité, ou le poids ou la distance...

D'avance je vous remercie je sais que j'en demande peut être beaucoup... :(
N'hésitez pas à me dire si quelque chose n'est pas réalisable, je suis en pleine recherche je vous tiens au courant si je trouve quelque chose

Bien cordialement,
H.
 

Pièces jointes

  • Exemple 1.0.1(1)2.xlsm
    48.8 KB · Affichages: 47
Dernière édition:

Paf

XLDnaute Barbatruc
Re : VBA: copie de ligne si contenue d'une colonne = 0

re,
Si c'est à moi que s'adresse le post #11
1)l'utilisation de Application.CountIf et Application.COUNTA permettait en répondant au problème de simplifier le code.
si ce n'est plus l'ensemble des colonnes qu'il faut tester, il faut revoir complétement le code
2) actuellement les lignes n'étant pas en anomalies sont copiés
Le code fourni ne copie que les lignes en anomalie
3.existerait il un moyen de noter automatiquement quelles colonnes (de données sensibles) sont vides (de copier l'entête de la colonne dans une case ....
les demandes qui évoluent au fil de l'avancement du code, ce sera sans moi !

Bonne suite
 

zored

XLDnaute Nouveau
Re : VBA: copie de ligne si contenue d'une colonne = 0

Si c'est à moi que s'adresse le post #11
1)l'utilisation de Application.CountIf et Application.COUNTA permettait en répondant au problème de simplifier le code.
si ce n'est plus l'ensemble des colonnes qu'il faut tester, il faut revoir complétement le code
2) actuellement les lignes n'étant pas en anomalies sont copiés
Le code fourni ne copie que les lignes en anomalie
3.existerait il un moyen de noter automatiquement quelles colonnes (de données sensibles) sont vides (de copier l'entête de la colonne dans une case ....
les demandes qui évoluent au fil de l'avancement du code, ce sera sans moi !

Bonjour Paf,

merci de votre retour :D , j'ai trouvé un moyen pour mon 1. :

pour trouver les lignes en anomalies, j'ai créer une colonne "Anomalie" où je fais apparaître un 1 si une des colonnes ciblées (données sensibles) de ma ligne contient 0 ou "", si tout est correct il y a zéro qui apparaît, je n'ai ensuite plus qu'à faire la somme des 1 pour obtenir mon nombre exact d'anomalies (le problème qui était de compter le nombre exact d'anomalie vu qu'un OT peut en contenir plusieurs..)
=> je cherche actuellement un moyen de copier les lignes dont la colonne anomalie contient 1 (ça devrait être plus simple de cette manière)

concernant le 2. excusez moi mais je confirme que le code me copie la ligne qui n'est pas en anomalie :( ou alors je suis un peu con je sais pas :eek:

et le troisième point, je laisse tombé :rolleyes: trop compliqué :(

Merci beaucoup pour votre aide et vos conseils :), même si vous ne souhaitez plus m'aider à cause de mes demandes crescendo, je vous remercie quand même pour votre soutient et le temps que vous y avez passer :)

Cordialement,
H.
 

Discussions similaires

Statistiques des forums

Discussions
312 231
Messages
2 086 440
Membres
103 209
dernier inscrit
MIKA33260