Copier lignes d'1 feuille à une autre ss cond

Résolu/Fermé
Pat 59 - 24 juil. 2009 à 10:58
Pat_59 Messages postés 26 Date d'inscription vendredi 24 juillet 2009 Statut Membre Dernière intervention 30 juillet 2009 - 30 juil. 2009 à 18:51
Bonjour,

Je suis novice en VBA et je cherche à copier coller des lignes de feuilles différentes (8 excactements) sur une autre feuille (recap en quelque sorte) lorsqu'une cellule sur une de ces lignes est différentes de 0.
Je ne sais pas si j'ai été assez clair?

Pour être un peu plus clair: j'ai un classeur qui me donne des factures en fonction des bons de livraison. Le probléme est que je peus avoir plusieurs livraisons dans un mois et je souhaite n'avoir q'une seule facture par mois.
Voila, pas facil d'expliquer clairement mon probléme, j'ai maintenant besoin de l'aide de personnes plus expérimentées que moi en VBA.

Merci d'avance
A voir également:

55 réponses

ben13.51 Messages postés 112 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 11 janvier 2012 7
24 juil. 2009 à 11:25
Salut
Tu peu faire une recherche dans ta colonne mois et copier coller la ligne correspondante au mois souhaité:
Deux solution soit tu applique la méthode de comparaison de colonne décrite dans la discussion suivante
https://forums.commentcamarche.net/forum/affich-13501092-vba-excel-2k-comparaison#8#dernier

Sinon je te donne ma méthode perso
Dim NumMois As Integer
'NumMois est la variable qui correspond à ton mois. si il est écrit en texte change integer par string

For j = 1 to 8
For i = x to y
'x = numéro de la première ligne (en générale 2 si tu à des titres à tes colonne)
'y le numéro de la dernière
Val=2
if sheeets(j).cells(i,N)=NumMois then 'N doit être remplacé par le numéro de la colonne qui contient le mois de la facture (A=1, B=2...)

Sheets(j).rows(i).copy
Sheets("recap").select
Shetts("recap").rows(Val).select
Activesheet.paste
Val=val+1
end if
next i
next j

Pour que ça fonctionne il faut que tes huit feuilles dans lesquelles tu cherche soit les huits première feuille de ton classeur, sinon change les valeurs de "for j = 1 to 8". dans tous les cas il faut que ces huits feuille se suivent.
Si tu les à renomées tu peu voir leur numéro dans la fenètre VBA
0
Pat_59 Messages postés 26 Date d'inscription vendredi 24 juillet 2009 Statut Membre Dernière intervention 30 juillet 2009
24 juil. 2009 à 16:02
Merci d'avoir répondu!
Par contre, je pense ne pas avoir était clair dans mon explication.
En fait chaqu'une des huit feuilles "facture 1" à 8, reprend un des 8 bons de livraison. Dans chacune de ces factures tout le matériel est listé avec la quantité loué et donc le prix.
Ensuite ce que je cherche à faire maintenant, c'est créer une autre feuille et insérer dans celle-ci chaque lignes avec le nom du matériel et le montant de la location pour le mois. Car dans un même mois, il est possible d'emprunter le même matériel mai durant des périodes différentes.

Voici comment sont mes factures:

Désignation Px location/jours Type Quantité Nbre jours Total

J'espére que ça va t'aider à comprendre mon probléme.

Merci d'avance
0
Pat_59 Messages postés 26 Date d'inscription vendredi 24 juillet 2009 Statut Membre Dernière intervention 30 juillet 2009
24 juil. 2009 à 16:19
J'ai réussi à faire deux trois trucs grâce à ta méthode par contre les lignes se colle les unes sur les autres au lieu de se copier à la suite les unes aprés les autre.

Pourrais tu m'aider?

