Importer des données d'un autre classeur suivant une date [Résolu]

Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
- - Dernière réponse : ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 19 juin 2012 à 07:44
Bonjour,

Je voudrais créer une macro qui puisse importer des données d'un classeur "source.xlsx" à un classeur "GMAO.xlsx".
Il faudrait prendre les données du fichier source, à la feuille "liste", de la colonne A à E sans prendre la première ligne; et l'importer dans le fichier GMAO à la feuille "resultat" à partir de la deuxième ligne.

Le petit problème est que les données sont classés par date et je voudrais seulement sélectionner les données dans le fichier source qui ont pour date (AUJOURDHUI-7jours).
J'ai essayé d'être le plus clair, je vous met en pièce jointe le fichier source et GMAO pour que vous visualisez mieux la chose.
Fichier source : http://cjoint.com/?BFnjixWFoSH
Fichier GMAO : http://cjoint.com/?BFnjjzDp54m

Merci de votre aide!
Afficher la suite 

19 réponses

Meilleure réponse
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
217
3
Merci
Je "refuse" de me référer à un code (le tien) qui passe par des Select, Activate, etc ...
Pour répondre à ra question : seule est alors concernée l'expression conditionnelle à la ligne (de mon code sans ces select, etc ...) disant :
If .Range("A" & i).Value = ladate Then

Remplace-la donc par l'expression conditionnelle qui te convient dans ce cas !
(que la date dans ta cellule soit égale ou supérieure à ladate et égale ou inférieure à la date d'aujourd'hui). Je ne vais tout de même pas t'écrire aussi cela (vraiment trop simple) !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 135 internautes nous ont dit merci ce mois-ci

Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
217
0
Merci
Bonjour,
Mais c'est tout simplement l'exposé de ton problème, sans la moindre tentative de code !
Je vais dans ce cas me contenter personnellement de te mettre sur la voie et te laisser ensuite au moins travailler un peu.
1) Tes données sont triées par date ===>> il te suffit alors d'une Boucle for to next sur la colonne des dates, jusqu'à arriver à la date d'aujourd'hui - 7 jours, puis de continuer jusqu'à ce que date différente ou rien.
2) la fonction Datediff est à lire dans ton aide VBA. Elle te permettra de déterminer la date d'aujourd'hui - 7 jours.
3) Intéresse-toi à la méthode Union (toujours dans ton aide VBA) et sers-t'en donc, dans ta boucle, pour constituer la plage à copier
4) Pour copier une plage plage vers la feuille de destination : méthode Copy (à voir dans ton aide VBA) avec son argument destination (qui peut inclure le classeur, la feuille et le Range).
Merci de commencer par cet effort.
Reviens (mais avec un bout de code) si encore en difficulté. Nous t'aiderons alors.




________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
0
Merci
Bonjour,

Bien sur que j'ai fait du code. Voici ma tentative, elle permet seulement de copier une feuille d'un classeur dans un autre classeur!
Sub importer()
Dim classeurSource As Workbook, classeurDestination As Workbook

'ouvrir le classeur source (en lecture seule)
Set classeurSource = Application.Workbooks.Open("C:\donnees\source.xlsx", , True)
'définir le classeur destination
Set classeurDestination = ThisWorkbook

'copier les données de la "Feuil1" du classeur source vers la "Feuil1" du classeur destination
classeurSource.Sheets("liste").Cells.Copy classeurDestination.Sheets("resultat").Range("A1")

'fermer le classeur source
classeurSource.Close False

End Sub


Ou une autre qui fait la même chose :
Sub Macro1()
    Dim a As Variant, Nom As String

    Nom = ActiveWorkbook.Name
    ChDrive "C:"    ' Choix du lecteur
    ChDir "C:"    'Choix du répertoire
    a = Application.GetOpenFilename("fichier excel (*.xlsx), *.xlsx", _
                                    , "source", , True)

    Select Case TypeName(a)
    Case Is = "Boolean"
        Exit Sub
    Case Else
        For b = LBound(a) To UBound(a)
            Workbooks.Open a(b)
        Next
    End Select

    Nom2 = ActiveWorkbook.Name
    Cells.Select
    Selection.Copy
    Windows(Nom).Activate
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                                                                    :=False, Transpose:=False
    Application.DisplayAlerts = False
    Windows(Nom2).Close
    Application.DisplayAlerts = True

End Sub


Voila, si je demande c'est que je suis bloqué et non par fainéantise.

