Aide VBA copier - coller des cellules spécifiques sur un autre fichier

Bonjour,

Je vous sollicite car je suis face à une impasse.

Voici le problème :

J'aimerais un code VBA qui doit ouvrir un classeur avec par exemple 4 feuilles avec des données , (ces données possédant chacune des entêtes , comme par exemple : nom et date)

Que la macro serait capable de savoir lorsqu’il s’agit d’un nom et d’une date, et que lorsque c’est un nom, il copierait la colonne entière dans un fichier cible

et idem pour la date, lorsque l'entête indique "date", il passerait à la ligne suivante et ensuite copierait l'intégralité de la colonne dans un autre fichier cible à l'emplacement "date".

Et qu'ensuite, il marquerait que le fichier a été traité.

Voilà ce que j'ai fait :

Option Explicit

Sub TransferDataV2()

'transfert de données

Dim strPath2 As String

Dim wbkWorkbook1 As Workbook

Dim wbkWorkbook2 As Workbook

'définir les noms

strPath2 = "Classeur3.xlsx"

'ouvrir les dossiers

Set wbkWorkbook1 = ThisWorkbook '#changer

Set wbkWorkbook2 = Workbooks.Open(strPath2)

'#copier les valeurs

'#changer la feuille et ranger ce dont j’ai besoin

wbkWorkbook2.Worksheets("Feuil1").Range("A1:B4").Value = _

wbkWorkbook1.Worksheets("Feuil1").Range("A1:B4").Value

'fermeture du fichier

wbkWorkbook2.Close (True)

End Sub

Il manque pas mal d'étapes, mais c'est ce que j'ai réussi à faire pour l'instant. Voici le fichier que j'essaye de copier pour l'instant :

18classeur2.xlsx (15.63 Ko)

Bonjour Shayou, bonjour le forum,

Pas sûr d'avoir bien compris tes explications... Une proposition à placer dans le fichier destination (Celui qui reçoit les données ) :

Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TD As ListObject 'déclare la variable TD (Tableau structuré Destination)
Dim TS As ListObject 'déclare la variable TS (Tableau structuré Source)
Dim EF As FileDialog 'déclare la variable EF (Explorateur de Fichiers)
Dim LR As Integer 'déclare la variable LR (Ligne de Référence)
Dim CR As Integer 'déclare la variable CR (Colonne de Référence)
Dim RN As Range 'déclare la variable RN (Recherche de Nom)
Dim RD As Range 'déclare la variable RD (Recherche de Date)
Dim R As Range 'déclare la variable R (Recherche)
Dim LI As Integer 'déclare la variable LI (LIgne)

Set CD = ThisWorkbook 'définit la classeur Destination CD
Set OD = CD.Worksheets(1) 'définit l'onglet Destination  OD (ici le premier, à adapter à ton cas)
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set TD = OD.ListObjects("TResult") 'définit le tableau destination TD (génère ue erreur si "TResult" n'existe pas)
If Err > 0 Then 'condition : si une erreur a été générée
    Err.Clear 'supprime l'erreur
    OD.Range("A1").Value = "Nom" 'Nom en A1 de l'onglet OD
    OD.Range("B1").Value = "Date" 'Date en B1 de l'onglet OD
    OD.ListObjects.Add(xlSrcRange, Range("$A$1:$B$2"), , xlYes).Name = "TRésult" 'crée un tableau structuré nommé "TResult"
    Set TD = OD.ListObjects("Tableau1") 'définit le tableau structuré destination TD
End If 'fin de la condition
TD.DataBodyRange.Delete 'efface les anciennes valeurs de TD
On Error GoTo 0 'annule la gestion des erreur
Set EF = Application.FileDialog(msoFileDialogFilePicker) 'définit l'explorateur de fichier EF
EF.AllowMultiSelect = False 'n'autorise la sélection que d'un seul fichier
EF.Show 'affiche
If EF.SelectedItems.Count > 0 Then Set CS = Workbooks.Open(EF.SelectedItems(1)) 'si un fichier est sélectionné, définit le classeur source CS en l'ouvrant

For Each O In CS.Sheets 'boucle sur tous les onglets O du classeur source
    Set TS = O.ListObjects(1) 'définit le tableau structuré source TS de l'onglet de la boucle
    LR = TS.HeaderRowRange(1, 1).Row 'définit la ligne de référence LR
    CR = TS.HeaderRowRange(1, 1).Column 'définit la colonne de référence CR
    Set RN = O.Rows(LR).Find("Nom", , xlValues, xlWhole) 'définit la recherche RN (Recherche "Nom" dans la ligne de référence LR de l'onglet O)
    If Not RN Is Nothing Then 'condition 1 : s'il existe à moins une occurrence trouvée
        TD.Resize TD.Range.Resize(TD.ListRows.Count + TS.ListRows.Count, TD.ListColumns.Count) 'redimensionne TD
        Set R = TD.ListColumns(1).Range.Find("") 'définit la recherche R (recherche du vide dans la colonne 1 de TD)
        If R Is Nothing Or TS.ListRows.Count = 0 Then 'condition 2 : si aucune occurrence trouvée ou si TD ne contient aucune ligne
            TD.ListRows.Add 'ajoute une ligne à TD
            LI = TD.ListRows.Count 'définit la ligne LI (dernière ligne de TD)
        Else 'sinon (au moins une occurrence trouvée)
            LI = R.Row - TD.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée moins la ligne des en-têtes de TD)
        End If 'fin de la condition 2
        'copie la colonne  de RN (sans l'en-tête) et la colle dans les données de TD ligne LI, colonne 1
        TS.DataBodyRange.Columns(RN.Column - CR + 1).Copy TD.DataBodyRange(LI, 1)
    End If 'fin de la condition 1
    Set RD = O.Rows(LR).Find("Date", , xlValues, xlWhole) 'définit la recherche RN (Recherche "Date" dans la ligne de référence LR de l'onglet O)
    If Not RD Is Nothing Then 'condition 3 : s'il existe au moins une occurrence trouvée
        'copie la colonne  de RD (sans l'en-tête) et la colle dans les données de TD ligne LI, colonne 2
        TS.DataBodyRange.Columns(RD.Column - CR + 1).Copy TD.DataBodyRange(LI, 2)
    End If 'fin de la condition 3
Next O 'prochain onglet de la boucle
CS.Close False 'ferme le classeur source sans enregistrer
End Sub

INCROYABLE !! Et par le plus grand hasard c'est possible de les traiter seulement par date?

C'est à dire que si un fichier A est en date du 12/02/2022, et que je veux traiter seulement ceux qui ont été modifié pour la dernière fois le 10/01/2020, et bien le fichier A ne sera pas traité.

Bien cordialement !

Bonjour Shayou, bonjour le forum,

Peux-tu envoyer une fichier exemple avec le problème avant dans un onglet et le résultat souhaité après dans un autre. Car je ne sais pas si tu veux les noms et les dates dans le même fichier comme dans ma première proposition...

Rechercher des sujets similaires à "aide vba copier coller specifiques fichier"