Ajouter conditions à une fonction TEXTJOIN en VBA (Excel 2016)
Bonjour,
je me remets à la programmation VBA et je me rends compte que j'ai perdu beaucoup d'acquis avec les années !! J'ai Excel 2016, donc je ne peux utiliser la nouvelle fonction TEXTJOIN. J'ai donc ajouté une fonction home made qui cumule plusieurs données dans une même cellule, mais je dois la filtrer et je n'y arrive pas.
Dans la colonne D de l'onglet INFO, je cherche à afficher, pour chaque MAIN_ID, les SUB_NAME(s) qui répondent à 2 critères:
1. le SUB_NAME correspond au MAIN_ID (onglet SUB, colonnes B & C)
2. le SUB_STATUS (onglet SUB, colonne D) est "Public"
Je devrais retourner environ 4 valeurs par ligne, mais présentement, comme je n'arrive pas à filtrer, ma fonction retourne +/- 80 valeurs.
Voici mon code, auriez-vous l'aimabilité de m'aider avec la partie manquante ?
Un gros merci à l'avance et au plaisir d'échanger avec vous prochainement !
-------------------------
Option Explicit
Function My_TeXt_Join(delimiter As String, ignore_empty As Boolean, text_range As Range) As String
Application.Volatile
Dim c As Range
Dim n As Long
n = 0
For Each c In text_range
If ignore_empty = True Then
If VBA.IsEmpty(c.Value) = False Then
If n = 0 Then
My_TeXt_Join = c.Value
Else
My_TeXt_Join = My_TeXt_Join & delimiter & c.Value
End If
n = n + 1
End If
Else
If n = 0 Then
My_TeXt_Join = c.Value
Else
My_TeXt_Join = My_TeXt_Join & delimiter & c.Value
End If
n = n + 1
End If
Next
End FunctionEdit modo : code mis entre balises, merci d'y faire attention la prochaine fois
bonjour, une méthode "quick and dirty", juste pour vous montrez ce qu'il est possible et à modifier plus tard ...
Function My_TeXt_Join1(delimiter As String, ignore_empty As Boolean, Condition) As String
Application.Volatile 'toujours calculate
aa = Evaluate("transpose(if(table4[main_id]=" & Condition & ",table4[sub_name],""~""))") 'filtrer avec condition (similar à une focntion dans la feuille
If ignore_empty Then aa = Filter(aa, "~", 0) 'supprimer les valeurs fauses en case de ignore_empty
s = Join(aa, delimiter) 'joindre
If Not ignore_empty Then s = Replace(s, "~", "") 'remplacer les "~" par "" en cas de not ignore_empty
My_TeXt_Join1 = s
End Functionméthode moins "quick&dirty" (cellules oranges) PS. au lieu d'une matrice on peut aussi utiliser les cellules directement
Function My_TeXt_Join2(delimiter As String, ignore_empty As Boolean, Condition) As String
Dim aA
Application.Volatile
aA = Range("Table4").Value 'votre tableau
For i = 1 To UBound(aA) 'boucle les données
b = (aA(i, 3) = Condition) 'vérifier condition
If Not ignore_empty Or b Then s = s & delimiter & IIf(b, aA(i, 2), "") 'joindre dans ces 2 cas
Next
My_TeXt_Join2 = Mid(s, Len(delimiter) + 1)
End FunctionBonjour RustyProg et
Une petite présentation ICI serait la bienvenue
Je vous invite à lire :
- La charte du forum
- Quelques fonctionnalites du forum à connaître
Regardez aussi les petites icônes mises à votre disposition dans la barre de menu qui :
- vous permettent de poster un code (</>)
- ou de clôturer un fil lorsque vous avez terminé (V)
Merci pour votre participation
Cordialement