web-dev-qa-db-fra.com

Convertir une colonne en une liste séparée par des virgules

J'ai pour tâche de créer une feuille Excel simple prenant un nombre non spécifié de lignes dans la colonne A, comme ceci:

1234
123461
123151
11321

Et faites-les dans une liste séparée par des virgules dans une autre cellule que l'utilisateur peut facilement copier et coller dans un autre programme comme ceci:

1234,123461,123151,11321

Quelle est la manière la plus simple de faire ça?

119
muncherelli

En fait, je viens de créer un module dans VBA qui effectue tout le travail. Il prend ma liste à distance et crée une chaîne délimitée par des virgules qui est sortie dans la cellule de mon choix:

Function csvRange(myRange As Range)
    Dim csvRangeOutput
    Dim entry as variant
    For Each entry In myRange
        If Not IsEmpty(entry.Value) Then
            csvRangeOutput = csvRangeOutput & entry.Value & ","
        End If
    Next
    csvRange = Left(csvRangeOutput, Len(csvRangeOutput) - 1)
End Function

Alors dans ma cellule, je viens de mettre =csvRange(A:A) et cela me donne la liste délimitée par des virgules.

22
muncherelli

En supposant que vos données commencent en A1, je mettrais ce qui suit dans la colonne B:

B1:

=A1

B2:

=B1&","&A2

Vous pouvez ensuite coller la colonne B2 dans toute la colonne. La dernière cellule de la colonne B devrait maintenant être une liste de la colonne A séparée par des virgules.

140
Sux2Lose
  • Copier la colonne dans Excel
  • Ouvrir le mot
  • "Coller spécial" sous forme de texte uniquement
  • Sélectionnez les données dans Word (celles que vous devez convertir en texte séparé par ,), appuyez sur Ctrl-H (Trouver et remplacer)
  • Dans la zone "Rechercher", tapez ^p
  • Dans la boîte "Remplacer par", tapez ,
  • Sélectionnez "Remplacer tout"
74
Michael Joseph

Si vous avez Office 365 Excel, vous pouvez utiliser TEXTJOIN ():

=TEXTJOIN(",",TRUE,A:A)

 enter image description here

27
Scott Craner

Une autre approche consisterait à coller la colonne Excel dans cet outil intégré au navigateur:

convert.town/column-to-comma-separated-list

Il convertit une colonne de texte en une liste séparée par des virgules.

Comme l'utilisateur copie et colle de toute façon dans un autre programme, cela peut être tout aussi facile pour lui.

10
sunset

Vous pouvez faire quelque chose comme ça. Si vous ne parlez pas d'une feuille de calcul énorme, cela fonctionnerait "ok" ...

  • Alt-F11, Créer une macro pour créer la liste (voir le code ci-dessous)
  • L'affecter à un raccourci ou à un bouton de la barre d'outils
  • L'utilisateur colle leur colonne de chiffres dans la colonne A, appuie sur le bouton et sa liste entre dans la cellule B1.

Voici le code de macro VBA:

Sub generatecsv() 

Dim i As Integer
Dim s As String

i = 1

Do Until Cells(i, 1).Value = ""
    If (s = "") Then
        s = Cells(i, 1).Value
    Else
        s = s & "," & Cells(i, 1).Value
    End If
    i = i + 1 
Loop

Cells(1, 2).Value = s

End Sub

Veillez à définir le format de la cellule B1 sur "texte", sinon vous obtiendrez un numéro erroné. Je suis sûr que vous pouvez le faire également dans VBA, mais je ne sais pas comment faire pour le moment et je dois retourner au travail. ;)

7
mpeterson

Utilisez vi ou vim pour simplement placer une virgule à la fin de chaque ligne:

%s/$/,/

Pour expliquer cette commande:

  • % signifie que l’action est effectuée (trouver et remplacer) sur toutes les lignes
  • s indique une substitution
  • / sépare les arguments (c.-à-d. s/find/replace/options)
  • $ représente la fin d'une ligne
  • , est le texte de remplacement dans ce cas
