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
'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