在 Excel 中合并行

在 Excel 中合并行

我在第 1 列和第 2 列中有数据,如下所示:

1234      eggs
1234      bacon
1234      toast
4321      Orange Juice

我希望它显示如下:

1234      eggs-bacon-toast
4321      orange juice

我还希望它自动删除重复的行,这样我在第 1 列中就有仅包含组合数据的唯一数字。

答案1

您需要编写一个程序或脚本来将各行与通用键(第 1 列)连接起来。

如果您不懂 VBA,那么您可以使用一个简单的 ruby​​ 脚本来连接工作表的 CSV 导出中的数据。

按着这些次序:

  1. 以 CSV 格式导出您的工作表。
  2. 然后对数据运行下面的脚本,生成一个新的 CSV 格式的输出文件。
  3. 将 CSV 输出文件导入 Excel。

数据看起来应该是这样的:

$ cat joiner-data.csv
Key,Data
"1234",eggs
"1234",bacon
"1234",toast
"4321","Orange Juice"

下面是通过第 1 列键连接数据的 ruby​​ 脚本。

顺便说一句,此代码不关心键数据是否为数字——它将根据任何键值连接数据。

#!/usr/bin/env ruby
# joiner.rb input >output
# read CSV data, with key in column one
# output each key once, with all associated data joined by '-'

require 'csv'

records = {}

input = ARGV.shift

CSV.foreach(input, :headers => true, :return_headers => false) do |row|
  data = row.fields
  key = data.shift
  records[key] ||= []       # ensure new keys start with an empty array
  records[key] += [data]    # append the record data
end

# output the record keys in ascending order, with the data associated with each key
CSV { |csv| records.keys.sort.each{|k| csv << [k,records[k].join('-')]}}

exit

以下是使用上述 CSV 格式的数据的示例运行:

$ ./joiner.rb joiner-data.csv
1234,eggs-bacon-toast
4321,Orange Juice

此输出应放入可重新导入 Excel 的文件中。如下所示:

$ ./joiner.rb joiner-data.csv >joined-data.csv

现在导入文件joined-data.csv

希望这可以帮助。

答案2

使用 vba 可能是解决此问题最合适的方法,但如果您以前没有使用过编程语言,您可能会遇到一些错误并且不知道该怎么做。aks 提供的解决方案也是如此,并且该解决方案也需要退出 excel。话虽如此,知道如何在 excel 之外操作 csv 文件还是不错的,如果您按照 aks 提供的步骤操作,您应该能够得到您想要的东西。

如果你只是想要一个即插即用的解决方案,我为你制作了一个包含所有公式的电子表格这里。要使用它,请将数据粘贴到标签下的 A 列和 B 列中,拉下 C2-F2 中的公式,然后按非空白筛选 F 列。结果将为“FINAL A”和“FINAL B”。

答案3

好吧,这不是很难。首先,显示开发者选项卡单击 Office 按钮,转到 Excel 选项并选择显示开发者选项卡. 这使您可以编辑和运行宏。

在功能区上,您现在有一个开发人员选项卡。单击它并转到“Visual Basic”。现在,在 VBA 编辑器顶部,单击插入-模块. 在模块中粘贴以下代码:

Sub Macro1()
Application.ScreenUpdating = False
'sort columns
    Columns("A:B").Select
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("A1:B150440")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Dim c As Range
Dim strValue As String

'only non-blank cells
For Each c In Range("A:A")
    If c <> "" Then
Again:
        'check for matches and combine
        If c.Value = c.Offset(1).Value Then
           strValue = c.Offset(, 1).Value & "-" & c.Offset(1, 1).Value
           c.Offset(, 1) = strValue
           c.Offset(1).EntireRow.Delete
           GoTo Again
        End If
    End If
Next c


Application.ScreenUpdating = True
End Sub

运行它然后你就可以开始了。

我建议在运行宏之前复制一份数据,然后在副本上运行宏,以防它没有按照你想要的方式运行

相关内容