Copier lignes d'1 autre classeur si condition a et condition b
Résolu
Nicolas
-
Nicolas -
Nicolas -
Bonjour,
N'ayant jamais programmer en VBA sans réel but autre que de m'amuser à colorier une case ou a copier une cellule, j'ai un peu du mal à mettre en code ce que je souhaite faire.
Je me permets donc de faire appel à vous et vais, pour ce faire, essayer d'être le plus clair possible quant à ma demande :
1. J'ai un premier fichier Excel qui me sert de BD.
2. J'ai un second fichier Excel dans lequel j'aimerai afficher les données selon deux conditions.
Plus précisément :
- Si lors de la lecture de la case dans la BD, Di = "NA" alors on passe à la lecture de la ligne suivante.
- Si lors de la lecture de la case dans la BD, Di <> "NA" alors on regarde, toujours dans la BD, si Fi ou Gi ou Hi sont coloriées en rouge. Si VRAI alors, on copie la plage "Ai : Hi" de la BD et on la colle dans la dernière plage vide du second fichier et ensuite on passe à la lecture de la ligne suivante de la BD.
Pour éviter des soucis d'addressage, le fichier de BD initial étant sur un serveur, j'essaye d'abord de tester la chose entre 2 feuilles d'un même fichier.
Voilà le bout de code (je n'ai essayé de coder que la dernière partie de ma requête) que j'ai actuellement en ayant glané quelques infos par-ci, par-là...
Sub Bouton4_Cliquer()
Dim nb_lignes As Integer
Sheets("feuil1").Activate
nb_lignes = WorksheetFunction.CountA(Range("A:A")) 'Equivalent de la fonction NBVAL dans Excel. Permet de prendre en compte automatiquement le nombre de ligne utilisées.
For i = 4 To nb_lignes 'nb_lignes
If Sheets("feuil1").Range("F" & i).Interior.Color = 255 Or Sheets("feuil1").Range("G" & i).Interior.Color = 255 Or Sheets("feuil1").Range("H" & i).Interior.Color = 255 Then 'Vérifie si une des cases est rouge
Range("A" & i & ":H" & i).Copy 'copie la plage
Sheets("feuil2").Activate 'active la feuille dans laquelle Excel va aller coller les données
'Range("A" & i & ":H" & i).End(xlUp).Offset(1).Select 'recherche la première plage vide de la feuille feuil2
ActiveSheet.Paste 'colle les données
Application.CutCopyMode = False '"sort" du coller
End If
Next
End Sub
N'ayant jamais programmer en VBA sans réel but autre que de m'amuser à colorier une case ou a copier une cellule, j'ai un peu du mal à mettre en code ce que je souhaite faire.
Je me permets donc de faire appel à vous et vais, pour ce faire, essayer d'être le plus clair possible quant à ma demande :
1. J'ai un premier fichier Excel qui me sert de BD.
2. J'ai un second fichier Excel dans lequel j'aimerai afficher les données selon deux conditions.
Plus précisément :
- Si lors de la lecture de la case dans la BD, Di = "NA" alors on passe à la lecture de la ligne suivante.
- Si lors de la lecture de la case dans la BD, Di <> "NA" alors on regarde, toujours dans la BD, si Fi ou Gi ou Hi sont coloriées en rouge. Si VRAI alors, on copie la plage "Ai : Hi" de la BD et on la colle dans la dernière plage vide du second fichier et ensuite on passe à la lecture de la ligne suivante de la BD.
Pour éviter des soucis d'addressage, le fichier de BD initial étant sur un serveur, j'essaye d'abord de tester la chose entre 2 feuilles d'un même fichier.
Voilà le bout de code (je n'ai essayé de coder que la dernière partie de ma requête) que j'ai actuellement en ayant glané quelques infos par-ci, par-là...
Sub Bouton4_Cliquer()
Dim nb_lignes As Integer
Sheets("feuil1").Activate
nb_lignes = WorksheetFunction.CountA(Range("A:A")) 'Equivalent de la fonction NBVAL dans Excel. Permet de prendre en compte automatiquement le nombre de ligne utilisées.
For i = 4 To nb_lignes 'nb_lignes
If Sheets("feuil1").Range("F" & i).Interior.Color = 255 Or Sheets("feuil1").Range("G" & i).Interior.Color = 255 Or Sheets("feuil1").Range("H" & i).Interior.Color = 255 Then 'Vérifie si une des cases est rouge
Range("A" & i & ":H" & i).Copy 'copie la plage
Sheets("feuil2").Activate 'active la feuille dans laquelle Excel va aller coller les données
'Range("A" & i & ":H" & i).End(xlUp).Offset(1).Select 'recherche la première plage vide de la feuille feuil2
ActiveSheet.Paste 'colle les données
Application.CutCopyMode = False '"sort" du coller
End If
Next
End Sub
A voir également:
- Copier lignes d'1 autre classeur si condition a et condition b
- Excel cellule couleur si condition texte - Guide
- Excel condition ou - Guide
- Comment copier une vidéo youtube - Guide
- Super copier - Télécharger - Gestion de fichiers
- Copier un disque dur sur un autre - Guide
2 réponses
Bonjour
je n'ai pas vu la condition en colonne D <>"NA"...
La couleur est- elle saisie manuellement ou par mise en forme conditionnelle ?
recopie t' on le format rouge dans le fichier "cible" ?
Michel
je n'ai pas vu la condition en colonne D <>"NA"...
La couleur est- elle saisie manuellement ou par mise en forme conditionnelle ?
recopie t' on le format rouge dans le fichier "cible" ?
Michel
Bonjour
ouf! tout ces imbrications avec des IF, des AND et des OR pas de la tarte pour commencer la semaine ! ==> un peu moins de cheveux !
nota: j'ai considéré qu'il y a vait du texte dans la cellule A3 feuil2
dans cette feuille2 a toi de faire les MEFC comme les bordures, couleurs etc
ouf! tout ces imbrications avec des IF, des AND et des OR pas de la tarte pour commencer la semaine ! ==> un peu moins de cheveux !
nota: j'ai considéré qu'il y a vait du texte dans la cellule A3 feuil2
dans cette feuille2 a toi de faire les MEFC comme les bordures, couleurs etc
Option Explicit
'------------------------------------------------------
Sub recopier_si()
Dim Derlig As Integer, T_ok, Cptr As Integer, Col As Byte, T_out, Idx As Integer
Dim Ligvid As Integer
Application.ScreenUpdating = False 'fige l'écran: confort et rapidité
With Sheets(1)
'--------mémorisation tableaux
Derlig = Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
T_ok = .Range("A4:H" & Derlig)
ReDim T_out(1 To UBound(T_ok), 1 To 8)
'-------récolte valeurs si conditions remplies
For Cptr = 1 To UBound(T_ok)
'd'après mise en forme conditionnelle
'si 'D<>"NA" et A <>0 et _
G=5 ou _
F="" ou _
H="" et A<>"NA" et C<>1 et E<>0 et E<>"PF" et E <>"I"
If T_ok(Cptr, 4) <> "NA" Then
If T_ok(Cptr, 1) <> 0 Then
If T_ok(Cptr, 7) = 5 Or T_ok(Cptr, 6) = "" Or _
T_ok(Cptr, 8) = "" And T_ok(Cptr, 1) <> "NA" And T_ok(Cptr, 3) <> 1 And _
T_ok(Cptr, 5) <> 0 And T_ok(Cptr, 5) <> "PF" And T_ok(Cptr, 5) <> "I" Then
'mémorisation valeurs A à H
Idx = Idx + 1
For Col = 1 To 8
T_out(Idx, Col) = T_ok(Cptr, Col)
Next Col
End If
End If
End If
Next Cptr
End With
'---------restitution
With Sheets(2)
Ligvid = .Columns("A").Find("", .Range("A3")).Row
.Cells(Ligvid, "A").Resize(UBound(T_out), 8) = T_out
.Activate
End With
End Sub
Bonjour,
Merci pour ce bout de code.
J'ai fait un copier-coller pour tester avec le fichier que j'ai envoyé et quand je le lance (via clic sur un bouton) j'ai l'erreur suivante qui apparaît :
"Erreur d'exécution '91' : variable objet ou variable de bloc With non définie" .
Quand je clic sur Débogage, il me sélectionne la ligne suivante :
"Derlig = Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row"
Du coup, je me suis rappelé avoir lu qu'il fallait éviter de définir plusieurs variables en même temps et j'ai donc remplacé la première ligne de définition de variable par celle-ci "Dim Derlig As Integer, T_ok As Integer, Cptr As Integer, Col As Byte, T_out As Integer, Idx As Integer". Ce qui semble résoudre le problème de l'Erreur d'exécution '91'.
Par contre, j'ai une autre erreur qui est apparue (Erreur de compilation : Tableau attendu) avec la ligne suivante : "ReDim T_out(1 To UBound(T_ok), 1 To 8)"
Bàv,
Nicolas
Merci pour ce bout de code.
J'ai fait un copier-coller pour tester avec le fichier que j'ai envoyé et quand je le lance (via clic sur un bouton) j'ai l'erreur suivante qui apparaît :
"Erreur d'exécution '91' : variable objet ou variable de bloc With non définie" .
Quand je clic sur Débogage, il me sélectionne la ligne suivante :
"Derlig = Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row"
Du coup, je me suis rappelé avoir lu qu'il fallait éviter de définir plusieurs variables en même temps et j'ai donc remplacé la première ligne de définition de variable par celle-ci "Dim Derlig As Integer, T_ok As Integer, Cptr As Integer, Col As Byte, T_out As Integer, Idx As Integer". Ce qui semble résoudre le problème de l'Erreur d'exécution '91'.
Par contre, j'ai une autre erreur qui est apparue (Erreur de compilation : Tableau attendu) avec la ligne suivante : "ReDim T_out(1 To UBound(T_ok), 1 To 8)"
Bàv,
Nicolas
le piège classique
ajouter un pont devant columns("A")
Derlig = .Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
le fait du point indique que columns("A") est dans le bloc feuil1
si feuilles est active(bouton de lancement) ,la recherche fin s'éxécute sur la feuille active cad 3 et donc T_ok est défini par 4 to 3, 1 to 8 d'où erreur
Du coup, je me suis rappelé avoir lu qu'il fallait éviter de définir plusieurs variables en même temps et j'ai donc remplacé la première ligne de définition de variable par celle-ci "Dim Derlig As Integer, T_ok As Integer, Cptr As Integer, Col As Byte, T_out As Integer, Idx As Integer
bin , c'est pas ce que j'ai marqué ?
éviter de définir plusieurs variables en même temps
non cela ne gène pas mais sent le "scolaire"
ajouter un pont devant columns("A")
Derlig = .Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
le fait du point indique que columns("A") est dans le bloc feuil1
si feuilles est active(bouton de lancement) ,la recherche fin s'éxécute sur la feuille active cad 3 et donc T_ok est défini par 4 to 3, 1 to 8 d'où erreur
Du coup, je me suis rappelé avoir lu qu'il fallait éviter de définir plusieurs variables en même temps et j'ai donc remplacé la première ligne de définition de variable par celle-ci "Dim Derlig As Integer, T_ok As Integer, Cptr As Integer, Col As Byte, T_out As Integer, Idx As Integer
bin , c'est pas ce que j'ai marqué ?
éviter de définir plusieurs variables en même temps
non cela ne gène pas mais sent le "scolaire"
Ca fonctionne parfaitement ! Un tout grand merci.
Il ne me reste plus qu'à regarder tout ça de plus près histoire de comprendre le fonctionnement de chaque ligne.
Concernant les définitions de variables... Peux-tu m'expliquer pourquoi cela fonctionne correctement avec ta ligne de code "Dim Derlig As Integer, T_ok, Cptr As Integer, Col As Byte, T_out, Idx As Integer" mais avec la ligne de code suivante "Dim Derlig As Integer, T_ok As Integer, Cptr As Integer, Col As Byte, T_out As Integer, Idx As Integer" VBA m'indique une erreur (Erreur de compilation : Tableau attendu) avec la ligne suivante : "ReDim T_out(1 To UBound(T_ok), 1 To 8)" ?
Il ne me reste plus qu'à regarder tout ça de plus près histoire de comprendre le fonctionnement de chaque ligne.
Concernant les définitions de variables... Peux-tu m'expliquer pourquoi cela fonctionne correctement avec ta ligne de code "Dim Derlig As Integer, T_ok, Cptr As Integer, Col As Byte, T_out, Idx As Integer" mais avec la ligne de code suivante "Dim Derlig As Integer, T_ok As Integer, Cptr As Integer, Col As Byte, T_out As Integer, Idx As Integer" VBA m'indique une erreur (Erreur de compilation : Tableau attendu) avec la ligne suivante : "ReDim T_out(1 To UBound(T_ok), 1 To 8)" ?
T_ok est t_out sont des variables-tableaux et comportent de nombres (p;e.: 5)et des textes(pe: "NA3) et est donc un type variant.et non integer
lorqqu'on ne précise pas le typte, le compilateur le considère comme un variant
coche "résolu" si le problème est résolu;
cordialement après ce petit casse-t^te ;o)
lorqqu'on ne précise pas le typte, le compilateur le considère comme un variant
coche "résolu" si le problème est résolu;
cordialement après ce petit casse-t^te ;o)
Effectivement, dans le début de code que j'ai écrit, je n'ai pas encore abordé la condition D<>"NA", je m'étais d'abord penché sur la couleur.
La couleur dans la BD est mise en forme de manière conditionnelle. Pour ce qui est de recopier la mise en forme dans le fichier "cible" cela n'est pas nécessaire.
Je me rends compte que mon message initial n'a aucune mise en forme et n'est donc pas très lisible, j'en suis fort désolé :s
hélas!
une astuce consisterait à se baser à la valeur déclenchant la couleur par exemple couleur si >5
peut-^tre avec une copie des des formules de déclenchement
par exemple:
dans F100 =(range("E" & i)>5)*1 m^ punition pour G et H
et la prise en charge
somme(F100:G100)>=1
mais si jes formules sont les m^mes dans chaque colonne
Merci tout de même pour te réponse, je vais essayer de potasser la chose sur base de la formule de MEFC et non pas simplement sur la couleur...
pour cela:
Mettre le classeur sans données confidentielles en pièce jointe sur https://www.cjoint.com/
et coller le raccourci proposé (clic droit) dans le message de réponse
Dans l'attente
Voilà comme demandé.
http://www.cjoint.com/c/EIAquyCHw20