> 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
Petit 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
Petit 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

Publicité
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
Petit 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
Petit 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)

Publicité
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
Petit 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é ........

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


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