Extraire données sur fichiers fermés

yannlion

XLDnaute Junior
Bonjour à tous,

J'ai besoin de copier des données dans un fichier SYNTHESE en provenance de fichier situés dans un même dossier.

J'ai réussi en créant un formule mais il y a la nécessité d'avoir le fichier ouvert (dès qu'il est fermé, j'ai un message d'erreur).
Je souhaiterais créer une macro afin de ne pas avoir à ouvrir chaque fichier les uns après les autres.

Pouvez vous m'aider ?

Merci
Bonne journée à tous

Yannlion
 

Pièces jointes

  • 0102.xlsx
    31 KB · Affichages: 5
  • Centre.xlsx
    31 KB · Affichages: 6
  • SYNTHESE_DEMANDES.xlsx
    17.9 KB · Affichages: 11
  • Morbihan.xlsx
    31 KB · Affichages: 7

yannlion

XLDnaute Junior
Bonjour zebanx, bonjour le forum,

Tout d'abord un grand merci à toi zebanx car effectivement le forum m'a permis d'écrire cette macro :

VB:
Sub Macro1()
Dim ch As String 'déclare la variable ch (CHemin d'accès)
Dim cc As Workbook 'déclare la variable cc (Classeur Cible)
Dim fs As Variant 'déclare la variable fs (FichierS)
Dim cs As Workbook 'déclare la variable cs (Claseur Source)
Dim os As Object 'déclare la variable os (Onglet Source)
Dim li As Long 'déclare la variable li (LIgne)

