Incrémentation de données vers autre fichier

Oui ! Il faut chercher sur une colonne jamais vide, sinon tu risques d'avoir un bazard à la fin !...

Génial, la macro fonctionne au top.

Par contre, j'ai encore deux petits problèmes ...

1 - Quand j'appuie sur mon bouton qui incrémente les données, elles se mettent à la suite des données déjà saisies. A l'idéal, un appui sur le bouton serait en fait une mise à jour des données. Donc je pense qu'il faudrait supprimer les données déjà intégrées, puis de les réintégrer à nouveau. Tant pis si ça efface des données et recopie les mêmes ... Ca rallonge un peu la macro mais ce n'est pas très grave.

2 - Toutes les données du tableau cibles ne sont pas alimentées automatiquement (colonne K, L, N, R et S)

Certaines d'entres elles (L, N et R) contiennent des formules. Donc dans ce cas là, pas de problème, la formule se recalcule à chaque fois.

Par contre, les cellules des colonnes K et S sont saisies manuellement. Donc ca peut causer des décalages ...

Exemple : 4 lignes sont copiées du fichier 1. Si après une autre saisie, il y en a 5, les saisies manuelles vont se retrouver décaler et n'auront donc plus aucun intérêt. Ou si il y en a encore 4, mais que ce sont plus les mêmes, les saisies manuelles, encore une fois, n'ont plus aucun intérêt ...

Autant le premier problème peut être résolu facilement à mon avis ... Autant le deuxième ... Je ne vois pas comment m'y prendre.

Merci !

Cordialement,

Un peu de mal à suivre ton cheminement...

Soit on peut tout effacer (sauf l'en-tête) et une ligne suffit pour effacer.

On peut même y aller globalement.

ActiveSheet.UsedRange.Offset(1).ClearContents

ActiveSheet si le bouton est sur la feuille (sinon qualifier précisément), Offset(1) si une seule ligne d'en-tête (sinon augmenter).

Si tout n'est pas à effacer, les colonnes à effacer sont certainement celles qu'on affecte... donc tu disposes d'un tableau de ces colonnes. De quoi faire une boucle pour effacer successivement chaque colonne à effacer.

Le dimensionnement peut être fait par :

n = ...........UsedRange.Rows.Count

tout à fait acceptable pour un effacement.

Et par exemple :

For i = 0 to 14
    .Cells(2, rgC(i)).Resize(n).ClearContents
Next i

Il faut effectivement supprimer les colonnes insérés précédemment uniquement.

Je vais donc essayer de mettre en place ce que vous m'avez suggéré pour que les lignes ne soit pas inscrite deux fois ...

Vous ne comprenez pas mon deuxième problème ? Les deux colonnes saisies manuellement ne vont pas suivre les autres données.

Exemple : j'appuie sur le bouton. La macro trouve un seul ESC en AE de tous les fichiers, il s'agit de la ligne 300 de mon premier fichier testé. Sur la première ligne (ligne 16), je marque manuellement dans la cellule K16 "Saisie" et dans la cellule S16 "Oui".

Je veux mettre à jour le tableau ESC, donc j'utilise à nouveau le bouton. La macro trouve cette fois deux fois ESC en AE. En ligne 200 du premier fichier, et comme la première fois, en ligne 300 du premier fichier.

La ligne 300 va cette fois se recopier dans la ligne 17 de mon fichier cible, et non plus en ligne 16 comme tout à l'heure.

Ce qui fait que, en K16 et en S16, la saisie manuelle devrai se retrouver en K17 et S17 ...

Pour pallier à ça, il faudrait, par exemple, ne recopier que les lignes qui n'ont pas déjà été recopié ...

Mais cela pose problème également. Car certaines cellules du fichier source peuvent ne pas avoir été saisie lors de mon premier click sur bouton, mais l'avoir été lors de mon deuxième click ... Dans ce cas là, j'aimerais que les nouvelles infos soient inscrites ...

Le problème est en cela compliqué à gérer ...

Avez-vous une idée ?

Pas bien compris ton système de marquage manuel, mais il me semble mal adaté à ta façon de procéder par ailleurs.... !?

Bonjour MFerrand,

Disons que certaines données, celles des cellules des colonnes K et S, ne se situent pas, et ne peuvent pas se situer, sur les fichiers source. Pourtant, elles doivent apparaître car il s'agit d'informations importantes ...

Concernant la suppression des colonnes alimentées en début de macro, je ne comprends pas vraiment ta solution, et je ne parviens pas à la mettre en place. N'est-il pas plus simple, en début de macro, d'insérer une ligne Clear Contents pour toutes les colonnes définis dans rgC, à partir de la ligne 15 ?

Restera ensuite pour moi le problème de sauvegarde de l'historique, il faut que je réflechisse sur ce point.

Merci.

C'est bien ce que j'ai dit pour l'effacement ! (sauf que par habitude, j'ai dit ligne 2 et non 15).

