Se connecter avec
S'enregistrer | Connectez-vous

macro excel renvoyant toutes les valeurs d'une variable

Dernière réponse : dans Programmation

bonjour a toutes et à tous

je me permets de vous déranger ici car j'ai besoin de votre aide

voila, imaginons, j'ai une feuille excel avec
  1. colA col B
  2. A1 a
  3. A1 b
  4. A1 c
  5. A2 b
  6. A2 e
  7. A3 f


et moi je voudrai avoir en résultat

  1. col A col B
  2.  
  3. A1 a,b,c
  4. A2 b,e
  5. A3 f


cad rechercher toutes les valeurs de la col A et leur associer dans une seule cellule les valeurs dans la colonne B correspondante

merci d'avance

cdlt


eclipse
Lassé par la pub ? Créez un compte

Souhaite tu que ton resultat remplace la feuille initiale ?

Les valeurs A1-A3 sont elles determinees a l'avance ou sont elles sujette a variations ?

Si ta reponse est "non" et "determinees", c'est plus simple :D 

Malheureusement, n'ayant internet qu'au taf... je ne pourrais pas trop t'aider (c pas bien vu par le boss ;)  )... mais je pense que les question que je pose pourront etre utile... a Zeb par exemple :p 

non et déterminées :) 

j'ai ce code
  1. Function ConcatVLookUp(ByVal ValRecherche, _
  2. ByVal TabMatrice As Range, _
  3. ByVal IndexCol, _
  4. Optional ByVal separateur = ";") As Variant
  5. ' Permet une recherchev sur des caractères génériques
  6. '
  7. Dim c As Range
  8.  
  9.  
  10.  
  11. Application.Volatile
  12.  
  13. For Each c In TabMatrice.Cells
  14. If c.Value Like ValRecherche Then
  15. ConcatVLookUp = ConcatVLookUp & separateur & c.Offset(0, IndexCol - 1).Value
  16.  
  17. End If
  18. Next c
  19. ConcatVLookUp = Mid(ConcatVLookUp, Len(separateur) + 1)
  20.  
  21. Set c = Nothing
  22. End Function


mais ca rend mmon classeur trop lent et je voudrai l'optimiser :( 
Expert Programmation

Je te tutoie, fais en autant. ;) 


Les fonctions Volatiles sont par construction très gourmandes en ressource.
Il faut donc ne pas en abuser, et les écrire avec grand soin.

La première question serait : < As-tu vraiment besoin d'une fonction volatile ? >

Mais je remarque surtout que la fonction est récursive. Elle s'appelle elle-même.
Est-ce une volonté délibérée ?

Si non, il faut utiliser une variable temporaire pour construire ta chaîne puis seulement à la fin, affecter cette variable.

Ci-après un exemple classique.
  1. Function function_name(n As Integer) As Integer
  2. Dim i As Integer
  3. Dim tmp As Integer
  4.  
  5. tmp = 1
  6. For i = 1 To n
  7. tmp = tmp * n
  8. Next
  9. function_name = tmp
  10. End Function

Je vous laisse le soin à tous de trouver un nom plus pertinent que function_name à cette fonction ;) 

j'a besoin d'une fonction volatile, car ma colonne B peut être amenee à changer

sinon, je n'ai pas compris l'exemple, :( , excuse moi car je suis debutant et j'ai fait ce code avec l'aide de qq'un

comment dois-je modifier ma fonction pouyr qu'elle fasse la meme chose mais utilise ton code?

desole de faire repeter :( 

j'ai changé mon code en

  1. Function ConcatVLookUp(ByVal ValRecherche, _
  2. ByVal TabMatrice As Range, _
  3. Optional ByVal separateur = ",") As Variant
  4. ' Permet une recherchev sur des caractères génériques
  5. '
  6. Dim c As Range
  7. Dim tmp As Variant
  8.  
  9.  
  10. Application.Volatile
  11.  
  12. For Each c In TabMatrice.Cells
  13. If c.Value Like ValRecherche Then
  14. tmp = tmp & separateur & c.Offset(0, 1).Value
  15. End If
  16. Next c
  17. ConcatVLookUp = Mid(tmp, Len(separateur) + 1)
  18.  
  19. Set c = Nothing
  20. End Function


ca accelere un tout petit peu (grand merci pour ca, c super, vraiment)

mais donc la c la meilleure optimisation possible a part si j'enleve le volatile?

c ca?

ou il y d'autres facons encore mieux de l'ecrire ?

merci encore
Expert Programmation

Ah, c'est bien mieux !

Le VB n'est pas un langage très performant par nature.
Les instructions de type Like sont gourmandes.
Voir si tu peux modifier ça.

Sinon, rien d'autre à dire. Sauf si tu ne sais pas trop pourquoi tu utilises le Volatile. Regarde bien dans l'aide à quoi cela correspond et si cette option ne t'est pas indispensable, vire-là.
Lassé par la pub ? Créez un compte