Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/01/2012, 17h21   #1
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 150
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 150
Points : 25
Points : 25
Par défaut Macro tri et répartition

Bonjour,

Je suis entrain de developper un code qui me permet de faire un tri automatique.

Un sheet nommée travail, oú je colle l'ensemble des lignes est requise.

Sur ces différentes lignes se trouvent des données, qui vont se différencier par la colonne C.

Exemple :

Colonne A : Objet
Colonne B : Quantité
Colonne C : Pays
Colonne D-H : Données

Résultat attendu :

En donnant une combinaison de touche (ctrl+p), je voudrais à l'aide d'un moteur et d'un compteur qu'il détecte le pays en colonne C et qu'il transfère automatiquement cette ligne dans sa sheet correspondante.

En sachant qu'il y a que 6 pays disponible (Chine, Afrique, France, Italie, USA, Espagne, Belgique).

Un tri de départ me permet de ranger toutes les données par pays :

Exemple :

Ligne 1 à 15 : Afrique
Ligne 16 à 22 : France
....

Donc au final, il faudrait qu'il détecte toutes lignes avec pays d'afrique et qu'il les transfère en une seule fois dans la sheet "Afrique".

Pouvez-vous m'aider ?

Merci d'avance

Bien à toi
korni184 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 19h30   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 919
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 919
Points : 7 235
Points : 7 235
Bonjour,

Ci dessous une proposition de code qui transfert chaque ligne dans la bonne feuille.
En pré-requis il faut que chaque pays soit reconnu par une feuille qui porte le nom du pays

A exécuter avec la feuille de données Active (Activesheet)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub TransfereDonnees()
 
Dim i As Long
Dim iCible As Long
Dim shSource As Worksheet
Dim Sh As Worksheet
 
Set shSource = ActiveSheet
 
'Copie les données dans les feuilles Pays
For i = 2 To shSource.Range("A" & Rows.Count).End(xlUp).Row
    Set Sh = Sheets(Range("C" & i).Value)
    iCible = Sh.Range("A" & Rows.Count).End(xlUp).Row + 1
    shSource.Rows(i).Copy Sh.Range("A" & iCible)
    'Vide la ligne Copiée
    shSource.Rows(i).ClearContents
Next i
 
End Sub
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/01/2012, 09h52   #3
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 150
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 150
Points : 25
Points : 25
Par défaut Problème sur le code

Je viens d'utiliser votre code :

Dans la colone A j'ai mis des chiffres aléatoires,
Dans la colone B des données aléatoires,
Dans la colonne C les pays suivants : France Italie Roumanie

La 1ère sheet se nomme "Travail"
La 2ème sheet se nomme "France"
La 3ème sheet se nomme "Italie"
La 4ème sheet se nomme "Roumanie"

Lorsque je fais mon "Ctrl+a" il sélectionne toute la sheet "travail" et ne fait aucun traitement.

Pouvez-vous m'aider ?

Merci d'avance
korni184 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 09h58   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 919
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 919
Points : 7 235
Points : 7 235
Le code proposé fonctionne sur la base de ton premier post.
Si tu changes l'ordre des colonnes en cours de route, modifie le code pour qu'il prenne en considération tes modifications.

pour info, ctrl + a est un raccourci windows pour tout sélectionner, cela ne pourra pas exécuter la macro.
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/01/2012, 10h17   #5
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 150
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 150
Points : 25
Points : 25
Par défaut Modification code vb

Je viens de changer le ctrl+a par un ctrl+t.

Concernant les changements, il n'y a rien qui puisse modifier le code.

Les pays sont toujours en colonne C, donc que dois-je faire ?
korni184 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 10h22   #6
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 919
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 919
Points : 7 235
Points : 7 235
Post un fichier exemple
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/01/2012, 10h26   #7
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 150
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 150
Points : 25
Points : 25
Par défaut Modification code vb

J'ai ajouté des données dans les colonnes (D à H).

Et çà à fonctionné !

Cependant, je voulais à la base mettre les données dans une sheet nommée "travail".

Si je colle les données dans travail, il transfère toutes les lignes, sauf la premières !

Que dois-je faire ?
korni184 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 10h40   #8
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 919
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 919
Points : 7 235
Points : 7 235
Citation:
J'ai ajouté des données dans les colonnes (D à H).




Citation:
Cependant, je voulais à la base mettre les données dans une sheet nommée "travail".
Comme cela
Code :
Set shSource = Sheets("travail")

