> Tous les forums > Forum Bureautique
 Effectuer une copie dans Excel des données d'une feuille vers une autre
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
alfredo2000
  Posté le 30/09/2016 @ 00:11 
Aller en bas de la page 
Petit astucien

Bonjour,

J'ai un fichier Excel avec plusieurs colonnes (feuil1).

Je souhaite copier dans une 2eme feuille (feuil2) certaines colonnes de la 1ere feuille avec des conditions sur la colonne C (Nom du produit)

Nom du produit doit être égal à "Garrigue bipente" ou "Garrigue toit"

Je joins une image de la feuil1 et du résultat souhaité (feuil2)

Merci pour votre aide

Publicité
Nostradamus8
 Posté le 30/09/2016 à 09:35 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Voila comment je procéderais :
La colonne A de la feuille1 va dans la colonne D de la feuille 2
La colonne C de la feuille1 va dans la colonne E de la feuille 2
La colonne F de la feuille1 va dans la colonne F de la feuille 2
La colonne J de la feuille1 va dans la colonne G de la feuille 2

Dans D1 de la feuille2 :
=Si(OU(Feuille1.C1="Garrigue bipente";Feuille1.C1="Garrigue toit");Feuille1.A1;"")

Dans E1 de la feuille2 :
=Si(OU(Feuille1.C1="Garrigue bipente";Feuille1.C1="Garrigue toit");Feuille1.C1;"")

Dans F1 de la feuille2 :
=Si(OU(Feuille1.C1="Garrigue bipente";Feuille1.C1="Garrigue toit");Feuille1.F1;"")

Dans J1 de la feuille2 :
=Si(OU(Feuille1.C1="Garrigue bipente";Feuille1.C1="Garrigue toit");Feuille1.G1;"")

Reporter toutes ces lignes sur toute la feuille2 (Copier/coller)
Puis trier la feuille2 pour avoir les lignes blanches à la fin.

Le test a été fait à partir de Calc de LibreOffice mais c'est sensiblement pareil sur Excel.



Modifié par Nostradamus8 le 30/09/2016 11:58
alfredo2000
 Posté le 30/09/2016 à 11:15 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Merci pour votre retour.

Cependant est-il possible de le faire par une macro qui puisse être lancée ?

alfredo2000
 Posté le 30/09/2016 à 11:22 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

quand je tape :

