Copier lignes d'1 autre classeur si condition a et condition b

Résolu/Fermé
Nicolas - 25 sept. 2015 à 12:03
 Nicolas - 28 sept. 2015 à 13:42
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


A voir également:

2 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 25/09/2015 à 14:32
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
0
Bonjour,

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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303 > Nicolas
25 sept. 2015 à 16:48
tes cellules rouge étant des MEFC la condition ne sera pas la couleur mais la formule ou la valeur qui cause la mise en couleur...
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
0
Ha, ça va compliquer les choses ça parce que si la cellule est rouge c'est obligatoirement parce qu'elle est vide mais si la cellule est vide elle ne sera pas obligatoirement en rouge...

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...
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303 > Nicolas
25 sept. 2015 à 17:09
Mets ton classeur source en pièce jointe, j'essaierai de jeter un oeil demain

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
0
Nicolas > michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023
26 sept. 2015 à 18:21
Bonjour,

Voilà comme demandé.
http://www.cjoint.com/c/EIAquyCHw20
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
28 sept. 2015 à 09:42
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
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
0
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
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303 > Nicolas
Modifié par michel_m le 28/09/2015 à 11:32
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"
0
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)" ?
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303 > Nicolas
28 sept. 2015 à 12:11
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)
0
Ok, merci bien pour l'explication.
0