Copier les données d'un classeur dans un autre classeur sous certaines condition

laluss Messages postés 17 Date d'inscription lundi 20 juin 2011 Statut Membre Dernière intervention 24 juin 2011 - 20 juin 2011 à 17:10
Patrice H Messages postés 42 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 24 juin 2011 - 24 juin 2011 à 11:17
Bonjour,

J'ai deux classeurs : le A qui regroupe une liste d'élèves avec leur N° étudiant, leur code de groupe, leur nom, prénom, les heures facturables..
et le classeur B : où j'ai crée un onglet par formation dans le but de faire divers calculs

Ce que je voudrais c'est créer une macro qui permettrait d'alimenter automatiquement les différents onglets de mon classeur B en y inscrivant N° étudiant , prénom et nom des élèves, heures facturables.

Je suis novice dans VBA. Je regarde les discussions des forums pour essayer de trouver une solution mais je n'arrive à rien pour l'instant.

Merci pour votre aide

36 réponses

Patrice H Messages postés 42 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 24 juin 2011
23 juin 2011 à 14:59
Vérifie bien le nom de ton fichier et celui de l'onglet. Est-ce qu'il s'appelle bien "Etat_inscriptions_par_Types_contrat.xls", attention aux majuscules/minuscule et aux _. Pareil Pour l'onglet.

Pour tester voici une solution
tu remplaces cette ligne
Set Par_formation_et_qualité = Workbooks("Etat_inscriptions_par_Types_contrat.xls").Worksheets("Par_formation_et_qualité")

Par les trois suivantes
Dim Classeur as workbook
Set Classeur = Workbooks("Etat_inscriptions_par_Types_contrat.xls")
Set Par_formation_et_qualité = Classeur.Worksheets("Par_formation_et_qualité")

et tu me dis où se trouve l'erreur.

Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
0
Patrice H Messages postés 42 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 24 juin 2011
23 juin 2011 à 15:00
N'oublie pas tout à la fin de rajouter
set Classeur = Nothing

Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
0
laluss Messages postés 17 Date d'inscription lundi 20 juin 2011 Statut Membre Dernière intervention 24 juin 2011
23 juin 2011 à 15:10
J'ai fait ce que tu m'as dit et maintenant j'ai une erreur 13 incompatibilité de type sur la ligne :
Resiliation = Par_formation_et_qualité.Cells(LigneA, 8)

Au fait j'ai une petite question, est ce que je vais devoir faire une macro pour chaque onglet formation? parce que je peux pas générer directement des nouveaux onglets par formation car je dois réaliser des calculs avec des taux horaires et ils sont différents suivants les formations. C'est pour cela que j'ai déjà créer tout les onglets
0
laluss Messages postés 17 Date d'inscription lundi 20 juin 2011 Statut Membre Dernière intervention 24 juin 2011
23 juin 2011 à 15:18
J'ai une autre question qui va te sembler stupide mais bon je me lance
quand on écrit le nom du fichier entre guillemet on ne met pas les _ ?
C'est seulement s'il n'y a pas de guillemet qu'on doit mettre des _ entre chaque mot.

En tout cas, Je viens d'essayer sans les _ la ou il y a des guillemet mais ca m'indique toujours la même erreur à la même place.
0

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

Posez votre question
laluss Messages postés 17 Date d'inscription lundi 20 juin 2011 Statut Membre Dernière intervention 24 juin 2011
23 juin 2011 à 15:26
J'ai peut être compris pourquoi cette erreur s'affiche.
En effet dans mon tableau dans resiliation soit on trouve une date au même format que début ou fin de contrat et s'il n'y a pas de resiliation dans la cellule il s'inscrit : (vide)
Le message d'erreur pourrait il venir de là ?
0
Patrice H Messages postés 42 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 24 juin 2011
23 juin 2011 à 15:45
Procédons par ordre

Tout d'abord le positif, on a avancé.

Pour ta question sur les _

