2017-07-21 1 views
0

Dans Excel, j'ai besoin de concaténer chaque autre cellule dans une cellule "maître". J'ai utilisé cette formule pour vaincre avant =SUBSTITUTE(TRIM(G2 & " " & BC2 & " " & BE2 & " " & BG2), " ", ", ") mais cela modifie les données lorsque les données que je concatène ont une virgule dedans.Concaténer si liste non nulle avec des virgules

La plage de cellules que j'ai besoin de concaténer est une cellule sur deux allant de G2 à BG2. Quel serait le meilleur plan d'action pour que cela se produise lors de la concaténation impliquant des listes de virgules?

EDIT
Par ce que je veux dire avec Alters des données est que ce

S223 - Pills, S2323 - Patterns - Backstock, 1/Var 

devient cela avec la formule ci-dessus

S223, -, Pills,, S2323, -, Patterns, -, Backstock,, 1/Var 
+0

TEXTJOIN(), il est disponible sur Office 365 Excel. Il a la capacité d'ignorer les cellules vides. –

+0

Que voulez-vous dire "modifie les données quand j'ai une virgule dedans". Cette formule concatène toutes les valeurs, coupe les espaces de début et de fin, puis remplace tous les espaces par une virgule et un espace. Cela ne modifie pas les espaces existants dans les données. Je suppose que vous pourriez vouloir un 'SUBSTITUTE (TRIM (....),", ","; ")' dans votre fonction Substitute existante pour échanger des virgules dans les données avec un point-virgule ou quelque chose ...? – JNevill

+0

@JNevill - voir mon édition – BellHopByDayAmetuerCoderByNigh

Répondre

0

Tout à fait quelque temps il y a, je l'ai trouvé ce code en ligne comme j'en avais besoin pour un projet personnel. Ce que cela fait est qu'il prend une chaîne et remplace chaque valeur "non autorisée" par un caractère spécifié. Dans votre cas, j'imagine que vous autorisez tous les caractères sauf "," et le remplacez par "" ou "". De cette façon, A, -, B, -, C, deviendrait A - B - C

Function cleanString(text As String) As String 

    Dim output As String 
    Dim c 
    For i = 1 To Len(text) 
     c = Mid(text, i, 1) 
     If (c >= "a" And c <= "z") Or (c >= "0" And c <= "9") Or (c >= "A" And c <= "Z" Or c = " " Or c = "-" Or c = "é" Or c = "É" Or c = "_") Then ' <=list of allowed values in a string 
      output = output & c 
     Else 
      output = output & " " '<= what unallowed values gets replaced by 
     End If 
    Next 
    cleanString = output 
End Function 

Espérons que cela peut aider, je considère VBA que vous avez ajouté la balise dans votre question.

+0

Ma solution propose de "nettoyer" la chaîne AFTER en utilisant votre formule au lieu de trouver une meilleure formule sutied qui semble assez difficile en regardant tous les commentaires. –

+0

Comment utiliser cette fonction? Je sais placer dans le module mais après tel? – BellHopByDayAmetuerCoderByNigh

+0

Fondamentalement, j'imagine que vous concevez une sorte de onChangeEvent dans votre classeur qui appelle ce sub où la chaîne d'entrée est la valeur de votre cellule –

0

L'UDF suivante de answers.microsoft.com devrait être ce que vous êtes après

Function TEXTJOIN(delimiter As String, ignore_empty As String, ParamArray textn() As Variant) As String 
    Dim i As Long 
    For i = LBound(textn) To UBound(textn) - 1 
     If Len(textn(i)) = 0 Then 
      If Not ignore_empty = True Then 
       TEXTJOIN = TEXTJOIN & textn(i) & delimiter 
      End If 
     Else 
      TEXTJOIN = TEXTJOIN & textn(i) & delimiter 
     End If 
    Next 
    TEXTJOIN = TEXTJOIN & textn(UBound(textn)) 
End Function