Incrémentation de données vers autre fichier
Pas de problème,
Je remettrai un post de mon coté si j'avance.
Merci.
Bonjour,
Je résume la situation, étant donné tous mes edits du post précédent.
Voici le code actuel :
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, 21).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 'Retourne à "For j" pour tester la deuxième ligne du tableau, puis la troisième, etc
For i = 0 To 14 '0 à 14 : 15 fois la boucle va se répéter. 15 comme le nombre de colonne du tableau rgC.
.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
Next i
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 ce deuxiè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 Sub2 choses me posent problème :
- Le copié collé dans l'onglet "Histo" doit être, à l'idéal, en valeur. Hors ce n'est pas le cas pour le moment.
- Les lignes ne s'incrémentent dans l'onglet "ESC" qu'à partir de la ligne 29, et non la ligne 15 comme il le faudrait.
Je ne parviens pas à trouver comment copié collé en valeur malgré plusieurs tentatives.
Je ne parviens pas non plus à expliquer pourquoi les lignes ne se collent qu'à partir de la ligne 29. Je remets en cause la boucle J grâce aux différents tests que j'ai effectué, mais je ne sais pas pourquoi le problème se pose.
Dernière chose que j'aimerais faire faire à cette boucle : Mettre en place un stratagème qui permettrait qu'une même ligne ne soit pas dupliquée plusieurs fois dans l'onglet historique. Pour cela, voilà comment j'aimerais procéder.
1/ Créer 2 tables : tbl1 qui contient les données des colonnes E, O, P et U de la feuille "ESC" (Colonne 5, 15, 16 et 21). tbl2 les mêmes colonnes, mais pour la feuille "Histo"
2/ Si les valeurs de tbl1 pour la ligne j (ligne à prélever) = la ligne x (de 15 à n) de tbl2, alors j devient la nouvelle ligne x
3/ Si il n'y a pas de concordance, alors j est inscrit en n+1
Merci de m'aider à mettre cela en place.
Cordialement,
- Le copié collé dans l'onglet "Histo" doit être, à l'idéal, en valeur. Hors ce n'est pas le cas pour le moment.
Pour transférer des valeurs, pas de copier-coller...
Remplacer :
.Rows(j).Copy Wsh.Rows(x)
par :
Wsh.Range("A" & x).Resize(, ?).Value = .Range("A" & j).Resize(, ?).ValueDans la ligne ci-dessus, remplacer le ? par le nombre de colonnes de la ligne à transférer.
- Les lignes ne s'incrémentent dans l'onglet "ESC" qu'à partir de la ligne 29, et non la ligne 15 comme il le faudrait.
Ça se passe où, ça ?
Bonjour,
Merci pour l'info !
Comment ça, ça se passe où ?
Dans l'onglet ESC, les données trouvées dans les fichiers sources sont censées s'incrémenter à partir de la ligne 15. Elles se collent bien comme il faut, sauf que c'est à partir de la ligne 29 uniquement.
Et après réflexion ... Quand je la relance, elles s'incrémentent à partir de la ligne 30, pui 31, etc ...
Ok ! Je vois d'où ça vient. Dans la macro initiale x n'avait pas été utilisée avant, donc =0 ! Là tu l'as utilisée dans le code qui précède, il faut donc le remettre à 0 avant de lancer la boucle.
Bien vu !
J'ai repassé X à 0 avant la boucle, et ça fonctionne correctement.
merci beaucoup
Que pensez-vous de ma démarche, expliquée 2 posts plus tôt, en ce qui concerne la vérification que la ligne n'a pas déjà été saisie dans l'historique ?
Merci
J'ai pas compris cette partie, sauf que tu vérifies l'identité de la ligne sur plusieurs champs.
Cela me paraît un peu lourd. Au départ je pensais que basculant ta ligne en Histo, tu la supprimais simultanément ailleurs...
Je pense que le vérification lors de la bascule en Histo rique d'être lourde puisque obligation de la faire à chaque fois.
Tu verras à l'usage, je n'ai pas de solution alternative car pour ne pas avoir cette vérification, il faudrait annoter la Source, ce qui serait plus lourd encore puisque le passage en Histo se fait à partir de la Cible...
Effectivement cette méthode est très lourde ...
Je suis entièrement d'accord avec vous.
En réalité, je pensais également que, si l'action est terminée, elle serait supprimée des fichiers cibles. Et que, si jamais ce n'était pas le cas (oubli ou autre raison exceptionnelle), alors ce serait au cas par cas. Si une ligne est incrémentée 2 fois par erreur en historique, rien de dramatique, on s'en rendrait compte facilement.
Or, en discutant avec l'utilisateur principal, il m'a indiqué que la ligne pouvait rester 2 ou 3 mois après la date de fin ... Donc la ligne serait incrémentée dans l'histo autant de fois qu'il y a de clic sur les 2 ou 3 mois ... Donc laisse tomber quoi x)
Je verra à l'usage, effectivement ... Quitte à créer une macro sur l'onglet histo, qu'on lance de temps en temps, afin de supprimer les lignes dupliquer plusieurs fois. Ce serait sans doute plus simple en 2 macros je pense. La première s'exécuterait plus rapidement, et la deuxième ne s'exécuterait uniquement au besoin, c'est à dire plus rarement.
Par contre, vous sembliez avoir une idée concernant le non décalage des saisies manuelles à chacune des incrémentations. En stockant les données c'est ça ?
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.
Concrètement, comment dois-je m'y prendre ?
Merci
Je crois qu'en fait, sous réserve que ce soit possible, il faudrait à chaque phase ne prélever que les lignes nouvelles non encore prélevées, et ne plus effacer en contrepartie.
Ce qui suppose dans les fichiers source de flanquer quelque part une colonne pour annoter les lignes prélevées, afin de ne plus le refaire.
Et dans la feuille Cible, d'annoter de la même façon ce qu'on bascule en Histo...
Sans que cela nuise aux autres utilisations (on peut utiliser des colonnes masquées pour cela).
On aurait un test de plus à chaque fois mais il y en a un de toute façon, mais moins de transferts, pas la vérification d'Histo, et pas d'effacement. Cela pourrait au total s'avérer plus économique.
Super idée !
Effectivement, il faudrait une notation en fin de chaque ligne des 15 fichiers (A15, A16, A17 etc pour fichier A, B15, B16 etc pour le fichier B etc). Cette cellule s'incrémenterait également dans le fichier ESC. Puis à la prochaine exécution de macro, elle vérifie que la numérotation de la ligne à prélever dans le fichier cible n'est pas déjà présente dans la colonne numérotation de l'ESC. Si elle l'est, alors la ligne n'est pas prélevée.
Il y a cependant un problème. La ligne A19 par exemple est déjà incrémentée. Si les données changent, elle ne le sera pas car la numérotation sera déjà inscrite dans l'ESC ... Pour que le changement soit pris en compte, il va falloir que l'utilisateur supprime la ligne, incrémente à nouveau, puis la remplisse, puis ré-incrémente. Dans ce cas, lors de la dernière incrémentation, A19 n'apparaitra plus dans l'ESC et donc la ligne pourra être incrémentée. Sauf que c'est trop contraignant d'effectuer cela. Et il y a beaucoup trop de risques que l'utilisateur ne le fasse pas, et donc que la ligne passe à la trappe, ce qui serait très embêtant ...
Si des modifications interviennent ensuite... !!! C'est épineux !
Là j'aurais tendance à dire qu'il y a un vice de conception au niveau de la globalité du projet, car on ne devrait pas se trouver dans ce type de cas ingérables...
Bonjour,
Désolé pour la réponse si tardive.
En réalité ce n'est pas vraiment une modification, mais plutôt une nouvelle information. Une information qui a une seul point commun : la ligne sur laquelle elle est inscrite. Mais effectivement, c'est épineux ...