Citation:
Si je colle les données dans travail, il transfère toutes les lignes, sauf la premières !
Le code proposé commence ligne 2 (on considère que la ligne contient les en-tètes)
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/01/2012, 14h54   #9
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 150
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 150
Points : 25
Points : 25
Par défaut Code VB ajout

Tout fonctionne à merveille !

Par contre serait-il possible de ne pas partir de A2 ?
Et de les coller directement sur les lignes A de chaque feuilles ?

Je ne veux pas ajouter de titres
korni184 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 15h00   #10
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Je pense que si Jérome ne t'a pas fourni tout de suite la réponse, c'est pour que tu lises un peu le code qu'il t'a fourni et que tu essaies de comprendre comment ça marche.
Un indice : Tu veux partir de la première ligne et non de la deuxième, il faut peut-être changer un 2 en 1 quelque part...
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 15h19   #11
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 150
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 150
Points : 25
Points : 25
Par défaut VB CODE MOD

Effectivement je me suis mal exprimé,

J'ai déjà effectué cette modification, c'est lorsqu'il vient coller les données dans les différentes sheets qu'il laisse une ligne de libre....

Peut-on modifier cela ?
korni184 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 15h36   #12
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Comme tu peux le voir, il te propose un End(xlUp) qui est l'équivalent d'un Ctrl+flèche haut. Auquel il rajoute 1 pour avoir la ligne vide. Il est vrai que la première fois, quand il n'y a aucune donnée, il remonte jusqu'en haut et descends d'une case, tu pourrais faire :
Code :
1
2
iCible = Sh.Range("A" & Rows.Count).End(xlUp).Row + 1
If iCible = 2 And Sh.Range("A1").Value = "" Then iCible = 1
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/01/2012, 15h38   #13
Membre Expert
 
Avatar de MarcelG
 
