Transfert de données variables d'un classeur à un autre

Fermé
mad4max2 Messages postés 10 Date d'inscription vendredi 20 mars 2015 Statut Membre Dernière intervention 1 juin 2015 - 20 mars 2015 à 17:50
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 - 21 mars 2015 à 20:21
Bonjour,
Je suis novice dans VBA et j'ai un petit "soucis" à règler.

J'ai un gros fichier Excel avec moult classeurs.

Dans un classeur "Membres", j'ai les données de membres d'un club de sports de combats.

J'ai de multiples classeurs avec lesquels je génère des contrats, des factures, des rappels et mets à jour mes données plus ou moins automatiquement.

J'utilise beaucoup la fonction "vlookup" (en français recherchev) pour retrouver mes données et les positions de certains éléments vu que mon classeur Membres, est en fait une grande table que j'ai nommé.

Alors... J'ai dans un classeur "ConfRésiliation" deux céllules contenant:

1) Le status du membre (actif, inactif, en suspens, etc..)
2) L'endroit où est stocké le contrat (Classeur Membre, Classeur contrats inactifs, etc...)

En mettant le numéro du membre, par vlookup, j'affiche le contenu actuel du status, soit s'il est actif et dans quel classeur il est.

Dans une cellule adjacente (ConfRésiliation!F24), je mets le nouveau statut et dans la cellule (ConfRésiliation!F25) dans quel classeur il est.

Je dois maintenant copier la valeur de ces deux cellules, dans le classeur "Membres" à la position exacte du membre. Position que je trouve grâce à une formule mélant un vlookup pour la recherche du membre dans la table et l'extraction de l'emplacement. J'affiche cette position dans le classeur "ConfRésiliation", ce qui me donne:

1) Status actuel membre dans ConfRésiliation!R24
2) Classeur actuel membre dans ConfRésiliation!R25

Comment copier par VBA les contenus suivants:
1) Classeur ConfRésiliation, cellule ConfRésiliation!F24 dans classeur "Membres" en prenant l'adresse inscrite dans la cellule ConfRésiliation!R24;
1) Classeur ConfRésiliation, cellule ConfRésiliation!F25 dans classeur "Membres" en prenant l'adresse inscrite dans la cellule ConfRésiliation!R25;

J'espère que c'est pas trop farfouillé comme je vous l'ai expliqué...

Merci par avance de votre précieuse aide!
A voir également:

2 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
21 mars 2015 à 06:19
Bonjour,
sans voir un extrait des classeurs ...

d'autant qu'il parait bizarre un membre occupe 2 lignes dans la liste des membres mais...

mettre les extraits des classeurs sans données confidentielles en pièce jointe sur https://www.cjoint.com/
et coller le lien proposé dans le message de réponse
te
0
mad4max2 Messages postés 10 Date d'inscription vendredi 20 mars 2015 Statut Membre Dernière intervention 1 juin 2015
21 mars 2015 à 13:53
Bonjour,
Je me suis peut-être mal exprimé... Chaque membre n'occupe qu'une seule ligne dans le tableau principal... Et le "Type de Contrat" et le "Classeur" sont en colonnes. Colonne B pour "Type de contrat", colonne C pour "Classeur".
Je trouve la ligne du membre, en faisant une "Recherchev".
J'ai une multitude d'onglets. Un pour les contrats, un pour la facture, un pour les rappels, un pour la lettre de confirmation de résiliation, un pour les tarifs, plusieurs pour les Bulletins de versements, etc...
Dans chacun de ces onglets, je mets dans une cellule le numéro du membre, qui lui est, dans la table "Membres", en colonne A. Puis, je récupère les données via une recherche verticale et place le résultat là où il faut.
Dans la question que j'ai posé, je dois faire l'inverse. Soit aller mettre dans les colonnes B & C un texte ou un code que j'entre dans l'onglet "ConfRésiliation" selon les besoins.
En utilisant les fonctions "adresse" et "cell("address", ...) je trouve la position où je dois aller copier ce mon texte.
Et dans ce tableau, j'ai un sous l'autre, le texte. D'où ta surprise de voir les données sur deux lignes.
Le fichier contient une bonne vingtaine de fichiers imbriqués. Difficile d'en faire des extraits.
Voici des Screen Shots du fichier:
https://www.cjoint.com/c/ECvobYBE2Vk

Merci de votre aide!
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337
21 mars 2015 à 06:42
Bonjour
Si vous êtes novice en VBA. appliquez les consignes suivantes:
Copier le code ci-dessous par CTRL + C
Sub Recopie()
    Application.ScreenUpdating = False
    Sheets("ConfRésiliation").Select
    'Si la colonne sélectionnée est différente de la colonne F ou
    'si la ligne sélectionnée est la une,on sort du programme
    If ActiveCell.Column <> 6 Or ActiveCell.Row = 1 Then Exit Sub
    'si la cellule sélectionnée est vide, on sort du programme
    If ActiveCell.Value = "" Then Exit Sub
    'on récupère l'information de la cellule sélectionnée
    ValeurARecopier = Cells(ActiveCell.Row, 6)
    'on récupère l'adresse de la cellule de recopie
    AdresseDeRecopie = Cells(ActiveCell.Row, 18)    
    Sheets("Membres").Select
    'on colle la valeur
    Range(AdresseDeRecopie).Value = ValeurARecopier