Si tes lignes transférées peuvent être identifiées individuellement, la solution pourrait être de prélever les mentions ajoutées avant effacement, les stocker dans un tableau avec un identificateur de ligne, les réinscrire après mise à jour.

Cordialement.

Ah c'est ce que tu dis dans ton code ... Désolé !

Dans ce cas, je ne vois l'utilité ni du dimensionnement, n = ...... UsedRange.Rows.Count, ni de la boucle For i = 0 to 14 ...

Le dimensionnement, c'est pour renseigner la dernière ligne à effacer ? C'est ça ?

Et la boucle ... Je ne vois pas.

Effectivement, cela pourrait résoudre le problème mais la difficulté réside à les identifier individuellement ...

Ce n'est pas ce qui me préoccupe le plus pour le moment. Si dans un premier temps il n'y a pas de saisie manuelle, tant pis.

Ma préoccupation du moment est plutôt l'historique des données.

Il faudrait que toutes les lignes, avant d'être effacées, soient stockées dans une feuille nommée "Historique".

Il faudrait aussi, je pense, supprimer les lignes doublons. Car du coup il va y en avoir beaucoup ...

Trouvez-vous la démarche cohérente ?

Trouvez-vous la démarche cohérente ?

Non ! Un historique est en quelque sorte un stockage daté... Il te permet par exemple de savoir que telle ligne était présente à la date x, qu'elle l'était toujours à la date y, et qu'elle ne l'est plus à la date z, d'où supprimer des doublons dans un historique, c'est supprimer des informations historiques que l'historique a pour fonction de fournir...

Pour l'identification des lignes, s'il n'y pas de champs dont les valeurs soient uniques, il devrait y avoir un groupage de colonnes qui, ensemble tiennent lieu de valeur unique... sinon comment les identifies-tu pour annoter ?

.UsedRange.Rows.Count permet de définir un nombre de lignes à effacer, de façon globale, il sera un peu supérieur à ce qui serait strictement nécessaire mais pour effacer un petit débordement ne nuiera pas.

Et la boucle, elle sert à parcourir la variable rgC qui, listant les colonnes à servir, liste du même coup les colonnes à effacer.

Cordialement.

Dans les cellules incrémentées, il y a des dates de début et dates de fin, en colonne O et en colonne P.

Il faudrait que, si la date d'aujourd'hui est supérieure à la date de fin, alors la ligne n'apparaisse plus dans l'onglet "ESC" mais dans l'onglet "Historique".

En gros, dans l'onglet ESC : Chaque fois que j'appuie sur le bouton, toutes les données du tableau sont réactualisées à chaque fois.

Et au début de la macro, on indique que, si la date d'aujourd'hui est supérieure à la date de fin, colonne P, alors la ligne bascule dans l'onglet historique, puis s'efface. Sinon, elle s'efface juste car la ligne à encore un effet sur aujourd'hui. Le truc c'est que : même si la date de fin est passée, il est possible que la ligne apparaisse encore dans le fichier source. Dans ce cas, la ligne sera, une nouvelle fois intégré. Et lors du prochain click sur le bouton, il ne faudrait pas que la ligné réapparaisse dans l'historique, étant donnée qu'elle y est déjà.

Vous parlez donc de l'ajout d'une colonne, avec des concaténations d'autres cellules de la ligne, permettant de la rendre unique, c'est ça ?

Il faudra sans doute utiliser ce genre de stratagème pour l'historique.

D'accord merci j'ai compris, je teste ça.

Cordialement,

J'ai du mal à suivre ton itinéraire, ne sachant de quoi il retourne... Là tu définis soit une autre procédure à lancer indépendamment de la première, soit des modifications substancielle de la procédure élaborée initialement...

