[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
Bonjour,

je vais créer un classeur excel pour traiter des données.
a l'ouverture de mon programme vba, il faudra que le programme ouvre un autre fichier excel pour vérifier si des nouvelles données ont étaient saisies et ainsi mettre a jour le fichier excel ou se trouve le programme vba.
je ne vois pas trop comment faire.

merci pour votre aide futur
A voir également:

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
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
0
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
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.
0
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
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.....
0
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
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
0

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

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
0
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
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
0
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
re:
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
0