End Sub


Sur votre classeur excel; faite ALT + F11 (ça ouvre un module VBA)
Collez le texte CTRL + V
Toujours dans le module, faite les actions suivantes "Fichier - Fermer et retourner à Microsoft excel".
maintenant , on va ajouter un objet qui appellera la macro.
Sur la feuille ConfRésiliation, Ajoutez un objet quelconque, par exemple une zone de texte (en sélectionnant dans le ruban Insertion puis zone de texte. collez cette zone de texte sur votre feuille, ajustez la taille de telle manière qu'elle ne vous cache pas trop vos cellules). Mettez y comme texte par exemple "Recopie" puis clic droit sur cette zone de texte et sélectionnez "Affecter une macro". Cliquez une seule fois sur le nom de la macro "Recopie" puis OK.
Voilà, à partir de maintenant, positionnez vous sur la cellule de la colonne F de votre choix, puis cliquez sur le bouton "Recopie", la valeur de la colonne R de la même ligne est recopiée dans "Elements" à l'adresse indiquée.
Bonne journée
Cdlt
0
mad4max2 Messages postés 10 Date d'inscription vendredi 20 mars 2015 Statut Membre Dernière intervention 1 juin 2015
21 mars 2015 à 14:05
Merci, mais c'est pas tout à fait ça...

Petite précision, je suis novice, mais pas totalement novice... Il y a déjà plusieurs macros qui tournent parfaitement... Mais je ne suis pas encore à l'aise avec toutes les fonctions de VBA....

En effet, je trouve la position où je dois recopier le contenu à partir d'une cellule spécifique, par calcul en utilisant une recherche verticale et dont, ensuite, je transforme non pas en contenu, mais en position dans ma table...

Ce qui me donne l'endroit où je dois recopier le contenu de ma cellule.

Donc, j'ai un contenu, l'adresse exacte de la cellule avec ce contenu et l'adresse exacte de destination où le contenu doit être recopié. Simplement je prends une valeur du classeur ConfRésiliation et je dois la mettre dans le classeur Membres à une position trouvée par calcul.

Je n'arrive pas à trouver la fonction exacte... Je pensais mettre:


Sub ChangeStatusMembre()
'
' Macro ChangeStatusMembre
'
'
'
'-----------------------------------------------------------------------------------------------------------+
' Va sur le classeur "Membres"
'-----------------------------------------------------------------------------------------------------------+
'
Sheets("Membres").Select

'
'-----------------------------------------------------------------------------------------------------------+
' Change le contenu des cellules "Type de Contrat" et "Type de Classeur"
'-----------------------------------------------------------------------------------------------------------+
'
Dim ovTypeContrat As String
Dim ovTypeClasseur As String
Dim nvfTypeContrat As String
Dim nvfTypeClasseur As String
With ActiveSheet
ovTypeContrat = Sheets("ConfRésiliation").Range("R24").Value
ovTypeClasseur = Sheets("ConfRésiliation").Range("R25").Value
nvTypeContrat = Sheets("ConfRésiliation").Range("S24").Value
nvTypeClasseur = Sheets("ConfRésiliation").Range("S25").Value

Worksheets("Membres").Range(Cells(ovTypeContrat)) = Worksheets("Membres").Range(Cells(nvTypeContrat))
Worksheets("Membres").Range(Cells(ovTypeClasseur)) = Worksheets("Membres").Range(Cells(nvTypeClasseur))

End With

End Sub

(la commande Worksheets est sur une ligne et non pas sur deux lignes, bien sûr...)

ov suivi de type de contrat ou type de classeur = Ancienne valeur
nv suivi de type de contrat ou type de classeur = Nouvelle valeur

Mais ça ne marche pas... Je dois oublier ou faire faux quelque chose quelque part...

Merci de votre aide...
0
Frenchie83 Messages postés 2240 Date d'inscription lundi 6 mai 2013 Statut Membre Dernière intervention 11 août 2023 337 > mad4max2 Messages postés 10 Date d'inscription vendredi 20 mars 2015 Statut Membre Dernière intervention 1 juin 2015
21 mars 2015 à 20:21
Bonsoir
Remplacez les 2 dernières lignes par ceci
Range(ovTypeContrat).Value = Sheets("ConfRésiliation").Range(nvTypeContrat).Value
Range(ovTypeClasseur).Value = Sheets("ConfRésiliation").Range(nvTypeClasseur).Value

cdlt
0