=Si(OU(Feuille1.C1="Garrigue bipente";Feuille1.C1="Garrigue toit";Feuille1.A1;"")

j'ai un message d'erreur. J'ai rajouté une parenthese à la fin mais cela ne marche pas non plus.

Nostradamus8
 Posté le 30/09/2016 à 11:59 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Au temps pour moi :

=Si(OU(Feuille1.C1="Garrigue bipente";Feuille1.C1="Garrigue toit");Feuille1.A1;"")

jpr73
 Posté le 30/09/2016 à 14:14 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour,

Une autre solution en insérant un tableau croisé dynamique

Sélectionner une cellule quelconque du TCD pour faire apparaître la liste de champs de TCD

L'avantage c'est le paramétrage très rapide et presque sans limites

Cordialement

http://www.cjoint.com/c/FIEmmmY1VaV

alfredo2000
 Posté le 30/09/2016 à 21:20 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Merci à vous 2 pour vos retours :

@Nostradamus8 == > j'ai essayé la formule mais voilà le résultat

J'ai adapté C2 au lieu de C1 car C1= etiquette de titres

J'ai aussi vérifié les feuilles s'appellent bien Feuil1 et Feuil2

@jpr73 ==> la solution du TCD est intéressante. Cependant je n'ai pas su enlever les totaux pour avoir le même affichage que votre fichier

Comment faites vous ?

jpr73
 Posté le 30/09/2016 à 23:16 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour,

Sélectionner le TCD > Outils de TCD > Création

Disposition > Sous totaux > Ne pas afficher les sous totaux

Disposition > Totaux généraux > Désactivé pour les lignes et les colonnes

Cordialement

alfredo2000
 Posté le 30/09/2016 à 23:49 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

indications précises. J'ai pu le reproduire. Merci

Nostradamus8
 Posté le 01/10/2016 à 08:45 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Je ne vois pas d'erreur dans ta formule.

Peut-être qu'en excel, c'est un peut différent.

Par exemple OR au lieu de OU

" " au lieu de "" à la fin de la formule.

Mais ça m'étonnerait quand même.

Ou voir du coté des formatage de cellules....

Nostradamus8
 Posté le 01/10/2016 à 08:53 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Essaye de mettre devant chaque Feuil : $

Ce qui donne :

=Si(OU($Feuil1.C2="Garrigue bipente";$Feuil1.C2="Garrigue toit");$Feuil1.A2;"")

ferrand
 Posté le 01/10/2016 à 11:35 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

C'est le point entre le nom de feuille et la référence de plage qui est inadéquat dans Excel.

=SI(OU(Feuil1!C2="Garrigue bipente";Feuil1!C2="Garrigue toit");Feuil1!A2;"")

Cordialement.

ferrand
 Posté le 01/10/2016 à 12:17 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Re,

Solution macro :

Sub ExtracProduit()
Dim Tpe(), kpe, n%, i%, k%, p%
kpe = Array(1, 3, 6, 10)
ReDim Tpe(3, 0)
With Worksheets("Feuil1")
If .AutoFilterMode Then
If .FilterMode Then .ShowAllData
End If
For k = 0 To 3
Tpe(k, 0) = .Cells(1, kpe(k))
Next k
n = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 2 To n
If Replace(LCase(.Cells(i, 3)), "bipente", "toit") = "garrigue toit" Then
p = p + 1: ReDim Preserve Tpe(3, p)
For k = 0 To 3
Tpe(k, p) = .Cells(i, kpe(k))
Next k
End If
Next i
End With
Application.ScreenUpdating = False
With Worksheets("Feuil2")
With .Range("A1").Resize(p + 1, 4)
.Value = WorksheetFunction.Transpose(Tpe)
.HorizontalAlignment = xlCenter
.Columns.AutoFit
With .Borders
.LineStyle = slcontinuous
.Weight = xlThin
End With
.Rows(1).Interior.Color = vbYellow
.Cells(2, 2).Resize(p).HorizontalAlignment = xlLeft
End With
End With
End Sub

Pour positionner autrement les résultats, remplacer "A1" par la référence de cellule que l'on souhaite comme cellule supérieure gauche de la plage résultats.

Cordialement.

alfredo2000
 Posté le 01/10/2016 à 16:51 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Merci Ferrand, les 2 solutions marchent maintenant.

J'ai compris la 2ème partie du code, cependant, pouvez-vous juste m'expliquer un peu la 1ère partie en me rajoutant des commentaires :

Il me semble que vous avez défini un tableau, ensuite je suis perdu !!!!!

kpe = Array(1, 3, 6, 10)

ReDim Tpe(3, 0)

With Worksheets("Feuil1")

If .AutoFilterMode Then

If .FilterMode Then .ShowAllData

End If

For k = 0 To 3

Tpe(k, 0) = .Cells(1, kpe(k))

Next k

n = .Cells(.Rows.Count, 1).End(xlUp).Row

For i = 2 To n

If Replace(LCase(.Cells(i, 3)), "bipente", "toit") = "garrigue toit" Then

p = p + 1: ReDim Preserve Tpe(3, p)

For k = 0 To 3

Tpe(k, p) = .Cells(i, kpe(k))

Next k

End If

Next i

End With

ferrand
 Posté le 02/10/2016 à 02:18 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonsoir,

Quelques explications que tu demandes :

kpe = Array(1, 3, 6, 10)
On affecte à une variable de type Variant un tableau composée des numéros de colonnes des valeurs des éléments de produits à extraire lorsque la condition d'extraction est réalisée. Les indices de ce tableau vont de 0 à 3, on l'utilisera donc dans une boucle de 0 à 3 pour pointer les bonnes colonnes des valeurs à récupérer.

ReDim Tpe(3, 0)
On redimensionne un tableau déclaré comme tableau dynamique (sans dimensions préalables). On le dimensionne comme tableau à 2 dimensions : la première de 0 à 3 (3 est l'indice supérieur, 0 est l'indice inférieur par défaut lorsqu'on ne le mentionne pas), ce tableau est destiné à récupérer les produits extraits, cette dimension va accueillir le contenu des 4 colonnes à récupérer de chaque ligne d'extraction. La seconde dimension est destinée aux lignes à extraire, on la dimensionne provisoirement à 0 (un seul élément auquel on en ajoutera au fur et à mesure que des lignes sont à extraire).

With Worksheets("Feuil1")
On indique que l'on travaille sur Feuil1, que l'on met en mémoire avec With. Cela permet de qualifier toutes les expressions tant qu'un End With n'y aura pas mis fin : toute expression débutant par un point est qualifiée par l'objet Worksheet("Feuil1"), exactement comme si tu l'avais écrit avant le point. Cela évite d'une part des répétitions, d'autres de laisser des expressions non qualifiée, donc se référant à l'élément actif (ce qui peut toujours réserver des surprises). L'intérêt de cette méthode est que VBA n'a plus à chercher l'objet qualifiant à chaque fois, ce qui rend l'exécution plus rapide.

If .AutoFilterMode Then
If .FilterMode Then .ShowAllData
End If
Ta feuille comportait un filtre automatique, il est donc judicieux de vérifier si un tel filtre est en place et si un filtre est actif pour dans ce cas afficher toutes les lignes avant de commencer l'opération.

For k = 0 To 3
Tpe(k, 0) = .Cells(1, kpe(k))
Next k
Illustration de l'affectation des valeurs de colonnes à extraire au tableau de résultats : ici on affecte à la ligne 0 les en-têtes des colonnes contenant les valeurs qu'on aura à récupérer.

n = .Cells(.Rows.Count, 1).End(xlUp).Row
On récupère dans la variable n le numéro de la dernière ligne utilisée dans la colonne A (méthode classique...)

For i = 2 To n
...
Next i
Boucle de 2 à n pour balayer toutes les lignes de ton tableau...

If Replace(LCase(.Cells(i, 3)), "bipente", "toit") = "garrigue toit" Then
...
End If
A l'intérieur de cette boucle, on teste la valeur en colonne C sur chaque ligne : pour simplifier le test on réduit l'expression en minuscules, en substituant "toit" à "bipente", pour vérifier que la valeur résultante est "garrigue toit"... Quand c'est le cas, la condition est vérifiée et on a donc une ligne à extraire :

p = p + 1: ReDim Preserve Tpe(3, p)
Cette ligne comporte deux lignes de commande, le signe : est un séparateur permettant d'écrire plusieurs lignes de commande à la suite sur une même ligne. La première incrémente la variable p (p a été déclarée comme variable de type Integer, n'a pas été initialisée, et aura donc la valeur 0 qui sera incrémentée à 1 la première fois où la condition sera vérifiée). La commande suivante utilise p pour redimensionner le tableau en ajoutant une ligne à chaque fois. Le mot clé Preserve permet de redimensionner sans perdre les valeurs antérieurement affectées (le redimensionnement ne peut affecter que la dernière dimension du tableau).

For k = 0 To 3
Tpe(k, p) = .Cells(i, kpe(k))
Next k
Affectation... (méthode déjà vue).

A noter que le tableau de résultats ainsi constitué comporte en première dimension les colonnes et en seconde les lignes (ce qui était justifié par le nombre variable de lignes. L'affectation du tableau à la feuille cible se fait directement en une seule fois, après dimensionnement de la plage cible aux dimension du tableau, et en utilisant la fonction Transpose pour rétablir la position des lignes et colonnes.

Cordialement.

alfredo2000
 Posté le 02/10/2016 à 11:46 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Un GRAND MERCI "ferrand".

Vos explications sont très claires et cela me permettra d'avancer encore plus dans les tâches à faire sous Excel.

Je peux clôturer le post.

alfredo2000
 Posté le 08/10/2016 à 01:58 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

Bonjour,

J'ai un autre point de blocage : j'ai une colonne contenant des dates dans ma feuille 1 et une fois la macro lancée, la colonne est bien copiée dans la feuille 2.

Cependant le jour et le mois sont permutés. Comment faire pour garder mon format initial ?

Feuille 1

Feuille 2 (après copie avec la macro, le jour et le mois sont permutés)

Nostradamus8
 Posté le 08/10/2016 à 07:48 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Voir le format de la cellule sur la feuille 2.

alfredo2000
 Posté le 08/10/2016 à 12:16 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien

J'avais déjà pensé à cela. Mais cela n'a pas résolu le problème.

Jai essayé différentes possibilités avec le format de la cellule source identique à celui de la destination :

Standard, date, personnalisé ........

Publicité
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
Batterie externe Yobon Power Bank (10 000 mAh) à 9,85 €
9,85 € 15 € -34% @Amazon

Amazon fait une promotion sur la batterie externe Yobon Power Bank qui passe à 9,85 € au lieu de 15 €. Cette batterie offre une capacité de 10 000 mAh et 2 ports USB. Un port USB C et un port MicroUSB permettent de recharger la batterie.

A glisser dans votre sac pour recharger votre portable plusieurs fois en déplacement.


Voir le bon plan
NAS Synology DS923+ à 589,99 €
589,99 € 699 € -16% @Amazon

Amazon fait une belle promotion sur le NAS Synology DS923+ qui passe à 589,99 € alors qu'on le trouve ailleurs à partir de 629 €. Le Synology DS923+ est une solution NAS à 4 baies que vous pouvez adapter et étendre selon vos besoins, avec une prise en charge en option de neuf disques au maximum, une mise en réseau plus rapide et des SSD NVMe pour une mise en cache ou des groupes de stockage supplémentaires. Optimisé par Synology DiskStation Manager (DSM), il offre une solution tout-en-un flexible pour le partage, la synchronisation, la sauvegarde et la surveillance des données.


Voir le bon plan
Ecran PC 24 pouces KTC H24V13 (VA, Full HD, 100 Hz) à 89,99 €
89,99 € 129 € -30% @Amazon

Geekbuying fait une promotion sur l'écran PC 24 pouces KTC H24V13 qui passe à 89,99 € avec le code promo BENTECH au lieu de 129 €.  Il possède une dalle à bords fins Full HD (1920x1080) VA à 100 Hz pour des mouvements plus fluides. Il est compatible GSync et FreeSync via Adaptive Sync pour éviter les déchirures dans les jeux. Avec filtres anti scintillements et anti lumière bleue. Ports VGA et HDMI.


Voir le bon plan
Caméra de surveillance extérieure TP-Link Tapo C500 (360°, alarme sonore personnalisable) à 37,99 €
37,99 € 59,99 € -37% @Amazon

Amazon fait une promotion sur la caméra extérieure de surveillance TP-Link Tapo C500 qui passe à 37,99 € livrée gratuitement au lieu de 59,99 € ailleurs. Cette caméra se connecte à votre réseau en WiFi et peut ensuite être contrôlée à distance. Elle offre une définition FHD 1080p, la vision nocturne, pivote à 360° à l'horizontale et 130° à la verticale, la détection et le suivi de mouvements (recevez une notification si quelque chose est détecté), une alarme sonore que vous pouvez personnaliser . Le stockage se fait (gratuitement) en local sur une carte MicroSD ou bien dans le cloud via un abonnement. Elle est étanche IP65.


Voir le bon plan
PC Portable 15.6 pouces Asus A15 (Ryzen 7 6800H, 16 Go DDR5, 512 Go SSD, RTX 3070 Ti, Windows 11) à 999,99 €
999,99 € 1299 € -23% @RueDuCommerce

Amazon fait une promotion sur l'ordinateur portable Asus A15-TUF507RW-HN059W qui passe à 999,99 € alors qu'on le trouve ailleurs à partir de 1299 €. Cet ordinateur portable est équipé d'un écran 15,6 pouces Full HD (1920x1080 pixels) 144 Hz anti-reflet, d'un SSD de 512 Go, d'un processeur AMD Ryzen 7 6800H, de 16 Go de RAM de DDR5 et d'une carte graphique dédiée NVIDIA GeForce RTX 3070 Ti avec 8 Go de RAM. Le clavier est rétro éclairé. Le tout tourne sous Windows 11. Une superbe machine.


Voir le bon plan
Processeur AMD Ryzen 7 7800X3D à 374,95 € livré
374,95 € 449 € -16% @Amazon Allemagne

Amazon Allemagne fait une promotion sur le processeur AMD Ryzen 7 7800X3D (8 coeurs, 16 threads, 4.2 GHz/5 GHz) qui passe à 369,98 € (avec la TVA ajustée). Comptez 4,97 € pour la livraison en France soit un total de 374,95 € livré. On le trouve ailleurs à partir de 449 €. 


Voir le bon plan

Sujets relatifs
Aucun sujet pertinent lié trouvé
 > Tous les forums > Forum Bureautique