Merci
Commenter la réponse de robby98800
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
217
0
Merci
Je voudrais s'il te plait voir ton essai sur la partie essentielle : ton essai de boucle sur ta colonne des dates, sur la base des indications que je t'ai données.*
Commence, s'il te plait. Je serai là pour t'aider, mais seulement après cet effort. Je t'ai donné les pistes à suivre et t'ai indiqué les mots à lire dans ton aide VBA.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
0
Merci
Okay je vais tenter et si vous pouvez m'apprendre là où je bloquerai c'est avec plaisir.
Commenter la réponse de robby98800
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
217
0
Merci
Bon ...
Je vais te faire un petit exemple, mais :
1) ce sera le dernier dans de telles conditions (sans aucun travail de ta part)
2) J'ai fait exprès d'y utiliser sans datediff. Montre-moi ensuite (juste pour me faire plaisir, ce que tu aurais transformé en utilisant datediff).

Dans cet exemple : je copie entre 2 feuilles (Feuil1 et Feuil2) du même classeur (à toi de compléter là où il convient pour préciser les classeurs).
Dim ladate As Date, plage As Range
  ladate Date - 7 ' qui pourrait s'écrire ladate DateAdd("d", -7, Date)
  With Sheets("Feuil1")
    For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row
      If .Range("A" & i).Value = ladate Then
        If plage Is Nothing Then
          Set plage = .Range("A" & i & ":" & "E" & i)
        Else
          Set plage = Union(plage, .Range("A" & i & ":" & "E" & i))
        End If
      End If
    Next
  End With
  Sheets("Feuil2").Cells.ClearContents
  If Not plage Is Nothing Then
    plage.Copy Destination:=Sheets("Feuil2").Range("A1")
  End If

Ce n'est pas sorcier (à condition de lire ton aide VBA sur chaque mot qui te parait "barbare").
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
217
0
Merci
Et si tu veux garder la première ligne ===>> encore plus simple puisqu'alors tu auras toujours quelque-chose pour plage et n'auras don pas à tester si Noithing ===>>

Dim ladate As Date, plage As Range
  ladate = Date - 7
  With Sheets("Feuil1")
    Set plage = .Range("A1:E1") ' ---- dobnc plage ne sera jamais Nothing, hein ...
    For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row
      If .Range("A" & i).Value = ladate Then
          Set plage = Union(plage, .Range("A" & i & ":" & "E" & i))
      End If
    Next
  End With
  Sheets("Feuil2").Cells.ClearContents
  plage.Copy Destination:=Sheets("Feuil2").Range("A1")


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
0
Merci
Okay merci pour la bonne base. Je m'y mets demain (il est le soir ici à Nouméa)
Commenter la réponse de robby98800
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
0
Merci
Sub imp()
Dim ladate As Date, plage As Range
  ladate = DateDiff("d", Date, Date - 7)
  With Workbooks("C:\donnees\source.xlsx").Sheets("liste")
    For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row
      If .Range("A" & i).Value = ladate Then
        If plage Is Nothing Then
          Set plage = .Range("A" & i & ":" & "E" & i)
        Else
          Set plage = Union(plage, .Range("A" & i & ":" & "E" & i))
        End If
      End If
    Next
  End With
  Workbooks("sortie.xlsm").Sheets("resultat").Cells.ClearContents
  If Not plage Is Nothing Then
    plage.Copy Destination:=Workbooks("sortie.xlsm").Sheets("resultat").Range("A1")
  End If


End Sub


Voila j'ai tenter de mettre en place les classeurs et la formule datediff.
J'ai une erreur 9 : l'indice n'appartient pas à la sélection à la ligne :With Workbooks("C:\donnees\source.xlsx").Sheets("liste") pourtant je suis sur que le fichier et l'onglet existe bien.

J'avais oublié de préciser mais la feuille "releve_erreur" du classeur où l'on vient coller le fichier source, est un tableau, comment le prendre en compte dans le code?

J'avais vu une macro qui permettait de choisir le fichier dans une arborescence:
Sub choixdudossier()

Dim Fichier_Travail As String

If Not Application.Dialogs(xlDialogOpen).Show Then Exit Sub 'On ouvre la fenêtre Windows pour choisir le fichier

Fichier_Travail = ActiveWorkbook.Name  'Met dans une variable le nom du fichier

End Sub

comment faire pour que le fichier que l'on va choisir soit le fichier qui nous sert de fichier source dans la suite du code?

