Transférer des données d'une cellule à l'autre et mettre à j
Bonjour à tous,
J'aimerais pouvoir transférer les données d'une cellule, qui peuvent varier à chaque semaine, dans une cellule d'une autre feuille du fichier au côté du nom de la personne à qui appartiennent les données.
J'ai mis en pièce jointe un fichier qui vous fournira toutes les instructions afin de mieux comprendre ma question.
Merci d'avance pour votre aide précieuse.
Bonsoir,
Si tu précisais quelles cellules (adresses) de quelle feuille (nom) sont à transférer vers quelle autre feuille (nom) dans quelles cellules (adresses), cela pourrait devenir plus clair. Pour une meilleure compréhension, à quel moment cela se fait, répétition de l'opération...
Cordialement.
Bonsoir MFerrand,
Désolé, je croyais avoir été assez clair dans les explications qui se trouvent dans le fichier. Je ne connais pas tous les termes utilisés afin de bien m'expliquer. Je vais tenter d'être le plus précis possible.
Les données des cellules à transférer sont les suivantes: Sem.01!D2:D6, qui apparaissent dès que les scores sont entrés dans les cellules Sem.01!E2:G6.
Elles doivent être transférées dans les cellules de la colonne "E" de la feuille "Données", vis-à-vis les noms qui sont les mêmes que ceux qui se trouvent dans la colonne Sem.01!C2:C6, soit par le billet d'une formule ou d'un code VBA.
Après que les données sont toutes inscrites dans la semaine01, tu click sur le bouton "transférer" afin de passer à la semaine suivante. À ce moment, certaines données de la semaine01 sont transférer dans la semaine02, et le même processus que la semaine01 recommence.
Tu entres les scores dans les cellules Sem.02!E2:G2. Les nouvelles moyennes des joueurs apparaissent dans les cellules Sem.02!D2:D6. Ces nouvelles moyennes doivent s'inscrire dans la colonne Données!E, vis-à-vis les noms correspondants à ceux qui se trouvent dans la colonne Sem.02!C2:C6. En somme, si les noms sont les même que la semaine01, les nouvelles moyennes doivent remplacer les moyennes déjà inscrite.
Ce processus ce fait à chaque semaine et les moyennes des joueurs inscrites dans la dernière semaine colonne D2:D6 sont celles qui remplacent les moyennes inscrites dans la feuille "Données" Colonne "E" vis-vis les noms correspondants.
Mon problème est qu'à certain moment de la saison, des joueurs quittent pour différentes raisons et doivent être remplacés. J'assigne un numéro, qui se trouve dans la colonne "B" de la feuille "Données" au nouveau joueur. Dans la pièce jointe, j'ai assigné le numéro 1021 au nouveau joueur., pour fin d'exercice.
Ce numéro est inscrit dans la colonne "B" de la semaine suivant le retrait du joueur à la même ligne ou était l'ancien joueur (Le numéro doit être inscrit dans la Sem.05 du fichier en pièce jointe.
Loin de moi l'idée de te dire quoi faire, mais j'aimerais que tu suives les étapes inscrites dans la pièce jointe. Je crois que çà devrait aider à décortiquer ma pensée.
Merci beaucoup de ta réponse rapide et j'espère avoir été assez claire pour que tu puisse résoudre mon problème.
Bonne soirée
A-priori, il me semble donc que l'action réalisée par "Transférer" est à compléter par le transfert des moyennes vers la feuille Données. (Et des totaux quilles cumulés aussi.)
Par contre, pour ce qui est des substitutions, il faut que je vois ce qui se passe...
J'arrête pour ce soir (ce matin d'ailleurs !). Une procédure Transférer par semaine, pas rationnel, une seule doit suffire. Par ailleurs, il me semble qu'elle ne transfère que les numéros, ça fait peu. On y ajoutera déjà les transferts vers Données. Mais pour comprendre le mécanisme, je vais devoir décortiquer les formules...
Bon matin MFerrand,
Merci pour ta réponse rapide.
Comme je l'ai mentionné, une formule ou un code VBA pourrait faire l'affaire. Comme je ne sais pas quelle formule ou quel code fabriquer, je ne pouvais pas régler mon problème.
Merci beaucoup d'essayer, c'est très apprécié.
Et... bon repos.
J'attend de tes nouvelles.
Bonjour,
Petit état des lieux provisoire :
1) Mis formule en Q1 :
=SUBSTITUE(SUBSTITUE(A1;"aine";"");DROITE(A1;2);TEXTE(CNUM(DROITE(A1;2))-1;"00"))Cette formule renvoie le nom de feuille de la semaine précédente. (Police à blanc, donc demeure invisible.)
Cela permet de mettre les formules en O et P sous INDIRECT, donc d'avoir la même formule pour toutes les feuilles à partir de Sem.02.
Les formules en O et P deviennent :
=SI(C2<>INDIRECT($Q$1&"!C"&LIGNE());RECHERCHEV(B2;Données!$B$2:$H$27;6)+M2;M2+INDIRECT($Q$1&"!O"&LIGNE()))
=SI(C2<>INDIRECT($Q$1&"!C"&LIGNE());RECHERCHEV(B2;Données!$B$2:$H$27;7)+N2;N2+INDIRECT($Q$1&"!P"&LIGNE()))Avec rectificatif de la colonne pour la recherche sur Données (pointait sur colonne précédente...)
Il me semble que dans le déroulement de ton exemple, il y a un petit décalage d'une semaine dans l'introduction de Dummy, puis peut-être de Michel, mais ce point est sans incidence...
Par contre le fait que pour un nouveau joueur introduit, on aille chercher les données initiales dans Données en pose un, qui apparaît en semaine 6.
En semaine 5, introduction, et les données en O et P proviennent de Données. En semaine 6, on cumule. Puis on transfère : le transfert modifie les données, lesquelles vont modifier la semaine 5, ce qui va modifier après coup la semaine 6.
Décaler l'introduction ne résoud pas le problème, cela ferait disparaître la situation antérieure. Je réfléchis...
Pour le reste, procédure de transfert unique attachée à tous les boutons Transférer :
Sub Transferer()
Dim fs$, fsuiv$, tft(), i%, c As Range
fs = ActiveSheet.Name
fsuiv = Replace(fs, Right(fs, 2), Format(Val(Right(fs, 2)) + 1, "00"))
ReDim tft(1 To 5, 1 To 1)
For i = 1 To 5
tft(i, 1) = Worksheets(fs).Cells(i + 1, 2)
Next i
Worksheets(fsuiv).Cells(2, 2).Resize(5) = tft
ReDim Preserve tft(1 To 5, 1 To 4)
With Worksheets(fs)
For i = 1 To 5
tft(i, 2) = .Cells(i + 1, 4)
tft(i, 3) = .Cells(i + 1, 15)
tft(i, 4) = .Cells(i + 1, 16)
Next i
End With
With Worksheets("Données")
For i = 1 To 5
Set c = .Columns("B").Find(tft(i, 1))
If Not c Is Nothing Then
c.Offset(, 3) = tft(i, 2)
c.Offset(, 5) = tft(i, 3)
c.Offset(, 6) = tft(i, 4)
End If
Next i
End With
MsgBox "Transfert des résultats hebdomadaires effectué.", vbInformation, "Tranfert des données"
End SubJ'essaie de trouver une solution au problème d'introduction : il faut couper le lien avec données qui provoque un effet rétroactif, donc probablement VBA pour s'en affranchir, mais quoi de mieux adapté ?
A suivre.
Bonjour MFerrand,
J'espère que tu as eu une bonne nuit. De ce côté de l'Atlantique il est présentement 9h30. Je dois quitter jusqu'à 16h30. Je vais regarder ta solution dès mon retour. N'étant pas un expert en Excel, ça me semble assez compliqué. Mais je crois que je vais pouvoir m'en sortir.
Merci beaucoup de t'intéresser à mon problème.
À+
Il était donc 17h30 chez moi au moment où tu écrivais...
J'oscillais entre 2 procédure : une pour récupérer le score antérieur au moment de l'introduction, soit un bouton à actionner, mettre la valeur quelque part, et ajuster les formules... Un peu compliqué et réclame pas de loupé...
Je m'oriente vers une autre possibilité : mettre une signalisation de nouveau (par formule), et introduire une détection dans la procédure de transfert pour que dans ce cas elle cumule les valeurs préexistantes. Le seul inconvénient : tant qu'on n'a pas fait le transfert, l'affichage des scores du "nouveau" est incomplet, mais c'est momentané ; avantage : pas de procédure particulière.
Mais il est peut-être judicieux d'introduire ces données dans la feuille pour que la semaine où il y a introduction soit à jour.
J'envisage aussi une autre sécurité : désactiver le bouton Transférer une fois le transfert effectué (et activer le bouton pour la semaine suivante.
Cordialement.
Modifications apportées :
- formule en colonne Q (Q2 à Q6):
=SI(ET(B2<>"";B2<>INDIRECT($Q$1&"!B"&LIGNE()));"Nouveau";"")Si un nouveau ou Dumming est introduit, affiche 'Nouveau'.
-modification des formules en O et P:
=SI(C2<>INDIRECT($Q$1&"!C"&LIGNE());R2+M2;M2+INDIRECT($Q$1&"!O"&LIGNE()))
=SI(C2<>INDIRECT($Q$1&"!C"&LIGNE());S2+N2;N2+INDIRECT($Q$1&"!P"&LIGNE()))Dans le cas d'une introduction, on ne pointe plus Données pour récupérer les antérieurs mais colonne R ou S.
Lors du transfert, ces données seront récupérées par la macro et insérées en R et S (donc mise à jour par la formule) avant d'opérer le transfert.
Modification de la macro:
Sub Transferer()
Dim fs$, fsuiv$, tft(), i%, c As Range, sss As Boolean
'Constitution noms de feuille : semaine et suivante
fs = ActiveSheet.Name
fsuiv = Replace(fs, Right(fs, 2), Format(Val(Right(fs, 2)) + 1, "00"))
'Vérification existence feuille semaine suivante
For i = 1 To Worksheets.Count
If Worksheets(i).Name = fsuiv Then Exit For
Next i
If i > Worksheets.Count Then
If MsgBox("La semaine suivante n'a pas été trouvée." & Chr(10) & "S'il s'agit de la dernière semaine, " _
& "cliquer sur 'OK' pour passer outre et transférer les derniers résultats de la saison." & Chr(10) _
& "Sinon, cliquer sur 'Annuler', rétablir la feuille manquante et relancer le trnasfert.", _
vbOKCancel + vbQuestion + vbDefaultButton2, "Transfert des données") = vbCancel Then
Exit Sub
Else
sss = True
End If
End If
'Vérification 'Nouveaux' (récup. scores antérieurs s'il y a lieu)
With Worksheets(fs)
For i = 2 To 6
If .Cells(i, 17).Value = "Nouveau" Then
If .Cells(i, 2) <> 5000 Then
ReDim tft(2)
tft(0) = .Cells(i, 2)
Set c = Worksheets("Données").Columns("B").Find(tft(0))
If Not c Is Nothing Then
tft(1) = IIf(c.Offset(, 5) <> "", c.Offset(, 5), 0)
tft(2) = IIf(c.Offset(, 6) <> "", c.Offset(, 6), 0)
Else
tft(1) = 0: tft(2) = 0
End If
.Cells(i, 18) = tft(1)
.Cells(i, 19) = tft(2)
End If
End If
Next i
End With
'Recueil données à transférer feuille suivante (tft occulté pour dernière semaine)
ReDim tft(1 To 5, 1 To 1)
For i = 1 To 5
tft(i, 1) = Worksheets(fs).Cells(i + 1, 2)
Next i
If Not sss Then Worksheets(fsuiv).Cells(2, 2).Resize(5) = tft
'Recueil autres données et transfert feuille 'Données'
ReDim Preserve tft(1 To 5, 1 To 4)
With Worksheets(fs)
For i = 1 To 5
tft(i, 2) = .Cells(i + 1, 4)
tft(i, 3) = .Cells(i + 1, 15)
tft(i, 4) = .Cells(i + 1, 16)
Next i
End With
With Worksheets("Données")
For i = 1 To 5
Set c = .Columns("B").Find(tft(i, 1))
If Not c Is Nothing Then
c.Offset(, 3) = tft(i, 2)
c.Offset(, 5) = tft(i, 3)
c.Offset(, 6) = tft(i, 4)
End If
Next i
End With
'Opération terminée : désactivation bouton semaine, activation bouton semaine suivante
MsgBox "Transfert des résultats hebdomadaires effectué.", vbInformation, "Tranfert des données"
Worksheets(fs).Shapes(1).OnAction = ""
If Not sss Then Worksheets(fsuiv).Shapes(1).OnAction = "Transferer"
End SubOn y a introduit:
- Une vérification de l'existence de la feuille Semaine suivante : si absente questionnement de l'utilisateur, s'il s'agit de la dernière semaine, celui-ci clique sur OK et le transfert vers Données se déroule mais la feuille suivante est ignorée, si ce n'est pas le cas, il clique sur Annuler, met en place la feuille manquante et relance.
- La vérification de l'introduction de nouveaux joueurs et récupération de leurs scores antérieurs s'il y a lieu (comme évoqué plus haut).
- La désactivation du bouton Transférer, et l'activation du bouton de la semaine suivante.
J'ai retardé les introductions d'une semaine par rapport à ton calendrier (qui les introduisait la semaine précédant leur intervention effective). Et j'ai déroulé le test jusqu'à la semaine 7. A toi de poursuivre en rajoutant des semaines et en introduisant des changements pour voir si ça colle.
Cordialement.
Bonsoir,
Il est 19h50 chez nous. Je reviens seulement de mes activités d'aujourd'hui. Ça été plus long que prévu. Je regarde et test le tout et je te reviens avec le résultat.
Merci infiniment pour ton aide.
Bonjour MFerrand,
Je suis désolé du retard mais je suis au prise avec ce que nous appelons chez-nous un méchant virus. Je prend du mieux mais les idées ne sont pas encore assez claires pour travailler sur mon système.
À première vue, ça ne semble pas fonctionner dans mon système principale. J'ai copier le code VBA ainsi que les formules et ça cause beaucoup d'erreurs.
J'espère aller mieux d'ici demain.
Je te remercie pour ta patience et te souhaite une bonne journée.
Bonjour MFerrand,
Je ne sais pas si tu as reçu mon message précédent qui mentionnait que j'avais attrapé un virus. Si c'est non, je m'excuse du retard pour cause de virus.
J'ai transférer le code VBA et les formules dans mon fichier principale et ça ne fonctionne pas. Je présume qu'il faudra des modifications au code et aux formules pour les adapter à un autre système.
En pièce jointe, j'ai mis une copie partielle de mon système principal, (mon système est trop volumineux, même compressé), pour te l'envoyer.
SVP regarde ce que tu peux faire et laisse moi savoir. Je suis toujours au prise avec ce virus. Je devrais être plus en forme d'ici demain.
Merci encore pour ton aide et passe une belle journée
Hormis le fait qu'introduire plusieurs équipes exige naturellement une adaptation, je n'ai eu qu'à regarder moins de 5 secondes pour voir que ta feuille Données n'a pas la même structure et que tes feuilles semaine n'ont pas non plus la même structure !
Un petit peu plus pour voir que les indications semaine.xx dans les feuilles ne sont pas les mêmes non plus...
Donc tu commences par passer au peigne fin ton fichier pour détecter toutes les différences (qui provoquent naturellement des erreurs).
Cordialement.
Bonsoir MFerrand,
Je suis extrêmement désolé de te faire perdre ton temps. Ce satané virus ne veut pas me lâcher et j'aurais du attendre d'avoir les idées plus claires avant de t'envoyer mon fichier.
J'ai appliqué les corrections nécessaires mais je ne sais pas comment corriger la police en blanc dans les cellules Q1 des semaines 04,05, Elles indiquent Sem.003, Sem.004, plutôt que Sem.03, Sem.04. Ça bousille les formules.
Aussi, Est-ce possible de faire en sorte que les macros restent activées après leur utilisation. Si jamais une erreur dans les scores est remarquée lors du transfère des données, je dois être capable de faire la correction en retournant dans la semaine précédente et réactiver la macro avec les nouveaux scores. Comme tu sais les score sont entrés manuellement à chaque semaine et une erreur humaine est toujours possible.
Pour information personnelle, pourquoi le mot "aine" dans la formule en Q1 ?
Merci beaucoup pour ton aide et je te garantie que ce genre d'erreur ne se reproduira plus.