ch = "C:\Users\xxR\Downloads\DEMANDES\DEMANDES\" 'définit le chemin d'acces ch (à vérifier dans ton cas)
Set cc = ThisWorkbook 'définit le classeur cible cc
fs = Dir(ch & "*.xlsx") 'définit les fichiers du dossier de ch
Do Until fs = "" 'boucle tant que fs n'est pas vide
    li = IIf(cc.Sheets("SYNTHESE").Range("A2").Value = "", 2, cc.Sheets("SYNTHESE").Cells(Application.Rows.Count, 1).End(xlUp).Row + 1) 'définit la première ligne vide de la colonne A du classeur cible
    Set cs = Workbooks.Open(ch & fs) 'ouvre le fichier
    Set os = cs.Sheets("DDS") 'définit l'onglet source (à adapter à ton cas)
    cc.Sheets("SYNTHESE").Range("A" & li).Value = os.Range("C8").Value 'place en colonne A du classeur cible la valeur de C8 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("B" & li).Value = os.Range("C9").Value 'place en colonne B du classeur cible la valeur de C9 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("C" & li).Value = os.Range("C11").Value 'place en colonne C du classeur cible la valeur de C11 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("D" & li).Value = os.Range("C12").Value 'place en colonne D du classeur cible la valeur de C12 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("E" & li).Value = os.Range("C13").Value 'place en colonne E du classeur cible la valeur de C13 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("F" & li).Value = os.Range("C17").Value 'place en colonne F du classeur cible la valeur de C17 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("G" & li).Value = os.Range("C18").Value 'place en colonne G du classeur cible la valeur de C18 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("H" & li).Value = os.Range("C21").Value 'place en colonne H du classeur cible la valeur de C21 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("I" & li).Value = os.Range("C22").Value 'place en colonne I du classeur cible la valeur de C22 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("J" & li).Value = os.Range("C23").Value 'place en colonne J du classeur cible la valeur de C23 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("K" & li).Value = os.Range("C26").Value 'place en colonne K du classeur cible la valeur de C26 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("L" & li).Value = os.Range("C27").Value 'place en colonne L du classeur cible la valeur de C27 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("M" & li).Value = os.Range("A30").Value 'place en colonne M du classeur cible la valeur de A30 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("N" & li).Value = os.Range("B37").Value 'place en colonne N du classeur cible la valeur de B37 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("O" & li).Value = os.Range("B38").Value 'place en colonne O du classeur cible la valeur de B38 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("P" & li).Value = os.Range("B39").Value 'place en colonne P du classeur cible la valeur de B39 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("Q" & li).Value = os.Range("B41").Value 'place en colonne Q du classeur cible la valeur de B41 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("R" & li).Value = os.Range("B42").Value 'place en colonne R du classeur cible la valeur de B42 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("S" & li).Value = os.Range("B43").Value 'place en colonne S du classeur cible la valeur de B43 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("T" & li).Value = os.Range("B44").Value 'place en colonne T du classeur cible la valeur de B44 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("U" & li).Value = os.Range("B45").Value 'place en colonne U du classeur cible la valeur de B45 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("V" & li).Value = os.Range("B48").Value 'place en colonne V du classeur cible la valeur de B48 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("W" & li).Value = os.Range("B49").Value 'place en colonne W du classeur cible la valeur de B49 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("X" & li).Value = os.Range("B50").Value 'place en colonne X du classeur cible la valeur de B50 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("Y" & li).Value = os.Range("B51").Value 'place en colonne Y du classeur cible la valeur de B51 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("Z" & li).Value = os.Range("B52").Value 'place en colonne Z du classeur cible la valeur de B52 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AA" & li).Value = os.Range("B53").Value 'place en colonne AA du classeur cible la valeur de B53 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AB" & li).Value = os.Range("B54").Value 'place en colonne AB du classeur cible la valeur de B54 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AC" & li).Value = os.Range("B55").Value 'place en colonne AC du classeur cible la valeur de B55 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AD" & li).Value = os.Range("B56").Value 'place en colonne AD du classeur cible la valeur de B56 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AE" & li).Value = os.Range("B57").Value 'place en colonne AE du classeur cible la valeur de B57 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AF" & li).Value = os.Range("B59").Value 'place en colonne AF du classeur cible la valeur de B59 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AG" & li).Value = os.Range("B60").Value 'place en colonne AG du classeur cible la valeur de B60 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AH" & li).Value = os.Range("B61").Value 'place en colonne AH du classeur cible la valeur de B61 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AI" & li).Value = os.Range("B62").Value 'place en colonne AI du classeur cible la valeur de B62 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AJ" & li).Value = os.Range("CB63").Value 'place en colonne JA du classeur cible la valeur de B63 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AK" & li).Value = os.Range("B64").Value 'place en colonne AK du classeur cible la valeur de B64 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AL" & li).Value = os.Range("B65").Value 'place en colonne AL du classeur cible la valeur de B65 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AM" & li).Value = os.Range("B66").Value 'place en colonne AM du classeur cible la valeur de B66 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AN" & li).Value = os.Range("B67").Value 'place en colonne AN du classeur cible la valeur de B67 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AO" & li).Value = os.Range("B70").Value 'place en colonne AO du classeur cible la valeur de B70 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AP" & li).Value = os.Range("B71").Value 'place en colonne AP du classeur cible la valeur de B71 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AQ" & li).Value = os.Range("B72").Value 'place en colonne AQ du classeur cible la valeur de B72 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AR" & li).Value = os.Range("D37").Value 'place en colonne AR du classeur cible la valeur de D37 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AS" & li).Value = os.Range("D38").Value 'place en colonne AS du classeur cible la valeur de D38 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AT" & li).Value = os.Range("D39").Value 'place en colonne AT du classeur cible la valeur de D39 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AU" & li).Value = os.Range("D41").Value 'place en colonne AU du classeur cible la valeur de D41 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AV" & li).Value = os.Range("D42").Value 'place en colonne AV du classeur cible la valeur de D42 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AW" & li).Value = os.Range("D43").Value 'place en colonne AW du classeur cible la valeur de D43 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AX" & li).Value = os.Range("D44").Value 'place en colonne AX du classeur cible la valeur de D44 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AY" & li).Value = os.Range("D45").Value 'place en colonne AY du classeur cible la valeur de D45 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("AZ" & li).Value = os.Range("D46").Value 'place en colonne AZ du classeur cible la valeur de D46 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("BA" & li).Value = os.Range("D47").Value 'place en colonne BA du classeur cible la valeur de D47 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("BB" & li).Value = os.Range("D49").Value 'place en colonne BB du classeur cible la valeur de D49 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("BC" & li).Value = os.Range("D67").Value 'place en colonne BC du classeur cible la valeur de D67 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("BD" & li).Value = os.Range("D70").Value 'place en colonne BD du classeur cible la valeur de D70 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("BE" & li).Value = os.Range("D71").Value 'place en colonne BE du classeur cible la valeur de D71 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("BF" & li).Value = os.Range("D72").Value 'place en colonne BF du classeur cible la valeur de D72 de l'onglet "DDS" du classeur source
    cc.Sheets("SYNTHESE").Range("BG" & li).Value = os.Range("B73").Value 'place en colonne BG du classeur cible la valeur de D73 de l'onglet "DDS" du classeur source
    cs.Close SaveChanges:=False 'ferme le classeur source sans enregistrer les changements
    fs = Dir 'définit fs comme le prochain fichier du dossier de ch
Loop 'boucle
End Sub

