Erreur sur l'appel d'une fonction

Bonjour,

J'ai tapé le code qui suit car j'ai besoin de copier certaines cellules de ma feuille 1 dans une autre feuille (clients) du même fichier et jusque là tout fonctionne, cependant il y a deux endroits où je dois intégrer plusieurs cellules dans la même case. J'ai donc rechercher sur le forum et j'ai trouvé un code vba avec la function concatener. J'ai essayé de l'intégrer dans mon code en suivant l'exemple fourni sur le forum mais je n'arrive pas à appeler cette fonction, je dois mettre trompé dans les arguments ou je ne sais quoi mais je n'arrive pas à comprendre.

Les deux lignes qui me pose problème sont en fin de code, sur la première (collage en colonne F) le code fonctionne mais le collage se fait sur plusieurs lignes. Sur la deuxième (collage en colonne G) j'ai essayé d'appeler la function concatener mais sans succès, je m'y suis sûrement mal prise.

Je n'ai pas réussi à vous mettre le fichier de ce module donc je vous l'ai retranscrit.

Pourriez vous m'aider s'il vous plaît?

Merci d'avance

Tissaraz

Public Function Concatener(ByVal matrice As Variant, separateur As String) As String

    Dim c As String
    Application.Volatile

    For Each c In matrice
        Concatener = Concatener & c & separateur
    Next
        If Len(Concatener) > 0 Then
        Concatener = Left(Concatener, Len(Concatener) - Len(separateur))
        End If

End Function

Sub Transfert_donnees_clients()

 Dim lstrwa As Long
 Dim lstrwb As Long
 Dim lstrwc As Long
 Dim lstrwd As Long
 Dim lstrwe As Long
 Dim lstrwf As Long
 Dim lstrwg As Long
 Dim lstrwh As Long
 Dim lstrwac As Long
 Dim lstrwad As Long

 Dim rwnuma As Long
 Dim rwnumb As Long
 Dim rwnumc As Long
 Dim rwnumd As Long
 Dim rwnume As Long
 Dim rwnumf As Long
 Dim rwnumg As Long
 Dim rwnumh As Long
 Dim rwnumac As Long
 Dim rwnumad As Long

'Je désactive la protection de la feuille:
    ActiveSheet.Unprotect
'J'identifie l'onglet de collage:
    Set ws_clients = Worksheets("CLIENTS")

 'J'identifie la derniere cellule non vide de la colonne A:
    lstrwa = ws_clients.Range("A" & Rows.Count).End(xlUp).Row
    rwnuma = lstrwa + 1
 'J'identifie la derniere cellule non vide de la colonne B:
    lstrwb = ws_clients.Range("B" & Rows.Count).End(xlUp).Row
    rwnumb = lstrwb + 1
  'J'identifie la derniere cellule non vide de la colonne C:
    lstrwc = ws_clients.Range("C" & Rows.Count).End(xlUp).Row
    rwnumc = lstrwc + 1
  'J'identifie la derniere cellule non vide de la colonne D:
    lstrwd = ws_clients.Range("D" & Rows.Count).End(xlUp).Row
    rwnumd = lstrwd + 1
  'J'identifie la derniere cellule non vide de la colonne E:
    lstrwe = ws_clients.Range("E" & Rows.Count).End(xlUp).Row
    rwnume = lstrwe + 1
  'J'identifie la derniere cellule non vide de la colonne F:
    lstrwf = ws_clients.Range("F" & Rows.Count).End(xlUp).Row
    rwnumf = lstrwf + 1
  'J'identifie la derniere cellule non vide de la colonne G:
    lstrwg = ws_clients.Range("G" & Rows.Count).End(xlUp).Row
    rwnumg = lstrwg + 1
  'J'identifie la derniere cellule non vide de la colonne H:
    lstrwh = ws_clients.Range("H" & Rows.Count).End(xlUp).Row
    rwnumh = lstrwh + 1
  'J'identifie la derniere cellule non vide de la colonne AC:
    lstrwac = ws_clients.Range("AC" & Rows.Count).End(xlUp).Row
    rwnumac = lstrwac + 1
  'J'identifie la derniere cellule non vide de la colonne AD:
    lstrwad = ws_clients.Range("AD" & Rows.Count).End(xlUp).Row
    rwnumad = lstrwad + 1

