Création de fonction qui concatène des éléments

Bonjour,

J'ai un tableur qui comporte environ 150 colonnes. Sur celui-ci je souhaite avoir dans une colonne en début de tableau une concaténation de plusieurs infos. Aussi, j'ai pensé à une fonction, mais je ne parviens pas à la mettre en place à 100%, et je ne parviens pas à mettre la main sur mon erreur.

C'est pourquoi je viens ici pour vous demander votre aide.

Spoiler

Public Function RecapCamion(ByVal A As Range) As String

Dim NbColonne, i, j As Long

Dim Flag As Integer

Dim Design As String

'On compte le nombre de colonne de notre sélection

NbColonne = A.Columns.Count

Flag = 0

i = 1

j = 19

While (i <= NbColonne)

'si mag 1 est différent de vide

If A(1, i) <> "" Then

If (Flag = 0) Then

'Si la case bms est vide

If A(1, j) <> "" Then

'Alors ma disgnation c'est juste le numéro du mag 1

Design = A(1, i) & A(1, j)

Flag = 1

Else

Design = A(1, i)

Flag = 1

'Si ce n'est pas mon 1er magasin alors on flag et la disgnation de la tournée change

If A(1, j) <> "" Then

Design = Design & "/" & A(1, i) & A(1, j)

Else

Design = Design & "/" & A(1, i)

End If

End If

End If

End If

i = i + 20

j = j + 20

Wend

RecapCamion = Design

End Function

Je vous joint le fichier concerné (du moins une partie) dans lequel j'ai mis des éléments pour pouvoir tester cette fonction.

Bonjour,

explique avec des mots ce que tu veux réaliser.

Si on n'a qu'un code erroné pour comprendre on risque de mal interpréter.

Enplus tu ne précises pas quelle feuille ? avec les données de quelles colonnes? où tu veux le résultat ?

Ni dans quel module est ta fonction.

En donnant aussi qq exemples de résultat. Ligne tant je dois obtenir ça

eric

PS : dans Dim NbColonne, i, j As Long seule j est Long, il faut les typer individuellement

Bonjour,

En fait j'ai trouvé tout seul.

Je souhaitais que ma fonction concatenne le "n° de magasin" et la colonne "Commentaire Mag" pour chacun des magasin possibles dans la feuille "planning" dans la colonne M.

Par exemple en Cellule M6, je dois trouver 19Eur + Cult/96BMS/9001/73/57/36/7301

J'ai trouvé en faisant comme suit : (voir code en spoiler)

Spoiler

Public Function RecapCamion(ByVal A As Range) As String

Dim NbColonne, i, j As Long

Dim Flag As Integer

Dim Design As String

'On compte le nombre de colonne de notre sélection

NbColonne = A.Columns.Count

Flag = 0

i = 1

j = 19

While (i <= NbColonne)

'si mag 1 est différent de vide

If A(1, i) <> "" Then

If (Flag = 0) Then

'On passe à la dénomination

Design = A(1, i) & A(1, j)

Flag = 1

Else

'Si c'est le magasin suivant

Design = Design & "/" & A(1, i) & A(1, j)

End If

End If

i = i + 20

j = j + 20

Wend

RecapCamion = Design

End Function

Mais par contre je ne comprends pas pourquoi vous me dites que seul j est long ?

Pouvez vous me confirmer que ce que j'ai fait est bon du coup ?

Dim NbColonne as Long, i as Long, j As Long

Un peu tortueux mais tous les chemins mènent à Rome

J'aurais fait comme ça :

Function concat(pl As Range) As String
    Dim datas, col As Long
    If pl.Count Mod 20 Or pl.Count < 20 Then
        concat = " erreur plage"    ' plage doit être un multiple de 20 cellules
    Else
        datas = pl.Rows(1).Value    ' si plusieurs ligne on retient la 1ère
        For col = 1 To UBound(datas, 2) Step 20
            If datas(1, col) <> "" Then concat = concat & "/" & datas(1, col) & datas(1, col + 18)
        Next col
    End If
    concat = Mid(concat, 2) ' on supprime le 1er caractère "/"
End Function

eric

Alors merci @Eriic, mais j'aurais été incapable de sortir une fonction pareille .

C'est vraiment un autre level que celui que je peux avoir

Merci de m'avoir aider.

Ca viendra

Tu as vu la déclaration des variable au début du post ?

eric

oui oui, et j'ai bien noté surtout.

Mais pourquoi ? Quel est l'incidence ?