Est-ce qu'il y a moyen de simplifier ou de ne pas ouvrir les fichiers ?

Merci encore

Bonne soirée
Yannlion
 

yannlion

XLDnaute Junior
Bonjour tatiak,

Je pense ne pas être loin mais j'ai un message d'erreur ...
VB:
Option Explicit

' ***********************************************************************
' *****                                                             *****
' *****        CODE PierreP56 : http://tatiak.canalblog.com/        *****
' *****                                                             *****
' ***********************************************************************


Public Cnx As Object, Rst As Object


Sub Connect_xls(Ndf As String)
    Set Cnx = CreateObject("ADODB.Connection")
    Cnx.provider = "MSDASQL"
    Cnx.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
             "DBQ=" & Ndf & "; ReadOnly=False;"
    Set Rst = CreateObject("ADODB.Recordset")
End Sub


Function Select_Db(Req As String, Optional NoHead As Integer = 1) As Variant
Dim T As Variant, Rcd As Variant, f As Integer
Dim lig As Long, Col As Long, i As Long, j As Long

    On Error GoTo errhdlr
    ReDim Rcd(1 To 1, 1 To 1)
    Rst.Open Req, Cnx, 3
    lig = Rst.RecordCount
    If lig > 0 Then
        Rst.MoveFirst
        T = Rst.GetRows
        Col = Rst.Fields.Count
        ReDim Rcd(1 To lig + NoHead, 1 To Col)
        For j = 0 To Col - 1
            Rcd(1, j + 1) = Rst.Fields(j).Name
            For i = 0 To lig - 1
                Rcd(i + 1 + NoHead, j + 1) = IIf(IsNull(T(j, i)), Null, T(j, i))
            Next i
        Next j
    End If
    Select_Db = Rcd
    Exit Function
    
errhdlr:
    Rcd(1, 1) = "Erreur n°" & Err.Number & vbCrLf & Err.Description
    Select_Db = Rcd
    f = FreeFile()
    Open ThisWorkbook.Path & "\Log.txt" For Append As #f
    Print #f, Now() & " | " & Rcd(1, 1) & vbCrLf
    Close #f
End Function


Sub Close_Cnx(Optional x As Byte)
    On Error Resume Next
    If x > 0 Then Rst.Close
    If Cnx_IsOpen Then Cnx.Close
    Set Cnx = Nothing
    Set Rst = Nothing
End Sub


Function Cnx_IsOpen() As Boolean
    On Error Resume Next
    Cnx_IsOpen = (Cnx.State = 1)
End Function
' *************************************************************************************************




Sub Macro1()
Dim ch As String 'déclare la variable ch (CHemin d'accès)
Dim cc As Workbook 'déclare la variable cc (Classeur Cible)
Dim fs As Variant 'déclare la variable fs (FichierS)
Dim cs As Workbook 'déclare la variable cs (Claseur Source)
Dim os As Object 'déclare la variable os (Onglet Source)
Dim li As Long 'déclare la variable li (LIgne)
Dim Requete As String
Dim T As Variant

ch = "\\XXX\DEMANDES\" 'définit le chemin d'acces ch (à vérifier dans ton cas)
Set cc = ThisWorkbook 'définit le classeur cible cc
fs = Dir(ch & "*.xlsx") 'définit les fichiers du dossier de ch
Do Until fs = "" 'boucle tant que fs n'est pas vide
    li = IIf(cc.Sheets("SYNTHESE").Range("A2").Value = "", 2, cc.Sheets("SYNTHESE").Cells(Application.Rows.Count, 1).End(xlUp).Row + 1) 'définit la première ligne vide de la colonne A du classeur cible
    
    Connect_xls "ch & fs"
    T = Select_Db("SELECT * FROM [DDS$A1:D80]")
    cc.Sheets("SYNTHESE").Range("A" & li).Value = T(3, 3)
    cc.Sheets("SYNTHESE").Range("B" & li).Value = T(4, 6)
    cc.Sheets("SYNTHESE").Range("C" & li).Value = T(2, 1)

    
    Close_Cnx

    fs = Dir 'définit fs comme le prochain fichier du dossier de ch
Loop 'boucle
End Sub

"L'indice n'appartient pas à la sélection"

J'ai l'impression que la photo de mon tableau ne se fait pas ...

Yannlion
 

Discussions similaires

  • Question
Microsoft 365 XLOOKUP
Réponses
8
Affichages
400

Statistiques des forums

Discussions
312 108
Messages
2 085 361
Membres
102 874
dernier inscrit
Petro2611