Dans un cas comme dans l'autre, pour un résultat rationnel il faut que tu aies défini exactement tout ce qui doit être fait, et dans quel ordre. Sans quoi, tu passeras ton temps en modifications perpétuelles...

Un identifiant unique par concaténation des valeurs de plusieurs champs est en effet l'idée... mais il n'est pas forcément nécessaire de le matérialiser dans une colonne pour s'en servir.

Je comprends. Je vais essayer de mettre aux ordre mes idées.

Sub VersESC()
    Dim TT(), rgC, rgS, wbS, AR%, n%, i%, j%, x%
    rgC = Array(4, 5, 6, 7, 8, 9, 10, 13, 15, 16, 17, 20, 21, 22, 23)
    rgS = Array(33, 34, 35, 36, 37, 38, 11, 3, 43, 44, 45, 6, 7, 8, 5)
    wbS = ThisWorkbook.Worksheets("Tables").Range("T2:T16").Value
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    n = ActiveSheet.UsedRange.Rows.Count
    For i = 0 To 14
        ActiveSheet.Cells(15, rgC(i)).Resize(n).ClearContents
    Next i
    For AR = 1 To UBound(wbS)
        With Workbooks.Open(wbS(AR, 1))
            With .Worksheets("Tableau")
                n = .Cells(.Rows.Count, 3).End(xlUp).Row
                For i = 15 To n
                    If .Cells(i, 31) = "ESC" Then
                        ReDim Preserve TT(14, x)
                        For j = 0 To 14
                            TT(j, x) = .Cells(i, rgS(j))
                        Next j
                        x = x + 1
                    End If
                Next i
            End With
            .Close False
        End With
        If x > 0 Then
            With ThisWorkbook.Worksheets("ESC")
                n = .Cells(.Rows.Count, 13).End(xlUp).Row + 1
                For i = 0 To UBound(TT, 2)
                    For j = 0 To 14
                        .Cells(n + i, rgC(j)) = TT(j, i)
                    Next j
                Next i
            End With
            Erase TT: x = 0
        End If
    Next AR
    Application.EnableEvents = True
End Sub

Dans tous les cas, ce premier code est top, merci beaucoup. L'effacement des cellules avant l'incrémentation fonctionne bien.

Ah d'accord, pas besoin d'une colonne ... C'est que j'ai l'habitude d'utiliser des colonnes pour les concaténations moi afin de faire des recherchev.

Bon, j'essaye de trouver ce qui correspond réellement à mon attente et reviens vers vous.

Merci beaucoup.

Cordialement,

Très bien ton ajout ! Tu voies qu'il faut décider de se lancer...

Mettre dans une colonne c'est un réflexe Excel, le réflexe VBA est de travailler avec un tableau hors Excel...

Mais c'est super compliqué de se lancer !

Oui j'ai bien compris ça désormais.

Bonjour !

Alors voilà, je pense que tout est faisable en une macro !

Cela ressemble à ce que j'avais déjà expliqué, mais en plus concret.

Voilà :

La partie qui est pour le moment réalisé est parfaite comme cela, il n'y a pas à y toucher.

(j'ai uniquement changer les numéros de colonnes pour compter le nombre de lignes utilisées, dans les fichiers sources comme dans le fichier cible).

Il faudrait rajouter une colonne, en T, dans laquelle serait inscrit "En cours" ou "Terminé". Dans cette colonne, il y aurait une simple formule =si(aujourdhui()>P15;"Terminé";"En cours"). P15 étant la date de fin.

Dans la définition du tableau en début de macro, il faut donc changer les (20,21,22,23) par (21,22,23,24), car les 4 cellules qui sont incrémentés sont, de fait, décalées.

Je crois que c'est tout ce qu'il y a à modifier suite à ce rajout de colonne ...

Ensuite : au lieu de supprimer directement toutes les cellules déjà incrémentés, il faut mettre en place un test, avec une boucle, du même style que celui qui recherche "ESC" en colonne AE. Sauf que cette fois-ci, la macro chercherait "Terminé" en colonne T.

S'il trouve, alors toute la ligne, disposé exactement de la même manière, viendra se copier dans un autre onglet, "Historique", à partir de la ligne 15 également. Une fois le test effectué pour toute les lignes, alors le contenu de toutes les cellules de l'ESC pourront être supprimées.

Autre critère à rajouter : la ligne "Terminé" peut réapparaître dans l'ESC ensuite, si elle n'a pas été supprimée du fichier source dans lequel elle était. Dans ce cas, elle ne doit pas se recopier une nouvelle fois dans l'onglet "Historique" lorsque je recliquerai sur le bouton, c'est inutile. Un test peut alors être effectué, grâce à une concaténation, afin de vérifier si la ligne est, oui ou non, déjà intégrée dans l'Historique. Une concaténation des colonnes E, O, P et T (5, 15, 16 et 20) serait infaillible. Si (5, 15, 16 et 20) de "ESC" à copier se situe déjà quelque part (de la ligne 15 à la ligne n, qui compterait une nouvelle fois le nombre de lignes utilisées) en (5, 15 ,16 et 20) de l'onglet "Historique", alors on ne recopie pas. Sinon, on recopie.

J'espère avoir été, cette fois, clair et concis.

Quel est votre avis là dessus ? Fiable ? Utile ? Réalisable ?

Merci beaucoup !

Edit : Ah bah je viens de m'apercevoir qu'on pouvait pas créer un onglet qui se nomme "Historique" x) Je vais donc l'appeler "Histo"

