Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Macro de recopiage

  • Initiateur de la discussion Initiateur de la discussion Toff28
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

T

Toff28

Guest
Bonjour,

Je tourne en rond depuis un moment car je dois créer un programme qui recopierais automatiquement des données d'un tableau à un autre sachant que les 2 tableaux ont des entrées dans un ordre différent et que le tableau qui reçois les données possède des entrées supplémentaire. Voir ci-joint.

Merci d'avance à ceux qui pourront m'aider.
 

Pièces jointes

Re : Macro de recopiage

Bonjour Toff, bonjour le forum,

J'ai placé la Tableau 2 dans un autre onglet pour faciliter le code. Jespère que ça conviendra...
En pièce jointe ton fichier modifié avec le code ci-dessous :
Code:
Option Explicit 'oblige à déclarer toutes les variables

Sub Macro1()
'**************************
'déclarations des variables
'**************************
Dim dc As Byte 'déclare la variable dc (Dernière Colonne)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim rl As Range 'déclare la variable rl (Recherche de la Ligne)
Dim li As Integer 'déclare la variable li (LIgne)
Dim i As Byte 'déclare la variable i (Incrément)
Dim rc As Range 'déclare la variable rc (Recherche de la Colonne)
Dim col As Byte 'déclare la variable col (COLonne)

'****************************
'efface les anciennes données
'****************************
With Sheets("Feuil2") 'prend en compte l'onglet "Feuil2"
    Set pl = .Range("A1").CurrentRegion 'définit la plage pl
    Set pl = pl.Offset(2, 1).Resize(pl.Rows.Count - 1, pl.Columns.Count - 1) 'redéfinit la plage pl (sans les étiquettes)
    pl.ClearContents 'efface le contenu de la plage pl
End With 'fin de la prise en compte de l'onglet "Feuil2"
Set pl = Nothing 'réinitialise la variable pl

'*********************
'transfère les données
'*********************
With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1"
    dc = .Cells(2, 256).End(xlToLeft).Column 'définit la dernière colonne éditée dc de la ligne 2
    dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la Colonne 1 (=A)
    Set pl = .Range("A3:A" & dl) 'définit la plage pl
    For Each cel In pl 'boucle 1 : sur toutes les cellules cel de la plage pl
        'définit la recherche rl (recherche la valeur de la cellule cel dans la colonne 1 (=A) de l'onglet "Feuil2")
        Set rl = Sheets("Feuil2").Columns(1).Find(cel.Value, , xlValues, xlWhole)
        If Not rl Is Nothing Then 'condition : si il existe au moins une occurrence trouvée
            li = rl.Row 'définit la ligne li
        Else 'sinon
            GoTo suite 'va à l'étiquette "suite"
        End If 'fin de la condition
        For i = 2 To dc 'boucle 2 : sur les colonnes 2 à dc
            'définit la recherche rc (recherche l'etiquette (ligne 2) de la cellule de la ligne de cel, colonne i,
            'dans la ligne 2 de l'onglet "Feuil2"
            Set rc = Sheets("Feuil2").Rows(2).Find(.Cells(2, i), , xlValues, xlWhole)
            If Not rc Is Nothing Then 'condition : si il existe au moins une occurrence trouvée
                col = rc.Column 'définit la colonne col
                Sheets("Feuil2").Cells(li, col).Value = .Cells(cel.Row, i) 'récupère la valeur du tableau 1 au tableau 2
            End If 'fin de la condition
        Next i 'prochaine colonne de la boucle 2
suite: 'étiquette
    Next cel 'prochaine cellule de la boucle 1
End With 'fin de la prise en compte de l'onglet "Feuil1"

'***************************************
'affiche l'onglet des données transférées
'***************************************
Sheets("Feuil2").Activate 'active l'onglet "Feuil2"
End Sub
Le fichier :

 

Pièces jointes

Dernière édition:
Re : Macro de recopiage

Bonjour Toff, Robert,

Un autre exemple en P.J, moins flexible que celui de Robert.
Il faut en effet l'adapter si le tableau de destination change ou si les intitulé des matières/Codes lignes dans le tableau 1 changent.

Bonne journée !

Code:

Code:
Application.ScreenUpdating = False

    Dim Cel As Range 'Variables
    Dim myRange As Range
    Set myRange = Range(Cells(3, 2), Cells(Cells(2, 256).End(xlToLeft).Column, Range("A65536").End(xlUp).Row))
    For Each Cel In myRange
   On Error Resume Next ' Si erreur on passe à la cellule suivante
   Ordo = Sheets("Feuil2").Range("E6:K6").Cells.Find(Cells(2, Cel.Column)).Column 'L3:R3 à changer si le tableau destination change, ce sont les matières Anglais, Espagnol ...
   Absc = Sheets("Feuil2").Range("D7:D16").Find(Cells(Cel.Row, 1).Value).Row 'K4:K13 à changer si le tableau destination change, ce sont les codes de lignes F, PS ...
   Sheets("Feuil2").Cells(Absc, Ordo).Value = Cel.Value
   Next Cel
   
Application.ScreenUpdating = True
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

  • Question Question
Microsoft 365 problème d'index
Réponses
19
Affichages
497
Réponses
1
Affichages
234
Réponses
6
Affichages
321
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…