Excel - Copier valeurs avec conditions

Fermé
EmilieM Messages postés 20 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 2 juin 2010 - 1 juin 2010 à 09:52
EmilieM Messages postés 20 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 2 juin 2010 - 2 juin 2010 à 08:27
Bonjour,

Je souhaiterai savoir si il est possible de créer une macro permettant de rechercher une valeur et de copier l'ensemble des cellules associées.
Je m'expliques : je dispose de plusieurs machines possédant différents paramétre mis dans 3 colonnes (Température, Lecture heute et Lecture basse) pour chaque machine. J'aimerai que lorsque je tappe le nom d'une machine dans une cellule cela me copie automatiquement les 3 colonnes de la machine associée dans 3 autres colonnes.

J'espére que cela est assez explicite. Je peux joindre un fichier exemple si cela peut aider quelqu'un à la comprehension de mon probléme. Mais je ne sais plus comment on fait pour le joindre.

Emilie.



A voir également:

7 réponses

commentcamarcheeay Messages postés 666 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 30 mars 2020 86
1 juin 2010 à 10:01
Bonjour,
Je pense que ton problème ne m'est pas très inconnu. On vient d'en parler apparemment dans d'autres occasions. J'ai comme l'impression que tu auras besoin de la fonction RECHERCHEV(). Mais je te propose quand même de poster ton fichier. Tu peux utiliser le lien suivant pour le faire : http://www.cijoint.fr/
0
EmilieM Messages postés 20 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 2 juin 2010
1 juin 2010 à 10:05
En fait je ne sais pas si c'est moi qui utilise mal la fonction "rechercheV", mais il me semble que cette fonction ne permet pas de rechercher et de copier 3 colonnes associé.
Je joint le fichier concerné au cas où.
Emilie.
http://www.cijoint.fr/cjlink.php?file=cj201006/cijyS73EUi.xls
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
1 juin 2010 à 10:40
Bonjour,

Regarde si c'est ce que tu cherches : https://www.cjoint.com/?gbkNl0u4LM

;o)
0
EmilieM Messages postés 20 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 2 juin 2010
1 juin 2010 à 10:52
Oui cela à l'air de fonctionner exactement comme je le souhaite. Mais je ne sais pas comment tu as procédé, pourrais tu m'en dire plus?

Emilie.
0
EmilieM Messages postés 20 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 2 juin 2010
1 juin 2010 à 11:14
Je souhaiterai appliquer cette macro à d'autre classeur comprenant plusieurs feuilles mais je ne vois pas les mofifications à apporter dans ce but. Je pense qu'il est également important que je précise que la cellule dans laquelle on rentre D4 (par exemple) ne sera pas forcément toujours à la méme place selon le classeur Excel.
Peux tu me donner un dernier coup de pouce?
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
Modifié par Polux31 le 1/06/2010 à 13:28
Ouvre l'éditeur VB (touche Alt + F11) tu trouveras le code dans "Feuil1" et module1.


Voilà le code commenté.
Dans "Feuil1":
Private Sub Worksheet_Change(ByVal Target As Range) 
Dim vTemp As String   'pour la colonne température 
Dim LH As String          'pour la colonne lecture haute 
Dim LB As String          'pour la colonne lecture basse 

    'On intercepte la saisie de l'utilisateur  
    'Si ce n'est pas la cellule C45 on sort de la procédure 
    If Target.Address <> "$C$45" Then Exit Sub 

    'On efface le contenu du tableau de report 
    Range("C47:H86").ClearContents 
    ' 
    'On affecte les colonnes concernées en fonction de la saisie 
    Select Case UCase(Target.Value) 
        Case "D1" 
            vTemp = "A" 
            LH = "C" 
            LB = "E" 
        Case "D2" 
            vTemp = "G" 
            LH = "I" 
            LB = "K" 
        Case "D3" 
            vTemp = "M" 
            LH = "O" 
            LB = "Q" 
        Case "D4" 
            vTemp = "S" 
            LH = "U" 
            LB = "W" 
        Case "D5" 
            vTemp = "Y" 
            LH = "AA" 
            LB = "AC" 
        Case "D6" 
            vTemp = "AE" 
            LH = "AG" 
            LB = "AI" 
    End Select 
    ' 
    'On passe les colonnes à la fonction qui affiche les données dans le tableau de report 
    Call Module1.AfficheDonnee(vTemp, LH, LB) 

End Sub


