将列转换为逗号分隔的列表


129

我的任务是创建一个简单的Excel工作表,该工作表在A列中采用未指定数量的行,如下所示:

1234
123461
123151
11321

并将它们放入另一个单元格中的逗号分隔列表中,用户可以轻松地将其复制并粘贴到另一个程序中,如下所示:

1234,123461,123151,11321

最简单的方法是什么?


8
解决方案的一部分可能是“编辑”,“选择性粘贴”,“转置”以将列转换为行。如果其他程序接受制表符而不是逗号,那么在复制新行之后,所有设置都准备就绪。
Arjan

您如何做相反的事情?取一个用逗号分隔的列表并将其转换为内容列?
stevvve

1
@stevvve使用“数据”选项卡中的“文本到列”功能。support.microsoft.com/en-us/kb/214261
特雷沃-

我为此使用任何具有正则表达式功能的文本编辑器,例如notepad ++。复制列值并将其粘贴到编辑器中,搜索并替换正则表达式,找到“ \ r \ n”替换为“,”。如果要将CSV转换为列,请找到“,”并替换为“ \ r \ n”
junaling '17

Answers:


145

假设您的数据从A1开始,我将在B列中添加以下内容:

B1:

=A1

B2:

=B1&","&A2

然后,您可以将B2列粘贴到整个列中。B列中的最后一个单元格现在应该是A列的逗号分隔列表。


8
这对于有限的行数非常有用,但是(取决于可用内存吗?)如果您要连接的行数超过两千行,则该过程将缩短,从而使输出值不完整。小心。
samthebrand 2014年

在功能强大的Windows 10 Pro计算机上使用Excel 2013,此操作仅在30-35行后失败。我需要超过200。MichaelJoseph的解决方案非常有效。
Trialsman

75
  • 在Excel中复制列
  • 打开单词
  • “特殊粘贴”仅作为文本
  • 在Word中选择数据(您需要将其转换为用分隔的文本,),然后按Ctrl- H(查找和替换)
  • 在“查找内容”框中,键入 ^p
  • 在“替换为”框中,键入 ,
  • 选择“全部替换”

+1与Microsoft在此处提供的“官方”解决方案相同:support.microsoft.com/kb/819964
2013年

非常可爱的解决方案... :-)
Saravanan 2014年

只是纯粹的魔术:)
Sudheej


23

我实际上只是在VBA中创建了一个模块,可以完成所有工作。它接受我的远程列表并创建一个逗号分隔的字符串,该字符串输出到我选择的单元格中:

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

因此,在我的单元格中,我只输入=csvRange(A:A)了逗号分隔的列表。


1
嗯..非常接近我的答案,但是我喜欢您的实现。
mpeterson 2011年

10

一种替代方法是将Excel列粘贴到此浏览器内工具中:

convert.town/column-to-逗号分隔列表

它将一列文本转换为逗号分隔的列表。

无论如何,由于用户正在复制并粘贴到另一个程序,这对他们来说可能同样容易。


7

你可以做这样的事情。如果您不是在谈论一个巨大的电子表格,它将执行“确定” ...

  • Alt-F11,创建宏以创建列表(请参见下面的代码)
  • 将其分配给快捷方式或工具栏按钮
  • 用户将其数字列粘贴到A列中,按下按钮,并将其列表放入单元格B1中。

这是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

请确保将单元格B1的格式设置为“文本”,否则您会得到一个混乱的数字。我确定您也可以在VBA中执行此操作,但是目前还不确定如何执行,因此需要恢复工作。;)


7

使用vi或vim只需在每行的末尾放置一个逗号:

%s/$/,/

解释此命令:

  • % 表示对所有行执行操作(即查找并替换)
  • s 表示替代
  • /分隔参数(即s/find/replace/options
  • $ 代表一行的结尾
  • , 在这种情况下是替换文字

同意 差远了。
muncherelli 2011年

由于上下文不同意评论。拥有超级用户帐户并在此发布的人通常是使用vim的类型。
uniquegeek

我使用ViM并认为基本思想很有用。我最终通过使用该想法和一个简单的文本编辑器解决了问题。
尼吉尼

2

您可以使用How-To Geek的指南将行变成列,然后简单地将其反转。然后将数据导出为csv(逗号分隔格式),您便有了纯文本逗号分隔列表!您可以根据需要从记事本中复制并放回excel。另外,如果您想在逗号后留一个空格,则可以执行搜索和替换功能,将“,”替换为“,”。希望有帮助!


导出为CSV超出了该用户的能力。我需要将其指向并在excel中单击。
muncherelli 2011年

2

muncherelli,我喜欢您的回答,并对其进行了调整:)。只是一件小事,有时我会从工作表中提取数据并用它来查询数据库。我添加了一个可选的“ textQualify”参数,该参数有助于创建在查询中可用的逗号分隔列表。

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

1

我改进了generatecsv()子以处理一个Excel工作表,该工作表包含多个带有空行的列表,这些行将每个列表的标题和列表与标题分开。例

list title 1

item 1
item 2

list title 2

item 1
item 2

并将它们合并为多行,每个列表1行。

原因是,我让一个客户根据主题以列表格式向我的网站发送了多个关键字,因此需要一种轻松地将这些关键字添加到网页中的方法。因此,修改了例程并提出了以下建议,我也将变量名称更改为有意义的名称:

    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

Sux2Lose的答案是我的首选方法,但是如果您要处理的行数超过两千行,它将无法正常工作;如果计算机的可用内存不足,则中断的行数可能会更少。

在这种情况下,最佳实践可能是复制该列,创建一个新工作簿,该新工作簿过去是特殊的A1Transpose因此该列现在是一行。然后将工作簿另存为.csv。现在,您的csv基本上是纯文本逗号分隔的列表,您可以在文本编辑器中将其打开。

注意:在保存为csv之前,请记住将列转置为一行。否则,Excel将不知道在值之间加上逗号。



-2

=CONCATENATE(A1;",";A2;",";A3;",";A4;",";A5)在要显示结果的单元格上使用。


3
这是无法扩展的手动解决方案。
DanielHári'16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.