'Je copie la cellule E26 de la page formulaire decouverte dans la premiere cellule vide en colonne A de la page clients:
        ActiveSheet.Range("E26").Copy ws_clients.Cells(rwnuma, 1)
'Je copie la cellule E10 de la page formulaire decouverte dans la premiere cellule vide en colonne B de la page clients:
        ActiveSheet.Range("E10").Copy ws_clients.Cells(rwnumb, 2)
'Je copie la cellule E12 de la page formulaire decouverte dans la premiere cellule vide en colonne C de la page clients:
        ActiveSheet.Range("E12").Copy ws_clients.Cells(rwnumc, 3)
'Je copie la cellule E22 de la page formulaire decouverte dans la premiere cellule vide en colonne D de la page clients:
        ActiveSheet.Range("E22").Copy ws_clients.Cells(rwnumd, 4)
'Je copie la cellule E24 de la page formulaire decouverte dans la premiere cellule vide en colonne E de la page clients:
        ActiveSheet.Range("E24").Copy ws_clients.Cells(rwnume, 5)

'Je copie la cellule E14+E16+E18+E20 de la page formulaire decouverte dans la premiere cellule vide en colonne F de la page clients:
        ActiveSheet.Range("E14,E16,E18,E20").Copy ws_clients.Cells(rwnumf, 6)

'Je copie la cellule E37+E29+E41+E43 de la page formulaire decouverte dans la premiere cellule vide en colonne G de la page clients:
        Y = Concatener(E37:E43;"-")
        ActiveSheet.Y.Copy ws_clients.Cells(rwnumg, 7)

'Je copie la cellule E68 de la page formulaire decouverte dans la premiere cellule vide en colonne H de la page clients:
        ActiveSheet.Range("E68").Copy ws_clients.Cells(rwnumh, 8)
'Je copie la cellule E97 de la page formulaire decouverte dans la premiere cellule vide en colonne AC de la page clients:
        ActiveSheet.Range("E97").Copy ws_clients.Cells(rwnumac, 29)
'Je copie la cellule E99 de la page formulaire decouverte dans la premiere cellule vide en colonne AD de la page clients:
        ActiveSheet.Range("E99").Copy ws_clients.Cells(rwnumad, 30)

'Je réactive la protection de la feuille:
    ActiveSheet.Protect

End Sub

Bonjour Tissaraz,

Tu peux essayer les lignes de code ci-dessous à ajouter (déclarations) et à substituer à celles présentes dans les pavés à copier.

' Déclarations à ajouter en tête de procédure
Dim vValConcat as variant
Dim nI as Integer

'Je copie la cellule E14+E16+E18+E20 de la page formulaire decouverte dans la premiere cellule vide en colonne F de la page clients:
    ' supprimer "& vbCrLf" dans la ligne ci-dessous si des retours à la ligne ne sont pas nécessaires
    vValConcat =""
    For nI = 14 to 20 Step 2
        if vValConcat <> "" then vValConcat = vValConcat & vbCrLf
        vValConcat = vValConcat & ActiveSheet.Range("E" & nI).Value
    Next
    ws_clients.Cells(rwnumf, 6).Value = vValConcat

'Je copie la cellule E37+E29+E41+E43 de la page formulaire decouverte dans la premiere cellule vide en colonne G de la page clients:
    vValConcat =""
    For nI = 37 to 43
        if vValConcat <> "" then vValConcat = vValConcat & "-"
        vValConCat = vValConcat & ActiveSheet.Range("E" & nI).Value
    Next
    ws_clients.Cells(rwnumg, 7).Value = vValConcat
Cdlt,
Cylfo

Bonjour,

Merci Cylfo pour ton aide je vais essayer cela tout de suite et je te tiens au courant.

Cependant étant dans la démarche d'apprendre, j'avoue que je ne comprends pas tout le code. La fonction Concatener que j'ai écrite n'a pas d'utilité dans ton code? est ce que c'est parce que je l'ai mal écrite ou est ce parce qu'il est plus simple de le faire à ta façon? Dans ce cas pourrais tu avoir la gentillesse de me l'expliquer? J'ai chercher sur internet la signification des termes que je ne connaissais pas mais l'ensemble reste flou.