6
Breathwork

muncherelli, ta réponse me plaisait et je la peaufine :). Juste une petite chose, il m'est parfois nécessaire d'extraire des données d'une feuille et de les utiliser pour interroger une base de données. J'ai ajouté un paramètre facultatif "textQualify" qui permet de créer une liste séparée par des virgules utilisable dans une requête.

Function csvRange(myRange As Range, Optional textQualify As String)
    'e.g. csvRange(A:A)  or csvRange(A1:A2,"'") etc in a cell to hold the string
    Dim csvRangeOutput
    For Each entry In myRange
        If Not IsEmpty(entry.Value) Then
            csvRangeOutput = csvRangeOutput & textQualify & entry.Value & textQualify & ","
        End If
    Next
    csvRange = Left(csvRangeOutput, Len(csvRangeOutput) - 1)
End Function
2
mitch

Vous pouvez utiliser le guide de How-To Geek pour transformer une ligne en une colonne et l'inverser simplement. Exportez ensuite les données au format CSV (format supprimé par des virgules) et vous obtenez votre liste en texte brut séparée par des virgules! Vous pouvez copier du bloc-notes et le remettre dans Excel si vous le souhaitez. En outre, si vous souhaitez laisser un espace après la virgule, vous pouvez effectuer une recherche et remplacer la fonctionnalité en remplaçant "," par ",". J'espère que cela pourra aider!

2
Duall

J'ai amélioré le sous-générateur generatecsv () pour gérer une feuille Excel contenant plusieurs listes avec des lignes vierges séparant à la fois les titres de chaque liste et les listes de leurs titres. Exemple

list title 1

item 1
item 2

list title 2

item 1
item 2

et les combine bien sûr en plusieurs rangées, une par liste.

raison, j’ai demandé à un client de m’envoyer plusieurs mots-clés sous forme de liste pour leur site Web en fonction de leur sujet, il me fallait un moyen de les insérer facilement dans les pages Web. Ainsi, la routine a été modifiée et les éléments suivants sont apparus. J'ai également remplacé les noms de variables par des noms significatifs:

    Sub generatecsv()

      Dim dataRow As Integer
      Dim listRow As Integer
      Dim data As String

      dataRow = 1: Rem the row that it is being read from column A otherwise known as 1 in vb script
      listRow = 1: Rem the row in column B that is getting written

      Do Until Cells(dataRow, 1).Value = "" And Cells(dataRow + 1, 1).Value = ""
        If (data = "") Then
          data = Cells(dataRow, 1).Value
        Else
          If Cells(dataRow, 1).Value <> "" Then
            data = data & "," & Cells(dataRow, 1).Value
          Else
            Cells(listRow, 2).Value = data
            data = ""
            listRow = listRow + 1
          End If
        End If
        dataRow = dataRow + 1
      Loop

      Cells(listRow, 2).Value = data

    End Sub
1
roger lamb

La réponse de Sux2Lose est ma méthode préférée, mais elle ne fonctionne pas si vous avez plus de deux mille lignes et risque de se rompre avec encore moins de lignes si votre ordinateur ne dispose pas de beaucoup de mémoire.

Dans ce cas, la meilleure pratique consiste probablement à copier la colonne, à créer un nouveau classeur, un élément spécial passé dans A1 du nouveau classeur et Transpose afin que la colonne soit maintenant une ligne. Enregistrez ensuite le classeur en tant que .csv. Votre csv est maintenant à la base une liste séparée par des virgules en texte brut que vous pouvez ouvrir dans un éditeur de texte.

Remarque: N'oubliez pas de transposer la colonne dans une ligne avant de l'enregistrer sous csv. Sinon, Excel ne saura pas insérer de virgule entre les valeurs.

1
samthebrand