Bonjour,

Je n'ai pas suivi ton cheminement dans le détail, mais la trame globale me paraît cohérente... Vas-y donc et reviens en cas de difficulté ponctuelle de codage de tel ou tel fragment...

Cordialement.

Re ! Je n'en suis qu'au tout début, et c'est déjà une galère monstre ...

J'ai remplacé cette partie du code :

   
n = ActiveSheet.UsedRange.Rows.Count
    For i = 0 To 14
        ActiveSheet.Cells(15, rgC(i)).Resize(n).ClearContents
    Next i
 

Par :

   

 n = ActiveSheet.UsedRange.Rows.Count
    For i = 0 To 14
        For j = 15 To n
            If ActiveSheet.Cells(j, 20) = "Terminé" Then
                Rows("j:j").Select
                Selection.Copy
                    With ThisWorkbook.Worksheets("Histo")
                        .Select
                        x = .Cells(.Rows.Count, 21).End(xlUp).Row + 1
                        Rows("x:x").Select
                        Selection.Paste
                    End With
            End If
        Next j
    Next i

Alors je pense que ce code ne va pas du tout vous plaire ...

J'ai jusque là essayé de créer la boucle, fait le test pour savoir si "Terminé" était inscrit dans la colonne T, et, si c'est le cas, copier coller la ligne.

Sans pour l'instant donc me soucier du problème : est-ce que ma concaténation des 4 colonnes et déjà présente dans l'historique ou pas ?

Evidemment, vous vous en doutez, les lignes ne veulent pas se sélectionner, je n'arrive même pas à sélectionner une ligne sous forme de variable, malgré mes recherches sur internet ...

Alors je pense que ce code ne va pas du tout vous plaire ...

Bien vu !

Mais sais-tu pourquoi ?

3 Select + 2 Selection en si peu de lignes, c'est une véritable provocation !

Toute sélection doit être prohibée, dès lors que ce n'est pas le but ultime de l'action. Il est admissible de sélectionner pour montrer à l'utilisateur une partie qui n'est pas en vue à ce moment-là. Et normalement, ça s'arrête à la suite...

Sinon, non seulement on évite de sélectionner mais si tout se passe hors de vue, c'est encore mieux !

C'est un excellent moyen de s'affranchir de l'influence de l'enregistreur lorsqu'on a eu le malheur de la laisser s'installer, et de prendre l'habitude de penser que lorsqu'on travaille en VBA, si on travaille avec et pour Excel , on ne travaille pas sur Excel, on a donc d'autres méthodes et on réduit au minimum toute interaction avec Excel, ce qui donnera un peu de vélocité à VBA...

Ceci étant précisé, ayant la faiblesse de penser que j'ai raison (critères de longueur du code, de lisibilité [temps de lecture], oude durée d'exécution, critères mesurables), et que si ce que je peux dire reste sans effet je ne vois pas de raison de poursuivre, je précise donc pour la suite que si j'entrevois la moindre queue d'un Select, ma collaboration au sujet cessera sans préavis, son incidence étant nulle je perdrais mon temps à la prolonger.

A part cela, ton code appelle quelques autres remarques :

Sous réserve que l'on ne voit pas le début et la fin, et qu'il ne s'agit que d'un fragment de code détaché...