Merci encore pour ton temps.

Tissaraz

Bonjour,

La fonction "CONCATENER" ou maintenant "CONCAT" est une fonction de feuille de calcul qui pourrait être appelée en VB via Application.Concat(...) ou Application.WorksheetFunction .Concat(...)" par contre elle ne permet pas l'utilisation d'un délimiteur.

Par contre j'ai eu un gros trou de mémoire , il existe une fonction VB "Join" qui permet de concaténer des valeurs en utilisant éventuellement un séparateur. La fonction utilise en 1er paramètre un tableau de valeurs et en 2ème paramètre optionnel un délimiteur. Pour info la fonction inverse de Join est Split.

'Je copie la cellule E14+E16+E18+E20 de la page formulaire decouverte dans la premiere cellule vide en colonne F de la page clients:
    ' supprimer ", vbCrLf" dans la ligne ci-dessous si des retours à la ligne ne sont pas nécessaires
    ' Array( Range("E14"), Range("E16"), Range("E18"), Range("E20") ) : la fonction Array(...) = création d'un tableau contenant les valeurs des
    ' cellules à concaténer.
    ws_clients.Cells(rwnumf, 6).Value = Join(Array( Range("E14"), Range("E16"), Range("E18"), Range("E20")), vbCrLf)

'Je copie la cellule E37+E29+E41+E43 de la page formulaire decouverte dans la premiere cellule vide en colonne G de la page clients:
' ATTENTION : le code ci-dessous correspond à ce qui est indiqué dans ton commentaire mais la ligne de code "Concatener(E37:E43;"-")"
' semble indiquer que tu voudrais prendre toutes les cellules comprises entre E37 et E43 ... 
    ws_clients.Cells(rwnumg, 7).Value = Join(Array(Range("E37"), Range("E29"), Range("E41"), Range("E43")), "-")

En plus ... j'avais lu E39 au lieu de E29 dans la 2ème partie du code ... donc cela ne risquait pas de fonctionner correctement ... désolé

Je t'explique le code communiqué à ma 1ère réponse :

    ' RAZ de la variable qui contiendra le résultat de la concaténation
    vValConcat =""
    ' Faire une boucle dont l'indice varie de 2 en 2 de 14 à 20 (l'indice vaudra donc 14, 16, 18 et 20)
    For nI = 14 to 20 Step 2
        ' SI la variable est différente de vide ALORS ajouter le séparateur (ici vbCrlf) à la fin de la variable
        if vValConcat <> "" then vValConcat = vValConcat & vbCrLf
        ' ajouter à la variable la valeur de la cellule "E" correspondant à la ligne indicée par nI (donc E14 au  1er passage dans
        ' la boucle puis "E16" au 2ème passage, puis "E18" au 3ème passage et enfin "E20" au 4ème).
        vValConcat = vValConcat & ActiveSheet.Range("E" & nI).Value
    Next
    ' Affectation de la valeur de la variable à la cellule
    ws_clients.Cells(rwnumf, 6).Value = vValConcat

Cdlt,

Cylfo

Bonjour Cylfo,

Merci beaucoup pour ton retour c'est plus claire maintenant et pour info c'est de ma faute j'ai mal écrit il s'agissait bien de la cellule E39 et non pas E29.

Encore une question! Dans la deuxième partie tu n'a pas noté step 2 donc le step 2 est -il vraiment nécessaire?

Merci pour ton aide et ton temps.

Tissaraz

Il faut "Step 2" si tu veux concaténer les valeurs d'une cellule sur deux (E37, E39, E41, E43), c'est là où il y avait ambiguïté entre le commentaire qui indiquait 1 cellule sur 2 (E37+E39+E41+43) et le code qui indiquait la plage complète E37:E43.

Bonjour,

Merci pour tout Cylfo, c'est un plaisir d'apprendre de nouvelles chose avec des gens qui prennent le temps de nous expliquer ce que nous ne comprenons pas.

A bientot

Rechercher des sujets similaires à "erreur appel fonction"