Merci d'avance
0
ben13.51 Messages postés 112 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 11 janvier 2012 7
24 juil. 2009 à 16:25
Essaye de déplacer l'instruction val=2 au dessus de For j=1 to 8
ça devrai éviter que ça se superpose
N'oublie pas le compteur d'incrémentation Val=Val+1 (à la même place que dans l'exemple)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pat_59 Messages postés 26 Date d'inscription vendredi 24 juillet 2009 Statut Membre Dernière intervention 30 juillet 2009
24 juil. 2009 à 16:41
C'est bon les lignes ne se superposent plus. Par contre moi je veux que seulmen les lignes ou la cellule de la colonne 10 est différente de 0 se copient. Là je c pas tp ce que ça fais parce que ça me copi des lignes vides aussi?

Voila ce que j'ai modifié à partir de ta méthode:

Dim val As Integer
val = 14
For j = 12 To 18
For i = 14 To 46
If Sheets(j).Cells(i, 10) <> 0 Then
Sheets(j).Rows(i).Copy
Sheets("FACTURE").Select
Sheets("FACTURE").Rows(val).Select
ActiveSheet.Paste
val = val + 1
End If
Next i
Next j

Et encore merci pour ton aide
0
ben13.51 Messages postés 112 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 11 janvier 2012 7
24 juil. 2009 à 17:08
est-ce que tu as des cellules vides dans ta colonne 10
Parce que je pense qu'excel considèrent que "" (cellule vide) est différent de 0
Autre idée
est-ce que toute tes feuilles sont remplies jusqu'à la ligne 46?
0
Salut,
Oui j'ai des cellules vides entre ligne 14 et 46, en fait j'ai même des lignes entiérement vide!!!
je dois les supprimer?
Ou mettre 0 dans ces cellules la et le mettre en blanc?
0
Pat_59 Messages postés 26 Date d'inscription vendredi 24 juillet 2009 Statut Membre Dernière intervention 30 juillet 2009
27 juil. 2009 à 14:09
J'ai encore une question!!
Esct-ce qu'il serait possible de copier ces lignes dans le même ordres, c-a-d copier ligne 14 de la facture 1 si cellule différente de 0, ensuite pareil L14 de la facture 2,..., puis copier L15 de la facture 1, L15 de la facture 2,...

Est-ce possible?
Si quelqu'un pouvait m'aider, ça serait vraiment bien et ça m'aiderai beaucoup!!!!

Merci d'avance
0
jjsteing Messages postés 1669 Date d'inscription vendredi 11 mai 2007 Statut Contributeur Dernière intervention 21 mai 2012 181
27 juil. 2009 à 14:17
0
Pat_59 Messages postés 26 Date d'inscription vendredi 24 juillet 2009 Statut Membre Dernière intervention 30 juillet 2009
27 juil. 2009 à 14:53
C'est pas vraiment cque jvoudrais, en fait ça serai plutot ça:

Si j'ai:
facture 1
0
Pat_59 Messages postés 26 Date d'inscription vendredi 24 juillet 2009 Statut Membre Dernière intervention 30 juillet 2009
27 juil. 2009 à 15:03
C'est pas vraiment cque jvoudrais, en fait ça serai plutot ça:

Si j'ai:
facture 1 h1=1 h2=2 h3=3
facture 2 h1=4 h2=5 h3=6
facture 3 h1=7 h2=8 h3=9
facture 4 h1=10 h2=11 h3=12
facture 5 h1=13 h2=14 h3=15
facture 6 h1=16 h2=17 h3=18
facture 7 h1=19 h2=20 h3=21
facture 8 h1=22 h2=23 h3=24

ça donneré dans la feuille facture:
h1=1 h2=4 h3=7 h4=10 h5=13 h6=16 h7=19 h8=22
h9=2 h10=5 ... ... ... ... ... h16=23 h17=3 h18=6 ... ... ... ... ... h24=24
0
jjsteing Messages postés 1669 Date d'inscription vendredi 11 mai 2007 Statut Contributeur Dernière intervention 21 mai 2012 181
27 juil. 2009 à 15:18
ben si c'est du meme style, sauf qu au lieu de travailler avec la colonne a (cells(x,1) tu travaille sur la colonne h qui vaut 8
0
ben13.51 Messages postés 112 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 11 janvier 2012 7
28 juil. 2009 à 09:14
salut
je sais pas si ce que t'as montré jjsteing t'as montré a pu résoudre ton problème
Sinon je répond à tes question
pour le problème des lignes vides tu n'as qu'à mettre
If Sheets(j).Cells(i, 10) <> 0 OR Sheets(j).Cells(i, 10) <> "" Then ...

Si tu veux que la ligne 14 feuil2 se copie juste après la ligne 14 Feuil 1 il faut inverser les boucles i et j

c'ast à dire:

Dim val As Integer
val = 14

For i = 14 To 46 inversion
For j = 12 To 18


If Sheets(j).Cells(i, 10) <> 0 Then
Sheets(j).Rows(i).Copy
Sheets("FACTURE").Select
Sheets("FACTURE").Rows(val).Select
ActiveSheet.Paste
val = val + 1
End If

Next j
Next i
inversion
0
Pat_59 Messages postés 26 Date d'inscription vendredi 24 juillet 2009 Statut Membre Dernière intervention 30 juillet 2009
29 juil. 2009 à 09:03
Salut,
Tout d'abord merci de ton aide, ça fonctionne bien.
Le probléme maintenant est que en recopiant les lignes sur ma nouvelle feuille les numéros de lignes dans mes fonctions change. Est-ce que l'on ne pourrait pas bloquer avec $ mais sans le faire cellule par cellule ou alors recopier seulement les valeurs et non les formules dans les cellules?

Merci d'avance
0
ben13.51 Messages postés 112 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 11 janvier 2012 7
29 juil. 2009 à 09:09
Effectivement si tu as des formules dans tes cellules, elles vont changer...
Pour coller seulement les valeurs dans ta feuille Facture, remplace la ligne

"Activesheet.Paste"

Par

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
0
Pat_59 Messages postés 26 Date d'inscription vendredi 24 juillet 2009 Statut Membre Dernière intervention 30 juillet 2009
29 juil. 2009 à 09:25
Super ça fonctionne.
Par contre mes lignes vides se recopient toujours! En fait la j'ai l'impression que l'instruction: If Sheets(j).Cells(i, 10) <> 0 OR Sheets(j).Cells(i, 10) <> "" Then ne fonctionne pas bien car le programme copie toute les lignes.

Tu vois quelque chose qui ne va pas dans ce qui est écrit?
0
ben13.51 Messages postés 112 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 11 janvier 2012 7
29 juil. 2009 à 09:47
Oui en fait c'est normale
c'est l'opérateur OR qui ne va pas dans ce cas...
essaye avec ça peut être remplace OR par XOR et le <>"" par =""
Sheets(j).Cells(i, 10) <> 0 XOR Sheets(j).Cells(i, 10) = "" Then


Je ne suis pas sur>>> mais si ça marche dit le moi
0
Pat_59 Messages postés 26 Date d'inscription vendredi 24 juillet 2009 Statut Membre Dernière intervention 30 juillet 2009
29 juil. 2009 à 10:16
Impecable!!!
Merci beaucoup.
Juste histoire d'améliorer mon projet, est-ce qu'il est possible de copier les lignes avec leur mise en forme, c-a-d couleur du texte, couleur de remplissage des cellules,...

Encore merci et désolé de t'innonder de questions!!!!
0
ben13.51 Messages postés 112 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 11 janvier 2012 7
29 juil. 2009 à 11:08
Voilà, avec ça ça devrait marcher
Tu insères les deux première ligne avant les deux dernière qui existe déjà dans ton code
9a permet de coller le format de tes cellules avant d'y coller les valeurs...

Selection.PasteSpecial Paste:=xlPasteFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False

Selection.PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
0
Pat_59 Messages postés 26 Date d'inscription vendredi 24 juillet 2009 Statut Membre Dernière intervention 30 juillet 2009
29 juil. 2009 à 13:47
C super!!
J'ai un dernier probléme à résoudre mais ne t'inquiéte pas jcomprendrais que tu ne veuille pas répondre aprés tous ce que je t'ai déjà demandé!!!

Dans mon classeur j'utilise plusieurs fois la même fonctions comme je te le montre à la suite.Je fais ça car entre les 2 fonctions j'aimerais avoir une cellule à la ligne suivante après ma première fct qui me fasse la somme des valeurs de la colonne 10 à partir de la ligne 14.
Ensuite la même chose après chaque fonction, cela me donne des sous total et à la fin après toutes mes fonctions je voudrais avoir une cellule qui me donne la somme de tout les sous total ou la somme de toute ma colonne à partir de ligne 14 sans prendre en compte les sous total biensur.

Si tu pouvais m'aider ça serai vraiment génial mais dans le cas contraire je comprendrais.

Un grand merci déjà pour toute ton aide

Dim val As Integer
val = 14

For i = 14 To 46
For j = 10 To 17
If Sheets(j).Cells(i, 9) <> 0 Xor Sheets(j).Cells(i, 9) = " " Then
Sheets(j).Rows(i).Copy
Sheets("FACTURE").Select
Sheets("FACTURE").Rows(val).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
val = val + 1
End If
Next j
Next i

For i = 48 To 61
For j = 10 To 17
If Sheets(j).Cells(i, 9) <> 0 Xor Sheets(j).Cells(i, 9) = " " Then
Sheets(j).Rows(i).Copy
Sheets("FACTURE").Select
Sheets("FACTURE").Rows(val).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
val = val + 1
End If
Next j
Next i
0