[excel/vba] mettre un jour un fichier excel
Fermé
antic80
Messages postés
4785
Date d'inscription
lundi 30 mai 2005
Statut
Contributeur
Dernière intervention
9 septembre 2009
-
21 août 2008 à 14:51
wilfried_42 Messages postés 907 Date d'inscription mardi 19 août 2008 Statut Contributeur Dernière intervention 8 décembre 2009 - 21 août 2008 à 18:18
wilfried_42 Messages postés 907 Date d'inscription mardi 19 août 2008 Statut Contributeur Dernière intervention 8 décembre 2009 - 21 août 2008 à 18:18
A voir également:
- [excel/vba] mettre un jour un fichier excel
- Liste déroulante excel - Guide
- Si et excel - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
7 réponses
wilfried_42
Messages postés
907
Date d'inscription
mardi 19 août 2008
Statut
Contributeur
Dernière intervention
8 décembre 2009
244
21 août 2008 à 14:58
21 août 2008 à 14:58
Bonjour
Sur ta feuille tu fais Alt + F11 et tu te trouves dans la fenetre VBA, une fenetre pricipale, blanche si rien n'est deja mis sinon contient les code de la feuille concernée.
à sa gauche, une fenetre avec les differents modules apartenant au classeur, tu y trouves toutes les feuilles ainsi qur Thisworkbook
si tu doubleclick sur ThisWorkBook, tu tombes (dans la fenetre principale) sur le codde associé au classeur
au dessus, 2 listes, la premiere (à gauche) choisir thisworkbook, la 2eme à droite toutes les interruption gérées par Excel pour le classeur
à l'initialistion (1ere liste), il te met automatiquement l'interruption Open, c'est celle qui t'interresse
Sur ta feuille tu fais Alt + F11 et tu te trouves dans la fenetre VBA, une fenetre pricipale, blanche si rien n'est deja mis sinon contient les code de la feuille concernée.
à sa gauche, une fenetre avec les differents modules apartenant au classeur, tu y trouves toutes les feuilles ainsi qur Thisworkbook
si tu doubleclick sur ThisWorkBook, tu tombes (dans la fenetre principale) sur le codde associé au classeur
au dessus, 2 listes, la premiere (à gauche) choisir thisworkbook, la 2eme à droite toutes les interruption gérées par Excel pour le classeur
à l'initialistion (1ere liste), il te met automatiquement l'interruption Open, c'est celle qui t'interresse
antic80
Messages postés
4785
Date d'inscription
lundi 30 mai 2005
Statut
Contributeur
Dernière intervention
9 septembre 2009
1 159
21 août 2008 à 15:04
21 août 2008 à 15:04
le soucis c que je dois faire ca a partir de vba
donc mon programme va devoir ouvrir le fichier comportant les nouvelles données , parcourir chaque ligne du classeur pour vérifier si les données existent deja et dans le cas contraire mettre a jour les nouvelles données.
donc mon programme va devoir ouvrir le fichier comportant les nouvelles données , parcourir chaque ligne du classeur pour vérifier si les données existent deja et dans le cas contraire mettre a jour les nouvelles données.
wilfried_42
Messages postés
907
Date d'inscription
mardi 19 août 2008
Statut
Contributeur
Dernière intervention
8 décembre 2009
244
21 août 2008 à 17:05
21 août 2008 à 17:05
re:
je pense t'avoir dit comment aller à partir d'excel sur le VBA, maintenant si tu veux la macro, il va te falloir etre plus precis, structure du fichier d'entrée, structure du fichier à metre à jour.
les noms des fichiers, les chemins etc etc.....
je pense t'avoir dit comment aller à partir d'excel sur le VBA, maintenant si tu veux la macro, il va te falloir etre plus precis, structure du fichier d'entrée, structure du fichier à metre à jour.
les noms des fichiers, les chemins etc etc.....
antic80
Messages postés
4785
Date d'inscription
lundi 30 mai 2005
Statut
Contributeur
Dernière intervention
9 septembre 2009
1 159
21 août 2008 à 17:10
21 août 2008 à 17:10
le fichier de base s'appelle données
le fichier comportant les nouvelles données s'appelle export
colonne a = nom
colonne b = prénom
colonne c = date de naissance
le but est à partir du programme vba situé dans données il faut ouvrir le fichier export et insérer les données de export dans le fichier données en verifiant de ne pas recopier des données deja présente dans le fichier données
le fichier comportant les nouvelles données s'appelle export
colonne a = nom
colonne b = prénom
colonne c = date de naissance
le but est à partir du programme vba situé dans données il faut ouvrir le fichier export et insérer les données de export dans le fichier données en verifiant de ne pas recopier des données deja présente dans le fichier données
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
wilfried_42
Messages postés
907
Date d'inscription
mardi 19 août 2008
Statut
Contributeur
Dernière intervention
8 décembre 2009
244
21 août 2008 à 17:52
21 août 2008 à 17:52
re:
sans fichier, ni les nom des feuilles, voici une macro faite à la main, non testée :
macro à mettre dans le classeur données, module Thisworkbook
ensuite fermer le classeur et le reouvrir
j'imagine que les feuilles sont les 1ere feuille de chacun des classeurs
je rappelle, macro faite à main levée et non testée
sans fichier, ni les nom des feuilles, voici une macro faite à la main, non testée :
macro à mettre dans le classeur données, module Thisworkbook
ensuite fermer le classeur et le reouvrir
j'imagine que les feuilles sont les 1ere feuille de chacun des classeurs
Private Sub Workbook_Open() dim monchemin as string, wb as workbook, maplage as range, i as long monchemin = thisworkbook.path ' maintenant je vais tricher, je vais creer une formule de cacatenation dans la colonne D afin de ne faire q'un seul test sheets(1).range("D1").formulalocal = "=A1 & B1 & C1" ' je recopie la formule sur toute la colonne selon le nombre d'enregistrements de la colonne A sheets(1).range("D1:D" & sheets(1).range("A65536").end(xlup).row).filldown ' je charge en memoire la colonne D set maplage = sheets(1).range("D1:D" & sheets(1).range("A65536").end(xlup).row) ' j ouvre le fichier à controler set wb = workbooks.open filename:= monchemin & "\export.xls" with wb.sheets(1) for i = 1 to .range("A65536").end(xlup).row ' je vais controler si la ligne existe avec la fonction NB.SI (countif) if application.WorksheetFunction.CountIf(maplage,.range("A" & i) & .range("B" & i) & .range("C" & i) =0 then .range("D" & i) = 1 next i 'jai donc mis des pointeurs (1) en colonne D pour les enregitrement à copier ' je vais maintenant filtrer, ensuite faire un copier coller de tout le bloc .range("A:D").autofilter field:=4, criteria1:= 1 .range("A:C").specialcells(xlcelltypevisible).copy destination:=workbooks(1).sheets(1).range("A" & workbooks(1).sheets(1).range("A65536").end(xlup).row + 1) ' LA copie est faite, je deconnect le filtre automatique, je remet à zero la colonne D et je ferme le classeur .range("A:D").autofilter .range("D:D").clear end with wb.close false ' Fermeture sans sauvegarde sheets(1).range("D:D").clear ' j'efface ma formule de concatenation End Sub
je rappelle, macro faite à main levée et non testée
antic80
Messages postés
4785
Date d'inscription
lundi 30 mai 2005
Statut
Contributeur
Dernière intervention
9 septembre 2009
1 159
21 août 2008 à 18:09
21 août 2008 à 18:09
cette méthode semble intéressante mais je vais apporter 2 points
le premier est que je n'ai pas que 3 colonnes mais presque une vingtaine donc la concaténation risque de ne pas fonctionner
le deuxieme est que chaque ligne comporte dans la 5e colonne un numéro unqiue du genre 29580. ne serait t'il pas plus facile de passer par ce numéro pour regarder si il existe deja
le premier est que je n'ai pas que 3 colonnes mais presque une vingtaine donc la concaténation risque de ne pas fonctionner
le deuxieme est que chaque ligne comporte dans la 5e colonne un numéro unqiue du genre 29580. ne serait t'il pas plus facile de passer par ce numéro pour regarder si il existe deja
wilfried_42
Messages postés
907
Date d'inscription
mardi 19 août 2008
Statut
Contributeur
Dernière intervention
8 décembre 2009
244
21 août 2008 à 18:18
21 août 2008 à 18:18
re:
bien sur que cela facilite les choses, fallait le dire avant comme quoi un petit fichier est souvent plus utile
donc j'ai supprime la concatenation et sa remise à zero
j'ai donc fait le filtrage sur la 21eme colonne ("U")
le contole se fait sur colonne E, et le copier coller sur les 20 colonnes
bien sur que cela facilite les choses, fallait le dire avant comme quoi un petit fichier est souvent plus utile
Private Sub Workbook_Open() dim monchemin as string, wb as workbook, maplage as range, i as long monchemin = thisworkbook.path ' je charge en memoire la colonne E set maplage = sheets(1).range("E1:E" & sheets(1).range("A65536").end(xlup).row) ' j ouvre le fichier à controler set wb = workbooks.open filename:= monchemin & "\export.xls" with wb.sheets(1) for i = 1 to .range("A65536").end(xlup).row ' je vais controler si la ligne existe avec la fonction NB.SI (countif) if application.WorksheetFunction.CountIf(maplage,.range("E" & i)) =0 then .cells(21,i) = 1 next i 'jai donc mis des pointeurs (1) en colonne 21 ' je vais maintenant filtrer, ensuite faire un copier coller de tout le bloc .range("A:U").autofilter field:=21, criteria1:= 1 .range("A:T").specialcells(xlcelltypevisible).copy destination:=workbooks(1).sheets(1).range("A" & workbooks(1).sheets(1).range("A65536").end(xlup).row + 1) ' LA copie est faite, je deconnect le filtre automatique, je remet à zero la colonne D et je ferme le classeur .range("A:U").autofilter .range("U:U").clear end with wb.close false ' Fermeture sans sauvegarde End Sub
donc j'ai supprime la concatenation et sa remise à zero
j'ai donc fait le filtrage sur la 21eme colonne ("U")
le contole se fait sur colonne E, et le copier coller sur les 20 colonnes