Copie de cellules entre Onglets
Bonjour,
Désolé pour la redite si ça a déjà été demandé, mais j'ai cherché sur internet en anglais et en français, j'ai du mal à trouver la manoeuvre pour mon problème...
J'ai un feuillet d'onglets, j'aimerais que
- lorsque l'on rentre une donnée quelconque dans la case X1 de l'onglet 1
- le contenu de la case A1 (même ligne) soit recopié tel quel dans la case B25 de l'onglet 2 (donc rien à voir)
- le contenu de la case B1 (toujours même ligne) soit recopié tel quel dans la case C26 de l'onglet 3 (rien à voir non plus).
- etc pour le nombre de recopies nécessaires.
Cela existe t il facilement ou bien faut il que j'apprenne à faire une macro complexe ?
Merci de votre aide, bonne journée.
Bonsoir,
Cela existe t il facilement ou bien faut il que j'apprenne à faire une macro complexe ?
C'est juste une évènementielle que l'on ne saurait vraiment qualifier de "complexe" !
Mais il serait séant que tu fournisses un classeur d'illustration, ce qui permettrait déjà d'apprécier l'exacte dimension de ton "etc". Et également de choisir la méthode la plus appropriée...
"Case" n'ayant aucune définition officielle, cela peut représenter n'importe quoi, au gré de l'utilisateur, aussi serait-il préférable de désigner les cellules d'une feuille de calcul tout simplement sous leur nom de "cellules" !
Egalement, si la connaissance de la version Excel n'est vraiment utile que dans quelques cas d'incompatibilités, tout le monde n'étant pas familier des numéros de version internes, il vaudrait mieux, pour éviter toute ambiguïté l'indiquer sous son nom public : Excel 2010.
Cordialement.
Bonjour MFerrand,
Et merci beaucoup pour ta réponse ! Je me suis efforcé de créer un fichier exemple, dans lequel Sheet1 est la feuille de base, et si l'on entre des quantités dans la colonne 5, les totaux changent. Je reprécise donc mes explications :
- Supposons que l'on entre 1 dans les cellules 5-3 et 5-5, à savoir 1 produit B et 1 produit D.
- J'aimerais que dans le Sheet2, colonne 2 (LIB), apparaissent réciproquement Produit B et Produit D en cellules 2-2 et 2-3 (réfs 1 et 2);
- ainsi que leurs détails dans les colonnes voisines : codes 1 et 3 dans CODE, et leurs quantités dans QTE (les totaux n'ont pas besoin d'être recopiés mais simplement calculés à nouveau, j'imagine).
- De la même manière, dans le Sheet3, en colonne 2 (LIB), apparaissent automatiquement ces produits et en colonne 3 et 4 leur type et quantité (colonnes 3 et 5 du Sheet 1).
Par "etc" dans mon précédent post, je voulais dire qu'importe le nombre de feuillets ou de colonnes que j'ajoute au Sheet 1, j'aimerais juste connaître la formule pour retranscrire du contenu dans les autres feuillets avec les cellules correspondantes SI une donnée est entrée.
Merci de l'aide éventuelle !
Bonjour,
J'ai bien dit qu'une évènementielle telle que la laisse supposer ton énoncé initial n'avait rien de complexe !
Je détaille !
- Au départ Feuil1 : les cellules dont tout changement détecté doit lancer une intervention doivent être délimités avec précision.
Une des cellules surveillées est modifiée, on se met en branle, une cellule non surveillée est modifiée, on ne bouge pas !
Additif complémentaire : si des modifications sont susceptibles d'intervenir mais doivent être prohibées, si on détecte de telles modifications, on les annule !
- L'intervention, consiste à prendre des valeurs sur Feuil1 pour les reproduire ailleurs. Pour chaque cellule modifiée donnant lieu à intervention, on doit savoir localiser toute(s) valeur(s) concernée(s) par l'opération ! Soit qu'elles sont définies de façon fixe pour chaque cellule modifiable, soit que des critères précis permettent leur localisation.
- On doit ensuite reporter ces valeurs sur toutes les feuilles du classeur. Pour corser, l'emplacement cible n'est pas le même d'une feuille à l'autre ! Il faut donc des critères tout aussi précis que les précédent afin que pour chaque feuille cible on puisse déterminer à coup sûr l'emplacement cible.
Lorsque toutes ces indications auront été fournies, et éventuellement illustrées par des exemples montrant : situation de départ => modification => situation résultante pour chaque feuille cible, il n'y aura aucune difficulté pour automatiser la chose !
Cordialement.
MFerrand,
Merci pour ta réponse, même si je dois avouer qu'entre complexe et compliqué la différence est vague...! Je pensais que mon explication était suffisante, mais si un exemple sous forme Excel parle mieux j'ai modifé le classeur en question:
- les 3 premiers onglets nommés Origin représentent le classeur encore non modifié
- les 3 onglets suivants nommés Modif représentent les 3 onglets d'origine après modification
- la modification en question est la suivante : j'ai simplement ajouté les valeurs 1, 3 et 2 dans la colonne 5 de l'onglet Origin1, à titre de test.
- le résultat est que les 2 autres onglets sont mis à jour automatiquement, à savoir que seules les lignes avec une entrée sont reportées (copie des valeurs en colonnes 2 et 3, par exemple)
- ma question est donc la suivante : quelle est la formule/le process pour obtenir cette action ?
J'espère que cet exemple sera suffisant, au dela de ça je ne sais vraiment pas quoi faire
Bonne soirée,
Bonsoir,
On voit mieux la chose !
- Les modifications se font sur Feuil1. Une modification en colonne 5 de Feuil1 (QTE) déclenche l'opération.
On s'assure que la modification intervient bien dans le tableau (à moins que tes tableaux ne fassent systématiquement que 5 lignes, auquel cas on se contenterait de cibler une modification en E2:E6 !)
- A la modification, on répercute les données de la ligne sur les autres feuilles. On a deux types de feuilles, qu'il faut distinguer.
On les distinguera donc par le libellé de A1 : REF ou ZONE !
- Sur le 1er type de feuille (REF) on répercute les données PRODUIT, CODE, QTE et TOTAL.
Sur la première ligne disponible, colonnes 2 à 5.
-Sur le 2e type de feuille (ZONE)on répercute les données PRODUIT, TYPE, QTEet TOTAL.
Sur la première ligne disponible, colonnes 2 à 5.
- Reste un petit point à régler : ta colonne 3 est au format monétaire sur les feuilles cibles ! Cela n'aura pas d'incidence lorsqu'il s'agit de lui insérer le type, mais cela en aura lorsqu'il s'agira du code !
Tes colonnes ayant des formats de cellules prédéfinis, sauf sur ce point, je n'aurai donc pas à me préoccuper des formats pour les autres colonnes mais celle-ci fait exception. Faut-il donc s'occuper du format ? Ou opères-tu une rectification préalable ?
Si ma description est conforme à tes attentes, c'est une opération qui peut sans problème être déclenchée automatiquement à la saisie.
A noter qu'elle se déclenchera à chaque saisie individuelle. Si donc tu en fais plusieurs à la suite, cela éclaire le sens de ma dernière question... car il est indispensable que l'opération soit exécutée rapidement, soit plus rapidement que le délai entre deux saisies successives, quelles soient le nombre de feuilles à servir !
On procède habituellement par la méthode la plus rapide, affectation directe de tableaux, mais s'il faut opérer une mise au format cela ralentira sans doute, même si on restera plus rapide qu'un copier-coller...
Cordialement.
NB- N'attends pas de réponse ultra-rapide, jusqu'à samedi je suis essentiellement occupé à des activités de réaménagement assez fatigantes... je ne passe sur mon ordi qu'un court moment en début de matinée et en début de nuit.
MFerrand,
Merci beaucoup ta réponse. Tout fait sens et me parait correct dans ton analyse. De plus, tu peux d'ores et déjà oublier le troisième point, la mise en forme était une erreur d'oubli de ma part en copie/collant. Dans la version finale je corrigerai.
Pas la peine de t'excuser pour un quelconque "retard", tu ne me dois rien et c'est déjà très aimable de ta part. J'attendrai donc ton retour pour voir à quoi ça ressemble, et si je peux y mettre les doigts afin d'adapter à la véritable version.
Bonne fin de semaine,
Bonsoir,
Je reprends sur ton premier fichier modèle :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sh As Worksheet, lgnR(), lgnZ(3), i%
If Target.Count > 1 Then Exit Sub
If Target = "" Or IsEmpty(Target.Offset(, -1)) Then Exit Sub
If Target.Column = 5 And Target.Row > 1 Then
With Target.Offset(, -3)
For i = 0 To 3
lgnZ(i) = .Offset(, i - (i > 1))
Next i
lgnR = lgnZ
lgnR(1) = .Offset(, -1)
End With
For Each sh In Worksheets
With sh.Cells(Rows.Count, 2).End(xlUp)(2)
Select Case sh.Cells(1, 1)
Case "REF": .Resize(, 4).Value = lgnR
Case "ZONE": .Resize(, 4).Value = lgnZ
End Select
End With
Next sh
End If
End SubLa procédure est une procédure évènementielle, qui doit donc être placée dans le module de Feuil1 (la feuille source). Elle réagit à l'évènement Change et se déclenchera automatiquement lorsqu'une modification interviendra dans une ou plusieurs cellules de la feuile.
La première ligne est constituée par les déclarations des variables utilisées dans la précoédure : une variable objet de type Worksheet, pour opérer une boucle sur les feuilles du classeur ; 2 variables tableaux destinées à composer les lignes à insérer (il y a 2 types de lignes pour lesquelles la composition varie), l'un est dimensionné (à 4 éléments, indicés de 0 à 3) l'autre non (car on lui affectera le premier tableau, avant de modifier l'unique valeur par laquelle ils diffèrent) ; une variable de type Integer (% est un caractère de déclaration de type équivalent à : As Integer).
On procède ensuite au cadrage de la zone sur laquelle un changement doit déclencher une intervention. Une série d'instructions conditionnelles permet d'abord d'éliminer les cas sur lesquels on ne déclenchera pas l'intervention : si la modification affecte plusieurs cellules simultanément, puis si la cellule modifiée est vide et également si la cellule située à sa gauche est vide...
On achève le cadrage en ciblant plus précisément la position de la cellule modifiée : en colonne 5 à partir de la ligne 2.
Il y a peut-être des cas inutiles en considération de tes modalités de saisie... Il est cependant bon de prévoir les principales fausses manoeuvres qui pourraient survenir et entraîneraient des erreurs d'exécution (en outre, en testant à plusieurs reprises, donc en effaçant le test précédent, j'aurais inévitablement des erreurs à chaque fois sans ces précautions !
Les conditions d'intervention étant réunies, la phase suivante consiste à composer les tableaux qui seront affectés. On se place sur la cellule en colonne 2 pour cette opération, et on doit composer le 1er tableau avec les valeurs des colonnes 2, 3, 5 et 6. On utilisera le décalage par rapport à la cellule en colonne 2 qui sera donc de 0, 1, 3 et 4. On opère avec une boucle de 0 à 3 (correspondance avec les indices du tableau) et on utilise une petite astuce pour corriger le report de décalage de 2 à 3 et de 3 à 4 lorsque i sera >1 avec l'expression booléenne (i > 1) renvoyant Vrai ou Faux selon la valeur de i. On la soustrait, opération qui convertit Faux en 0 et Vrai en -1... [On peut opérer de la même façon avec des expressions booléennes dans des formules, sur feuilles, mais ne pas perdre de vue qu'Excel convertit VRAI en 1, alors que VBA renvoie -1]
Pas de difficulté pour le second tableau : égal au premier, et modification de la valeur d'indice 1...
Reste la dernière phase : une boucle sur les feuilles... On se positionne sur la première cellule vide en colonne 2, on teste sur quel type de feuille on est, on redimensionne la cellule sur 4 colonnes et on affecte à cette plage le tableau correspondant au type (et si aucun des deux types, rien ne se passe !)
Ces indications devraient te permettre les diverses adaptations que tu auras à faire...
Cordialement.