【问题标题】:Combining duplicate entries with unique data in Excel将重复条目与 Excel 中的唯一数据相结合
【发布时间】:2013-04-02 01:10:06
【问题描述】:

我有一个 Excel 数据库,我试图避免手动组合重复数据。除了标签列之外,我有一堆基本相同的列表。我想做的是将这 5 个列表合并为 1 个列表,使类别成为单个单元格中的逗号分隔列表。

转这个

进入这个

有什么方法可以实现吗?我的文档有几千个列表,所以我显然试图避免手动编辑路线。我是 Excel 新手,所以任何你能指点我的手把手或教程都将不胜感激。

【问题讨论】:

  • 如果您的列表已经按第一列排序(例如,所有“Canadian Tire Associate Stores”都被分组在一起),那么超级容易,如果没有排序,难度会稍微大一些。将列表存储在二维数组中,并在数组的第二列中构建逗号分隔的列表。完成后,写出新的工作表/等。
  • @DavidZemens 我不知道该怎么做?可以通过 Excel 完成,还是以编程方式完成?我是一名设计师,试图解决我遇到的数据管理问题,所以我真的不知道该怎么做。
  • 是的,这可以使用 VBA(Visual Basic for Applications)来完成,这可能是以编程方式与 Excel“通信”的最简单方法。下面尼克的建议答案在功能上应该或多或少等同于我所描述的,并且是解决此类问题的另一种好方法(今天早些时候我在另一个问题上建议this sort of solution)。

标签: excel excel-2011


【解决方案1】:

这也可以使用公式来完成。为了使我的示例正常工作,数据需要按第一列排序,并且需要有一个标题行。

您还需要两列(C 和 D)。首先,添加一个公式,如果 A 列中的数据与其上方的行相同,则本质上说连接 B 列中的数据,否则重置连接。下一列将包含一个用于识别最终串联的公式,以便您稍后进行排序。

这就是我对列 A 和 B 中的列表和类别的处理方式(同样,数据需要按列 A 排序,并且需要有一个标题行):

这是结果。现在我将复制整个范围并将值粘贴到另一张表中。 D 列为零的行是我想要使用的。按 D 列排序会将它们浮动到顶部。

【讨论】:

  • 好的,这看起来最接近我正在尝试做的事情,并且符合我对 Excel 的了解。我尝试将公式修改为 =IF(A2=A1,L1&", "&I2,I2+L3) 它告诉我我有一个循环引用。我有更多的数据行,但除了类别列之外,它们都是重复的数据。会不会搞砸了?
  • 让我尝试更好地分解部分 if 语句。为真:将正上方的单元格(累积连接)与当前行中的类别连接起来(我假设 I2)。为 false:不连接,只引用当前行 (I2) 中的类别。我认为 L3 导致了循环引用。这个公式有效吗? =IF(A2=A1,L1&", "&I2,I2)
  • 完美,这正是我需要的。非常感谢!
【解决方案2】:

这将(应该)从您的源工作表生成一个新工作表,并连接重复项。

要使用以下代码,您需要将其添加到 VBA 编辑器中的新模块

打开 VBA 编辑器的快捷方式是 Alt+F11(适用于 Windows)和 Alt+Fn+F11(适用于 Mac)

编辑器打开后,通过从主菜单栏中的“插入”菜单中选择它来添加一个新模块。它应该会自动打开准备接受代码的模块,如果没有,您需要从项目资源管理器中选择它(将被命名为“ModuleN”,其中 N 是下一个可用编号)。

我不确定“Scripting.Dictionary”是否在 osx 中可用,但尝试一下也无妨。

Option Explicit

Sub Main()
Dim Source As Worksheet: Set Source = ThisWorkbook.Worksheets("Sheet1")
Dim Destination As Worksheet: Set Destination = ThisWorkbook.Worksheets("Sheet2")

Dim Records As Object: Set Records = CreateObject("Scripting.Dictionary")

Dim Data As Variant
Dim Index As Long
Dim Row As Integer: Row = 1

Data = Source.Range("A1", "B" & Source.Rows(Source.UsedRange.Rows.Count).Row).Value2

For Index = LBound(Data, 1) To UBound(Data, 1)
    If Records.Exists(Data(Index, 1)) Then
        Destination.Cells(Records(Data(Index, 1)), 2).Value2 = Destination.Cells(Records(Data(Index, 1)), 2).Value2 & ", " & Data(Index, 2)
    Else
        Records.Add Data(Index, 1), Row
        Destination.Cells(Row, 1).Value2 = Data(Index, 1)
        Destination.Cells(Row, 2).Value2 = Data(Index, 2)
        Row = Row + 1
    End If
Next Index

Set Records = Nothing

End Sub

【讨论】:

  • 正如我所提到的,我不是 Excel 高手。我该去哪里运行该代码?
  • 我刚查了一下,Option下没有Module选项。明天我会在有 Office 2007 的工作场所试一试。谢谢。
  • 在进行搜索时发现了这个,并确认这适用于我需要的东西。如果您知道如何插入模块并调整工作表名称,那么使用公式会更容易。
猜你喜欢
  • 2015-10-11
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2015-08-05
  • 1970-01-01
相关资源
最近更新 更多