J'espère avoir été clair
Commenter la réponse de robby98800
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
217
0
Merci
1) tu utilises mal datediff ! Et je te rappelle que datediff ne retourne pas une date, mais un nombre de jours ! (as-tu ouvert ton aide en ligne sur ce mot ? Je ne le crois pas )
2) Les deux classeurs doivent être ouverts. Dès lors, la collection Workbooks contient le classeur workbooks("sortie.xlsm") et le classeur workbooks("source.xlsx").
Recommence donc sur ces bases en utilisant pour l'instant mon code avec DateAdd.
Je reviendrai ensuite avec un code utilisant datediff (juste pour tre montrer).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
0
Merci
Le but de la macro est de chercher un fichier qui est dans un classeur fermé c'est pour cela que j'ai mis l'adresse du fichier source.
Commenter la réponse de robby98800
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
217
0
Merci
Commence par ouvrir (y compris dynamiquement) au lieu de chercher midi à quatorze heures !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
0
Merci
Bonjour,

j'ai fait pas mal d'apprentissage sur VBA et j'ai tenté de faire la macro suivante :
Sub Import()
 
Set Destination = ActiveWorkbook
 
Dim ladate As Date, Plage As Range

ladate = DateAdd("d", -7, Date)
  

Source = Application.Dialogs(xlDialogOpen).Show
    If Source = False Then
        MsgBox ("Aucun fichier sélectionné")
            Exit Sub
    Else
        Set Source = ActiveWorkbook

        Source.Activate
        Sheets(1).Select
           
            For I = 2 To .Range("A" & Rows.Count).End(xlUp).Row
                If .Range("A" & I).Value = ladate Then
                    If Plage Is Nothing Then
                        Set Plage = .Range("A" & I & ":" & "E" & I)
                    Else
                        Set Plage = Union(Plage, .Range("A" & I & ":" & "E" & I))
                    End If
                End If
            Next
            
        Plage.Select
        Selection.Copy
  
        Destination.Activate
        Sheets(2).Select
        Range("A1").Select
        Selection.PasteSpecial Paste:=xlPasteValues
 
        Source.Activate
        Application.CutCopyMode = False
        ActiveWindow.Close SaveChanges:=False
        
    End If
 

End Sub
 


l'éxecution de la macro, j'ai :
Erreur de compilation : Référence incorrecte ou non qualifié à la ligne
For I = 2 To .Range("A" & Rows.Count).End(xlUp).Row


Pouvez vous m'aider svp?
Commenter la réponse de robby98800
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
0
Merci
J'ai réussi à corriger cette erreur :
Sub Import()
 
Set Destination = ActiveWorkbook
 
Dim ladate As Date, Plage As Range
ladate = DateAdd("d", -7, Date)
  

Source = Application.Dialogs(xlDialogOpen).Show
    If Source = False Then
        MsgBox ("Aucun fichier sélectionné")
            Exit Sub
    Else
        Set Source = ActiveWorkbook

        Source.Activate
        Sheets(1).Select
           
            For I = 2 To Worksheets("liste").Range("A" & Rows.Count).End(xlUp).Row
                If Worksheets("liste").Range("A" & I).Value = ladate Then
                    If Plage Is Nothing Then
                        Set Plage = Worksheets("liste").Range("A" & I & ":" & "E" & I)
                    Else
                        Set Plage = Union(Plage, Worksheets("liste").Range("A" & I & ":" & "E" & I))
                    End If
                End If
            Next
            
        Plage.Select
        Selection.Copy
  
        Destination.Activate
        Sheets(2).Select
        Range("A1").Select
        Selection.PasteSpecial Paste:=xlPasteValues
 
        Source.Activate
        Application.CutCopyMode = False
        ActiveWindow.Close SaveChanges:=False
        
    End If
 

End Sub


J'ai maintenant l'erreur d'éxécution 424 : Objet requis à la ligne :
Destination.Activate
Commenter la réponse de robby98800
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
217
0
Merci
La ligne que tu dénonces ne contient pas de faute, dès lors que, plus haut, tu as bien défini l'objet Destination par ton "Set Destination = ActiveWorkbook" !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
0
Merci
Alors comment dois-je faire pour le deboger?
Commenter la réponse de robby98800
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
0
Merci
Ah non c'est bon ça fonctionne !
Par contre il y a un souci c'est que la macro prend juste les données du jour (aujourdhui - 7) et non du jour (aujourdhui - 7 jusqu'à aujourdhui). Je m'étais surement mal exprimé dans le premier post
Commenter la réponse de robby98800
Messages postés
64
Date d'inscription
mardi 29 mai 2012
Statut
Membre
Dernière intervention
27 juillet 2012
0
Merci
Voilà c'est bon c'est fait et ça fonctionne. Je vous remercie beaucoup.
C'est sur le code n'est pas très élégant mais à mon niveau je n'ai pas vraiment le choix.
Commenter la réponse de robby98800
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
217
0
Merci
Clos donc ce sujet (tag "réponse acceptée") pour le libérer.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Commenter la réponse de ucfoutu