Dans le module1:
Sub AfficheDonnee(ByVal pTemp As String, ByVal pLH As String, ByVal pLB As String) 
Dim ws As Worksheet      'Objet feuille 
Dim lig As Long                  'indice de ligne 
Dim ligne As Long              'indice de ligne 


    'Déclaration de l'objet feuille (ici la feuille 1) 
    Set ws = Worksheets(1) 
    ' 
    'Pour la température 
    lig = 3  'première ligne à lire 
    ligne = 47  'première ligne à écrire 
    With ws 
        'Tant que la cellule n'est pas vide 
        While .Range(pTemp & lig).Value <> "" 
            On copie dans le tableau report le contenu de la cellule 
            .Range("C" & ligne).Value = .Range(pTemp & lig).Value 
            'On passe à la ligne suivante en lecture 
            lig = lig + 1 
            'On passe à la ligne suivante en écriture 
            ligne = ligne + 1 
        Wend 
         
        'Idem pour la lecture Haute 
        lig = 3 
        ligne = 47 
        While .Range(pLH & lig).Value <> "" 
            .Range("E" & ligne).Value = .Range(pLH & lig).Value 
            lig = lig + 1 
            ligne = ligne + 1 
        Wend 
         
        'Idem pour la lect(ure Basse 
        lig = 3 
        ligne = 47 
        While .Range(pLB & lig).Value <> "" 
            .Range("G" & ligne).Value = .Range(pLB & lig).Value 
            lig = lig + 1 
            ligne = ligne + 1 
        Wend 
    End With 
End Sub


Il te suffit d'adapter ça aux autres classeurs.

;o)
0
commentcamarcheeay Messages postés 666 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 30 mars 2020 86
1 juin 2010 à 16:03
J'ai une question Polux,
Comment as tu pu soigner la présentation de ton code sur le forum? Quand je veux écrire quelque chose en décalé (espaces au début de la ligne), après la validation de ma réplique tout s'aligne au début de ligne (l'espace au début des lignes s'efface)
Merci!
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
1 juin 2010 à 16:27
Salut commentcamarcheeay,

Dans le cadre pour écrire, tu as 4 balises : B I S et <> ...
Pour le code tu utilises <> c'est tout ...
;o)
0
commentcamarcheeay Messages postés 666 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 30 mars 2020 86
1 juin 2010 à 16:42
C'était alors aussi simple que ça! lol
Merci pour la réponse!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
EmilieM Messages postés 20 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 2 juin 2010
1 juin 2010 à 13:52
Merci beaucoup cela fonctionne parfaitement.

Bonne fin de journée.

Emilie.
0
commentcamarcheeay Messages postés 666 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 30 mars 2020 86
1 juin 2010 à 15:54
Bonjour,

Je voit que ta demande a déjà été satisfaite. Mais j'ai travaillé sur une autre macro et ai essayé de l'optimiser pour qu'elle soit utilisable dans d'autres champs.
Ci joint le fichier en question : Télécharger
0
commentcamarcheeay Messages postés 666 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 30 mars 2020 86
1 juin 2010 à 15:58
Voici le code principal de la macro qu'il faut savoir appeler à partir des cellules :

Function findAddress(myCell As Range, myField As Range) As String
'macro permettant de trouver l'adresse de la cellule contenant la valeur de "myCell" dans un champ "myField"
'si le résultat de la recherche est négatif, la fonction renvoie l'adresse de la cellule qui l'a appelée.
Dim cell As Range
For Each cell In Intersect(myField.Worksheet.UsedRange, myField)
If cell = myCell Then
findAddress = cell.Address
Exit Function
End If
Next
findAddress = Application.Caller.Address
End Function

Function offCell(myResBenchMark As Range, myBenchMark As Range) As Variant
'macro permettant de copier la cellule en respectant le même décalage :
'- une fois entre l'entête du tableau des données et la cellule concernée
'- une fois entre la cellule contenant la valeur recherchée et la cellule qui reçoit le résultat
On Error GoTo er
offCell = myResBenchMark.Worksheet.Cells(myResBenchMark.Row + Application.Caller.Row - myBenchMark.Row, myResBenchMark.Column + Application.Caller.Column - myBenchMark.Column)
If offCell = 0 Then offCell = ""
Exit Function
er:
offCell = ""
End Function

Dans les cellules concernées, il suffit de rentrer la formule suivante :
=offcell(INDIRECT(findaddress($C$45;$1:$1));$C$45)
0
EmilieM Messages postés 20 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 2 juin 2010
2 juin 2010 à 08:27
OK, merci je vais tester celle la aussi.

Emilie.
0