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?
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.
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.
,
), appuyez sur Ctrl-H (Trouver et remplacer)^p
,
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.
Vous pouvez faire quelque chose comme ça. Si vous ne parlez pas d'une feuille de calcul énorme, cela fonctionnerait "ok" ...
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. ;)
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 ligness
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 casmuncherelli, 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
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!
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
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.