Je conçois que tu puisse trouver difficile au départ d'opérer sans copier-coller, ce qui t'assurerait pourtant une meilleure exécution, mais laissons cela de côté pour l'instant, car il importe aussi de maîtriser le copier-coller de façon un peu plus optimale.

Ta feuille active n'est pas mise sous bloc With. Tu envisages effectivement d'utiliser un bloc With pour ta feuille histo, qu'il vaut mieux alors ne pas inclure dans le précédent. Bien raisonné de ce point vue. Mais ensuite tu perds tes repères : ta feuille n'est pas nommée mais pointée par ActiveSheet, dans la foulée les expressions renvoyant des plages ne sont pas qualifiées, elles restent dépendantes du fait que la feuille active le reste (la non qualification fournit de toute façon un code moins précis et plus lent...), ajoutons comme on l'a vu que tu procèdes par sélection sur la première feuille d'abord, puis sur la suivante, passé le premier tour de boucle (après le premier collage, sous réserve d'autres erreurs) tu n'es pas revenu sur la première feuille et ta procédure va planter...

Je pense qu'il y a intérêt à mettre sous bloc With la première feuille sur laquelle on cherche et copie et affecter la feuille où l'on colle à une variable Worksheet [à déclarer] (ce qui simplifie l'écriture et conserve un accès rapide à la feuille). Et dans la foulée tu prélèves la dernière ligne de ta feuille histo, ce qui te fera gagner un peu de temps... (voir plus loin)

    Set wsH = ThisWorkbook.Worksheets("Histo")
    x = .Cells(Rows.Count, 21).End(xlUp).Row
    With ActiveSheet

Utiliser ActiveSheet ou le nom de la feuille importe peu, une fois en mémoire, son accès est garanti. Il convient bien sûr qu'elle soit active au démarrage, ce qui est normalement le cas si la proc. est lancée par un bouton de la feuille, (sous réserve du code qui précède...)

Point suivant : dans la mesure où tu ne cherches pas à effacer, mais parcourant les lignes pour tester certaine valeur, il est préférable d'être plus précis en utilisant End(xlUp) (NB- pour l'effacement tu avais signalé la possibilité d'inégalités selon les colonnes, donc UsedRange grantissait qu'on soit au bon niveau, sinon au-delà, pour effacer ; on effaçait dans le lot quelques cellules vides, aucun problème à cet égard, mais inutile ici de parcourir et tester au moins 14 cellules vides)

        n = .Cells(.Rows.Count, 20).End(xlUp).Row

définition de n sur la colonne T puisque c'est celle que tu testes.

Vient ensuite ta boucle i de 0 à 14 : une telle boucle était destinée ailleurs à parcourir les colonnes (indiquées dans une variable tableau), ce que tu ne fais nullement ici. Elle ne sert donc à rien ! Mais de plus elle va avoir pour effet de répéter 15 fois l'opération que tu veux faire !!! (Je te laisse imaginer...)

A supprimer donc.

On passe donc directement à l'initialisation de l'autre boucle, qui devient l'unique, et test sur la colonne T.

        For j = 15 To n
            If .Cells(j, 20) = "Terminé" Then

Ensuite, ça se corse un peu, Rows("j:j") ça va faire grincer des dents VBA, il aura du mal à trouver la ligne J !

j est un Integer et à ce titre on évite surtout de mettre de guillemets. Rows(j) suffit (on n'a qu'une ligne, inutile de mettre 2 fois le numéro. Et si on en avait plusieurs ce serait : Rows(j & ":" & k).

Tu vas donc copier cette ligne. Je préfèrerais qu'on cadre sur la partie utile à copier (qui est certainement connue) mais pas tout à la fois , faisons avec la ligne cette fois. Si la condition est vérifiée, (et si on a pris soin de prélever la dernière ligne utilisée de la cible, il suffit d'incrémenter cette dernière et coller, ce qui se fait en une ligne de code :

                x = x + 1
                .Rows(j).Copy wsH.Rows(x)
            End If
        Next j
    End With

Je reste intrigué que tu définisses la ligne sur la colonne 21 pour histo. J'espère que cela ne reflète pas un décalage entre les deux feuilles, car le copier-coller de la ligne entière fait naturellement coincider les colonnes (et la copie ligne entière serait dans ce cas inadéquate).

Cordialement.

Bonjour MFerrand,

D'accord, j'ai bien compris pour les Select et Selection, promis !

Effectivement, si je ne retourne pas sur l'onglet ESC avant la fin de ma boucle, cela ne peut pas fonctionner ...

Voici le code retravaillé :

Private Sub TestHisto_Click()

    Dim TT(), rgC, rgS, wbS, AR%, n%, i%, j%, x%
    Dim Wsh As Worksheet
    rgC = Array(4, 5, 6, 7, 8, 9, 10, 13, 15, 16, 17, 21, 22, 23, 24)
    'Définition du tableau, les chiffres correspondent aux colonnes du fichiers cibles où les cellules vont être dupliquées
    rgS = Array(33, 34, 35, 36, 37, 38, 11, 3, 43, 44, 45, 6, 7, 8, 5)
    'Définition du tableau, les chiffres correspondent aux colonnes du fichiers source à dupliquer
    'Les cellules de la colonne 33 du fichier source vont être dupliquées sur les cellules de la colonne 4 du fichier cible, etc ...
    wbS = ThisWorkbook.Worksheets("Tables").Range("T2:T16").Value
    'wbs définit le tableau de T2 à T16 de l'onglet table. Le tableau comprend tout le chemin et tous les fichiers à ouvrir (15)
    Application.ScreenUpdating = False
    'La macro tourne sans qu'on le voit à l'écran. Cela accélère la macro.
    Application.EnableEvents = False
    'Les macros renseignées dans workbook open de chaque fichier ne s'exécute pas.

    Set Wsh = ThisWorkbook.Worksheets("Histo") 'Affecte la feuille "Histo" à la variable
    x = Wsh.Cells(Rows.Count, 20).End(xlUp).Row 'Dimensionne le nombre de lignes non vides sur la feuille historique
    With ActiveSheet
        n = .Cells(.Rows.Count, 20).End(xlUp).Row 'Dimensionne le nombre de lignes non vides sur la feuille ESC
        For j = 15 To n 'boucle pour toutes les lignes du tableau ESC

            If .Cells(j, 20) = "Terminé" Then
                x = x + 1 'X+1 pour insérer à la ligne suivante
                .Rows(j).Copy Wsh.Rows(x) 'copie la ligne j(ESC), et la colle en ligne x(Histo)
            End If
        Next j
        .Cells(15, rgC(i)).Resize(n).ClearContents 'Supprime le contenu des colonnes du tableau rgC (cad toutes les colonnes des cellules incrémentées),à partir de la ligne 15 et jusqu'à n
    End With

    For AR = 1 To UBound(wbS)
    ' Boucle. Toutes les actions inscrites entre For AR et Next AR seront répétées 15 fois. (Ubound(wbS) au lieu de 15, au cas
    'où le nombre de fichier venait à augmenter
        With Workbooks.Open(wbS(AR, 1)) 'le fichier se trouvant en (AR,1) de la table wbS s'ouvre (1,1; puis 2;1 etc, la macro
                                        'va donc ouvrir tous les fichiers)
            With .Worksheets("Tableau") ' Nouveau bloc with pour identifier la feuille dans laquelle il va falloir prélever les données.
                n = .Cells(.Rows.Count, 6).End(xlUp).Row 'n=la dernière ligne utilisée par la sixième colonne (colonne F, mat)
                                                         'on pourrait choisir une autre colonne mais la colonne F ne peut être vide.
                For i = 15 To n 'Pour toutes les colonnes utilisées dee l'onglet "Tableau"
                    If .Cells(i, 31) = "ESC" Then 'Si en i,31 (colonne AE), il y a marqué ESC, alors
                        ReDim Preserve TT(14, x) '
                        For j = 0 To 14
                            TT(j, x) = .Cells(i, rgS(j))
                        Next j
                        x = x + 1 'Cela permet que la deuxième ligne enregistré n'écrase pas la première
                    End If
                Next i ' Recommence l'action pour la ligne 16 du fichier source, puis 17, 18, jusqu'à n, la dernière.
            End With
            .Close False 'Ferme le fichier. Close permet de ne pas l'enregistrer. Cela évite de devoir faire "non" manuellement
                         'pour la fermeture des 15 fichiers.
        End With
        'Ce premier gros bloc with concernait la recherche des données dans le fichier source. Désormais, il va falloir incrémenter
        'le fichier cible, c'est l'objectif de cedeuxième bloc with
        If x > 0 Then 'Si au moins une ligne du fichier a été sauvegardée (s'il y avait au moins 1 fois ESC en "AE")
            With ThisWorkbook.Worksheets("ESC") 'Bloc with pour identifier dans quelle feuille il va falloir incrémenter les données.
                n = .Cells(.Rows.Count, 21).End(xlUp).Row + 1 'n=la dernière ligne utilisée par la 21ème colonne (colonne U, mat)
                                                              'Il est important de choisir une colonne qui ne peut être vide, cela pourrait ruiner la macro.
                                                              'Même si toutes les infos ne sont pas alimentées dans le fichier source, la colonne avec
                                                              'le mat apparaît forcément. +1 à la fin car il faut écrire la ligne
                                                              'sur la ligne d'après la dernière, pour n'en écraser aucune
                For i = 0 To UBound(TT, 2)  'Nouvelle boucle pour copier les lignes
                    For j = 0 To 14 'Répète l'action de la ligne suivant pour j=1, j=2 etc jusqu'à 14.
                        .Cells(n + i, rgC(j)) = TT(j, i) 'Renseigne les données du tableau TT au bon endroit dans l'ESC
                    Next j
                Next i
            End With
            Erase TT: x = 0 'X=0 à nouveau, pour repartir de 0 pour le fichier suivant.
        End If
    Next AR 'Refait tout pareil pour le 2ème fichier, le 3 ème, etc, jusquà Ubound (c'est à dire pour les 15 fichiers).
    Application.EnableEvents = True 'Réactive à nouveau les évènements.
End Sub

J'ai espacé la partie sur laquelle nous travaillons actuellement.

Dans ce code, que j'espère avoir correctement retranscrit en fonction de vos idées, j'ai rajouté la partie qui supprime tout le contenu inséré jusque là, avant de refermer le bloc with.

Malheureusement, cela ne fonctionne pas : chaque fois que la macro se lance, les données inscrites précédemment ne s'efface pas.

EDIT : Erreur bête, je n'avais pas insérer la boucle For i = 0 to 14. Désormais, la suppression fonctionne.

Problème : la macro insère les noms à partir de la ligne 29 et non 15 comme il le faudrait.. C'est la partie sur l'historique qui provoque ce problème car, sans elle, ça fonctionne correctement. Je pense que c'est la boucle j qui cause le problème, mais je ne sais pas pourquoi ça fait ça ...

Par contre, les lignes qui correspondent au critère sont parfaitement copiées/collées d'un onglet à l'autre. Seul petit bémol : j'aimerais coller en valeur uniquement. J'ai vu sur internet que la propriété pour coller en valeur était la suivante : PasteSpecial xlPasteValues. Mais étant donné que le code que vous m'avez donnée n'est pas sous cette forme ...

Ne restera plus que créer une table ( ou deux ? Avec les mêmes colonnes, juste la feuille qui change ), du même style que rgS et rgC. Il faudra ensuite vérifier, pour toutes les lignes utilisées de la table 2 (onglet histo), si il n'y en a pas une qui est égale à la table 1 (ligne j onglet histo). Si une correspond, alors la ligne entière n'est pas collée. Sinon, elle l'est. Ai-je, cette fois, un raisonnement qui tient la route ? Ou toujours pas ... ? x)

EDIT : Après réflexion, plutôt que ne pas insérer la ligne si elle y est déjà, il faudrait la remplacer. Je m'explique :

Les colonnes à tester sont E, O, P et U. Si les valeurs de ces colonnes (ligne j prélevée dans ESC), sont déjà présentes quelque part dans l'onglet "Histo", alors j'efface la ligne déjà présente, et la remplace par la nouvelle. Effectivement, toutes les colonnes ne seront pas toujours remplies par les utilisateurs. Si l'un d'entre eux se met à en compléter une alors que l'action est déjà terminée, j'aimerais que ce complément s'affiche dans l'onglet historique. Or, avec l'ancienne méthode, ça n'aurait pas été le cas si un utilisateur avait déjà lancé la macro entre la date de fin d'action et la date de modification.

Merci beaucoup !

Cordialement,

Bonjour,

Pas le temps de regarder avec attention pour l'instant (autres urgences...)

A plus tard (sous réserve de coupure de courant susceptible d'intervenir dans la période).

Cordialement.

Rechercher des sujets similaires à "incrementation donnees fichier"