[excel/vba] mettre un jour un fichier excel

antic80 Messages postés 4877 Statut Contributeur -  
wilfried_42 Messages postés 912 Statut Contributeur -
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
Configuration: Windows 2000
Internet Explorer 6.0

7 réponses

  1. wilfried_42 Messages postés 912 Statut Contributeur 245
     
    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
  2. antic80 Messages postés 4877 Statut Contributeur 1 178
     
    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
  3. wilfried_42 Messages postés 912 Statut Contributeur 245
     
    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
  4. antic80 Messages postés 4877 Statut Contributeur 1 178
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. wilfried_42 Messages postés 912 Statut Contributeur 245
     
    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
  7. antic80 Messages postés 4877 Statut Contributeur 1 178
     
    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
  8. wilfried_42 Messages postés 912 Statut Contributeur 245
     
    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