Homme Marcel GALANO
Développeur informatique
Inscription : juillet 2009
Messages : 644
Détails du profil
Informations personnelles :
Nom : Homme Marcel GALANO
Localisation : France, Maine et Loire (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juillet 2009
Messages : 644
Points : 1 255
Points : 1 255
Par défaut remarques

Bonjour à tous,

Jérôme,

Citation:
pour info, ctrl + a est un raccourci windows pour tout sélectionner, cela ne pourra pas exécuter la macro.
Si je ne me trompe, le fait d'affecter à une procédure un raccourci déjà reconnu par Windows donne la priorité à la procédure.

D'autre part, je pense qu'ici une adaptation de ma - modeste - contribution, que je viens de poster, est envisageable.

Alimenter les feuilles d'un classeur depuis une synthèse
__________________

Bien Cordialement.

Marcel

Pas de messagerie personnelle pour vos questions, s'il vous plaît. La réponse peut servir aux autres membres. Merci.


MarcelG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 15h59   #14
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 919
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 919
Points : 7 235
Points : 7 235
Salut MarcelG

Citation:
Si je ne me trompe, le fait d'affecter à une procédure un raccourci déjà reconnu par Windows donne la priorité à la procédure.
Oui, en effet c'est faisable

Je trouve juste pas adéquat l'utilisation d'un raccourci clavier existant pour faire une tache qui n'a rien a voir avec la tache d'origine (surtout pour les utilisateurs qui utilise beaucoup ces raccourcis)
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 16h34   #15
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 150
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 150
Points : 25
Points : 25
Par défaut Ajout d'une variable

Hello,

Merci pour vos réponses, le forum est vraiment génial.

Je vais revenir avec mon sujet...mais dans une nouvelle discussion.

Un grand merci à vous tous
korni184 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 15h58   #16
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 150
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 150
Points : 25
Points : 25
Par défaut Macro TRi Problème

Bonjour,

Je sais que le sujet est clôturé, d'ailleurs je ne sais même pas si vous allez recevoir mon message :

Concernant ce code, pouvez-vous me donner le maximum d'explications sur son fonctionnement ? Des phrases pour expliquer chaque actions ? Merci d'avance pour ce point.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub TransfereDonnees()
 
Dim i As Long
Dim iCible As Long
Dim shSource As Worksheet
Dim Sh As Worksheet
 
Set shSource = Sheets("Fiche de Travail J")
 
'Copie les données dans les feuilles Pays
For i = 1 To shSource.Range("A" & Rows.Count).End(xlUp).Row
    Set Sh = Sheets(Range("C" & i).Value)
    iCible = Sh.Range("A" & Rows.Count).End(xlUp).Row + 1
    if iCible = 2 And Sh.Range("a1").value = "" Then iCible = 1
    shSource.Rows(i).Copy Sh.Range("A" & iCible)
    'Vide la ligne Copiée
    shSource.Rows(i).ClearContents
Next i
 
End Sub
Sinon, juste une deuxième question, vu que j'utilise plusieurs fois la Macro dans la même journée, j'ai rajouter à la suite (tri, ajout de totaux, etc) pour chaque sheet.

Donc le problème c'est que si j'ai seulement dans mes données de l'après-midi des données pour le pays Maroc, je voudrais qu'il aille remplacés ce qu'il y a dans la sheet, Non pas les rajouter à la suite !

Est-ce que c'est possible ?
korni184 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 16h19   #17
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 919
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 919
Points : 7 235
Points : 7 235
Avec les commentaires sur chaque lignes
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sub TransfereDonnees()
 
'Déclaration des variables
Dim i As Long
Dim iCible As Long
Dim shSource As Worksheet
Dim Sh As Worksheet
 
'Onglet ou se trouve les données à ventiler
Set shSource = Sheets("Fiche de Travail J")
 
'Copie les données dans les feuilles Pays
 
'Pour chaque ligne non vide de l'onglet source
For i = 1 To shSource.Range("A" & Rows.Count).End(xlUp).Row
    'Instanciation de la variable avec le nom du pays correspondant à la ligne
    Set Sh = Sheets(Range("C" & i).Value)
    'Trouve la prochaine ligne vide sur l'onglet du pays
    iCible = Sh.Range("A" & Rows.Count).End(xlUp).Row + 1
    'Test si onglet vide, alors on ajoute la ligne sur la ligne 1
    If iCible = 2 And Sh.Range("a1").Value = "" Then iCible = 1
    'Copy de la ligne
    shSource.Rows(i).Copy Sh.Range("A" & iCible)
    'Vide la ligne Copiée
    shSource.Rows(i).ClearContents
Next i
 
End Sub

Citation:
Donc le problème c'est que si j'ai seulement dans mes données de l'après-midi des données pour le pays Maroc, je voudrais qu'il aille remplacés ce qu'il y a dans la sheet, Non pas les rajouter à la suite !
Cela est possible, mais nécessite d'ajouter une date d'ajout sur la feuille pays.
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/01/2012, 17h36   #18
Nouveau Membre du Club
 
Inscription : avril 2010
Messages : 150
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 150
Points : 25
Points : 25
Comment je peux faire pour ajouter une date d'ajout automatiquement lors ce que je colle mes données ?

J'imagine que lorsque j'active ma macro, il ajoute à chaque ligne une date ? Avec l'heure d'ajout ?

Mais comment je peux caractériser cela au niveau de la macro ?

Cependant j'ai mis ceci sur deux sujets, je devrais peut être clôturer définitivement celui ci ?
korni184 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 17h59   #19
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 919
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 919
Points : 7 235
Points : 7 235
Je pense que pour le suivi il vaut mieux rester sur celui ci

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Sub TransfereDonnees()
 
'Déclaration des variables
Dim i As Long
Dim iCible As Long
Dim shSource As Worksheet
Dim Sh As Worksheet
 
'Onglet ou se trouve les données à ventiler
Set shSource = Sheets("Fiche de Travail J")
 
'Copie les données dans les feuilles Pays
 
'Pour chaque ligne non vide de l'onglet source
For i = 1 To shSource.Range("A" & Rows.Count).End(xlUp).Row
    'Instanciation de la variable avec le nom du pays correspondant à la ligne
    Set Sh = Sheets(Range("C" & i).Value)
    'Trouve la prochaine ligne vide sur l'onglet du pays
    iCible = Sh.Range("A" & Rows.Count).End(xlUp).Row + 1
    'Test si onglet vide, alors on ajoute la ligne sur la ligne 1
    If iCible = 2 And Sh.Range("a1").Value = "" Then iCible = 1
    'Copy de la ligne
    shSource.Rows(i).Copy Sh.Range("A" & iCible)
    'Ajoute la date
    Sh.Range("D" & iCible).Value = Date
    'Vide la ligne Copiée
    shSource.Rows(i).ClearContents
Next i
 
End Sub
Pour la partie concernant le contrôle si la donnée existe à cette date, qu'elle est la clé d’unicité d'une ligne sachant que le montant ayant été modifié ne peut être dedans? une ligne par jour par pays ?
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h01.


 
 
 
 
Partenaires

Hébergement Web