As Long au bout de la ligne ne les type pas toutes comme dans d'autres langages, seule la dernière l'est.

Si tu ne les types pas individuellement elles sont de type Variant par défaut.

ah ben j'ai une paire de macro à corriger alors

Bonjour,

J'ai un problème supplémentaire et je ne comprends pas pourquoi. Je m'explique :

Je touche à une autre macro lambda qui n'est pas dans ce classeur mais qui va chercher des infos de ce classeur, et à un moment, sans que je ne sache pourquoi, cela me fait basculer sur la fonction que j'ai créé hier.

Savez-vous pourquoi ?

Savez-vous ce que je dois faire ?

Bonjour,

oui, c'est un problème des fonctions personnalisées.

Des fois elles se trouvent appelées à tort alors qu'on travaille sur un autre classeur où elle n'est même pas présente.

Je ne comprend pas que ce gros bug n'ait jamais été corrigé.

Peux-tu ajouter cette ligne au début de la fonction :

MsgBox Application.Caller.Parent.Name & vbLf & Application.Caller.Parent.Parent.Name

et me dire ce que ça affiche lorsqu'elle est appelée à tort ?

Feuille et classeur où est la fonction, ou l'autre classeur ?

eric

Bonjour Eriiic,

Ca me dit "instruction incomplète à l'extérieur d'une procédure" (Erreur de compilation)

Mon code final étant :

Spoiler

MsgBox Application.Caller.Parent.Name & vbLf & Application.Caller.Parent.Parent.Name

Public Function RecapCamion(ByVal A As Range) As String

Dim NbColonne, i, j, k As Long

Dim Flag As Integer

Dim Design As String

'On compte le nombre de colonne de notre sélection

NbColonne = A.Columns.Count

Flag = 0

i = 1

j = 19

k = 141

While (i <= NbColonne - 1)

'si mag 1 est différent de vide

If A(1, i) <> "" Then

If (Flag = 0) Then

'On passe à la dénomination

Design = A(1, i) & A(1, j)

Flag = 1

Else

'Si c'est le magasin suivant

Design = Design & "/" & A(1, i) & A(1, j)

End If

End If

i = i + 20

j = j + 20

Wend

Design = Design & " " & A(1, k)

RecapCamion = Design

End Function

Ben oui, il faut le mettre dans la fonction, sous Function RecapCamion(ByVal A As Range) As String

au temps pour moi.... Je suis un boulet sur ce coup.

Ca me dit donc :

Planning

Base transport sec.xlsm

En fait je remets à plat la macro de messagerie que j'ai recopié dans module 1 du fichier ci-joint.

Je suis pour le moment loin de ce que je veux faire, mais pour autant, je ne comprends pas pourquoi ça me bascule sur la fonction.

et me dire ce que ça affiche lorsqu'elle est appelée à tort ?

Feuille et classeur où est la fonction, ou l'autre classeur ?

et me dire ce que ça affiche lorsqu'elle est appelée à tort ?

Feuille et classeur où est la fonction, ou l'autre classeur ?

Re,

Ca me dit juste le nom de l'onglet et le nom du fichier où se trouve la fonction comme je l'ai dit dans mon post précédent.

Feuille et classeur où est la fonction tout à fait. Ensuite ça passe le bout de code que vous m'avez demandé d'ajouter puis ça continue la fonction avant de revenir à ma macro.

Vu que c'est un bug excel qu'on n'arrive pas à reproduire systématiquement ce n'est pas simple.

Tente en mettant en 1ère ligne de la fonction :

Application.Volatile False

Si ça ne change rien il faudra procéder autrement : mettre à jour ta cellule sur l'événement Change des 2 cellules concernées de tes magasins.

eric

Alors je l'ai mis en 1ere ligne de fonction (Après le Function) et ça ne résout pas le problème.

J'ai vérifié à quel moment ça me bascule sur la fonction :

C'est quand je vais sur mon fichier où je récupère mes données et que je filtre,

Puis lorsque je retourne en fin de procédure sur mon fichier ou mes données sont et que je retire les filtres.

Donc oui, il doit y avoir une question de recalcul des données qui se fait :/

Une fonction sera ré-évaluée si une écriture se fait sur la plage que tu lui passes en paramètre.

Si c'est ce que fait ton 2nd classeur, c'est normal qu'elle se recalcule.

eric

Ok, merci Eriiic,

Il n'y aucun moyen de contourner le problème ? (Ca n'est gênant que lorsque je fais tourner la macro pas à pas)

Rechercher des sujets similaires à "creation fonction qui concatene elements"