Lorsque tu écris "Etat inscriptions par Types contrat.xls", il s'agit du nom du fichier tel qu'il est écrit sur le disque dur (ou le réseau ...)
Lorque tu écris Etat_inscriptions_par_Types_contrat.xls, il s'agit d'une varaible (et même dans la cas présent d'une variable se référant à un l'objet Etat_inscriptions_par_Types_contrat. Dans le nom d'une variable il ne doit pas y avoir d'espace. Le point sert à référencé des propriétés de la variable.

Il faut faire attention à ne pas confondre une variable et sa valeur. Une variable a trois attributs importants. Son nom (qui ne comporte ni espace ni caractères exotiques, évite même les accents bien que VBA les accepte), son type qui dit quel ensemble de valeurs la variable peut prendre (en gros la place qu'elle occupera en mémoire et comment ce sera interprété), sa valeur qui doit correspondre au type déclaré.

Prends l'habitude de toujours déclarer tes variables et de commencer tous tes modules de programmation par option explicit.

Pour ton erreur 13 tu auras donc compris que Resiliation est de type double (d'ailleurs il faudrait voir si un type Date ne serait pas préférable ou même string s'il n'y a pas de calculs sur les dates) et Par_formation_et_qualité.Cells(LigneA, 8) doit être d'un type incompatible avec double. Ce qui est le cas avec le mot "(vide)"

Voici une solution simple si tu ne fais pas de calcul avec les dates (début, fin, résiliation) : tu changes la déclaration de
Debut_contrat As Double, Fin_contrat As Double, Resiliation As Double dans la ligne dim
par
Debut_contrat As String, Fin_contrat As String, Resiliation As String

ça devrait marcher.

En cas de besoin de calcul on gérerait le cas avec des tests sur les valeurs de début, fin, résiliation.





Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
0
Patrice H Messages postés 42 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 24 juin 2011
23 juin 2011 à 15:50
Une autre solution à laquelle je n'avais pas pensé tout de suite :
Tu remplaces

Resiliation = Par_formation_et_qualité.Cells(LigneA, 8)

Par

If Par_formation_et_qualité.Cells(LigneA, 8)<>"(vide)" then Resiliation = Par_formation_et_qualité.Cells(LigneA, 8)


Enfin pour ta question sur faire une sub sur chaque onglet, ce n'est pas nécessaire mais on verra plus tard. Essayons déjà que cela marche.

A terme tu pourras même signaler les lignes mal remplies (erreur dans l'intitulé de la formation par exemple : Calcul au lieu de Calculs, ou même calcul au lieu de Calcul.

Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
0
laluss Messages postés 17 Date d'inscription lundi 20 juin 2011 Statut Membre Dernière intervention 24 juin 2011
23 juin 2011 à 16:00
Merci encore une fois pour tes explications !
Concernant le code, j'ai déclaré heures en string aussi parce que sinon ca me le marquait en erreur.
J'aurais des calculs par contre à faire sur les heures par la suite dans mon classeur CA par formation. Du coup, ca va poser problème si j'ai bien compris ce que tu m'as dis.
Après éxécution du code après les modifications, l'erreur se place désormais sur cette écriture :
Set ECD = Workbooks("CA formation.xls").Worksheets(Formation)
Et c'est une erreur de type 9 encore
0
Patrice H Messages postés 42 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 24 juin 2011
23 juin 2011 à 17:42
Pour les heures et les dates on verra après.

Pour ta dernière erreur tu dois avoir compris que soit le fichier n'est pas ouvert, soit son nom est mal écrit, soit la variable formation contient une valeur ne permettant pas d'indexer une feuille du classeur "CA formation.xls" (Formation est soit une string et la valeur n'existe pas dans les onglets du classeur, soit un entier et sa valeur est supérieure au nombre de feuilles du classeur.


Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
0
Patrice H Messages postés 42 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 24 juin 2011
24 juin 2011 à 07:47
En regardant de plus près j'ai compris ton problème. C'est celui que tu évoquais un peu avant. Tu as créée un seul onglet de formation et la ligne que tu es en train de traiter correspond à une autre formation.

Voici comment régler cela pour que ce soit dynamique :
tu remplaces la ligne

Set ECD = Workbooks("CA_formation.xls").Worksheets(Formation)


par celles-ci (tu n'oublies pas de déclarer Index comme long au début)

Index = 1
Do
If INdex > Workbooks("CA_formation.xls").Worksheets.Count then exit do
if Workbooks("CA_formation.xls").Worksheets(INdex).Name = formation then
Set ECP = Workbooks("CA_formation.xls").Worksheets(INdex)
Exit do
end if
Index = Index + 1
Loop
If INdex > Workbooks("CA_formation.xls").Worksheets.Count then
set ECP = Workbooks("CA_formation.xls").Worksheets.add 
ECP.Name = Formation
end if


Voilà : en plus donc tu céres dynamiquement tes divers onglets formation. Et si un jour une nouvelle formation apparait : le programme l'a déjà prévu.


Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
0
laluss Messages postés 17 Date d'inscription lundi 20 juin 2011 Statut Membre Dernière intervention 24 juin 2011
24 juin 2011 à 09:20
Merci :)

Le problème c'est que je dois faire des calculs après avec par exemple le nombre d'heure et un taux horaire qui varie suivant la formation. C'est pour cela que j'avais déjà créé tous les onglets avec les tableaux et que j'aurais souhaité que les données se placent directement dans le tableau pour que les calculs se fassent automatiquement.
Mais bon après je peux toujours avoir un fichier qui génére par formation la liste des étudiants. et faire une formule qui importe ces données vers mes tableaux déjà tout prêt.

Sinon quand j'éxécute le code . Une erreur 1004 s'affiche "la méthode name de l'objet _worksheet a échoué". et l'erreur se situe au niveau de : ECD.Name = Formation
ECD est le nom d'une formation s'est peut être pour ca que ca pose un problème non ?
Après éxécution du code, les différents onglets de formation se créént mais je n'ai rien dedans par contre.
0
laluss Messages postés 17 Date d'inscription lundi 20 juin 2011 Statut Membre Dernière intervention 24 juin 2011
24 juin 2011 à 09:38
En fait, les onglets de formation créént ne sont pas vides. Je n'avais pas vu au départ parceque les données se placent à la même ligne que dans le tableau de données initial.
C'est possible de regrouper toutes les lignes contenues dans l'onglet pour ne pas avoir d'espace vide ?
0
Patrice H Messages postés 42 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 24 juin 2011
24 juin 2011 à 09:53
Oui bien sûr il y a plusieurs solutions.

La plus simple mais loin d'être la plus satisfaisante, à la fin du traitement du tries les tableaux sur la première colonne par exemple.

Une autre plus élaborée que l'on peut voir ensemble.

Mais avant tout as-tu réglé le problème de l'erreur 1004 ?

Pour les calculs ne t'inquiète pas ça se fera en son temps. de même que l'on peut introduire des données par programmation, on peut aussi introduire des formules ou encore le résultat d'une formule.

Pour l'instant l'objectif c'est d'avoir toutes les données c'est à dire tous les onglets nécessaires dans le classeur "CA_formation.xls", et toutes les données du premier fichier (sous forme de nombres ou de chaînes de caractères, ce n'est pas grave) placées dans les bons ongletys. Quand cela sera fait on pourra passer à la suite : 1) mettre les données sans trou entre-elles 2) effectuer des calculs.

Autre question pour qu'on aille plus vite : sais-tu utiliser le débogueur de VBA ? En particulier quand il y a une erreur VBA s'ouvre et souligne en jaune la ligne qui pose problème (pas toujours, mais la plupart du temps). As-tu remarqué qu'en passant la souris au-dessus d'un nom de variable, sa valeur apparait ? Dans ton cas il faut regarder la valeur de la variable Formation qui doit être une chaîne de caractère.

Dernière question pour éviter toute ambiguité : est-ce que ce que tu appelles Formation et que tu récupères ici : Par_formation_et_qualité.Cells(LigneA, 2)
est bien un nom de formation ? Peux-tu donner quelques exemples ? En particulier celui où ça plante justement.

Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
0
Patrice H Messages postés 42 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 24 juin 2011
24 juin 2011 à 10:02
Eventuellement as-tu un mail pour échanger plus simplement des fichiers, je pourrai par exemple t'envoyer le code source plus directement, tu n'aurais plus qu'à copier/coller.



Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
0
laluss Messages postés 17 Date d'inscription lundi 20 juin 2011 Statut Membre Dernière intervention 24 juin 2011
24 juin 2011 à 10:39
Pour mon mail c 'est lucie_b35@yahoo.fr
Sinon quand je vais sur Formation ca met Formation ="" et j'ai déclaré Formation As String
En fait Formation ca correspond à un code de groupe (donc lettre et chiffre) parce que l'intitulé exact de la formation se trouve dans un autre onglet du classeur "Etat inscriptions par Types de contrats" et se serait d'ailleurs plus facile si on pouvait directement utiliser le nom de formation parce que desfois il existe plusieurs classes pour une même formation.
Dès que j'aurais recu ton mail, Je t'enverrai les fichiers comme ca tu pourras te faire une idée plus précise.
0
Patrice H Messages postés 42 Date d'inscription dimanche 12 mars 2006 Statut Membre Dernière intervention 24 juin 2011
24 juin 2011 à 11:17
Je viens de t'envoyer un mail. Pas de souci pour récupérer le nom de la formation.

A plus.

Imagine le pire, tu n'es jamais déçu, il peut même t'arriver d'être heureusement surpris.
Si vous êtes intéressé par l'histoire, visitez mon site http://histoiremondiale.free.fr
0
Rejoignez-nous