macro excel renvoyant toutes les valeurs d'une variable

eclipse008

Nouveau membre
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
Code:
colA   col B
A1         a
A1         b
A1         c
A2         b
A2         e
A3         f

et moi je voudrai avoir en résultat

Code:
col A     col B

A1         a,b,c
A2         b,e
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
 

Sozat

Nouveau membre
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
 

eclipse008

Nouveau membre
non et déterminées :)

j'ai ce code
[cpp]
Function ConcatVLookUp(ByVal ValRecherche, _
ByVal TabMatrice As Range, _
ByVal IndexCol, _
Optional ByVal separateur = ";") As Variant
' Permet une recherchev sur des caractères génériques
'
Dim c As Range



Application.Volatile

For Each c In TabMatrice.Cells
If c.Value Like ValRecherche Then
ConcatVLookUp = ConcatVLookUp & separateur & c.Offset(0, IndexCol - 1).Value

End If
Next c
ConcatVLookUp = Mid(ConcatVLookUp, Len(separateur) + 1)

Set c = Nothing
End Function

[/cpp]

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

eclipse008

Nouveau membre
j'ai changé le code

merci

j'ai entendu parlé de vous Zeb, maitenant que j'ai changé mon post pourriez vous m'aider svppp?:=( car ca devient insupportable d'avoir un classeru aussi lent :(

merci d'avance
 

zeb

Modérateur
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.
Code:
Function function_name(n As Integer) As Integer
    Dim i As Integer
    Dim tmp As Integer

    tmp = 1
    For i = 1 To n
        tmp = tmp * n
    Next
    function_name = tmp
End Function
Je vous laisse le soin à tous de trouver un nom plus pertinent que function_name à cette fonction ;)
 

eclipse008

Nouveau membre
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 :(
 

eclipse008

Nouveau membre
j'ai changé mon code en

[cpp]

Function ConcatVLookUp(ByVal ValRecherche, _
ByVal TabMatrice As Range, _
Optional ByVal separateur = ",") As Variant
' Permet une recherchev sur des caractères génériques
'
Dim c As Range
Dim tmp As Variant


Application.Volatile

For Each c In TabMatrice.Cells
If c.Value Like ValRecherche Then
tmp = tmp & separateur & c.Offset(0, 1).Value
End If
Next c
ConcatVLookUp = Mid(tmp, Len(separateur) + 1)

Set c = Nothing
End Function


[/cpp]

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
 

zeb

Modérateur
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à.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 063
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut