当满足特定条件时,如何合并多行数据

当满足特定条件时,如何合并多行数据

在此处输入图片描述
点击放大

我正在尝试修改此 Excel 文档。它包含一组连续的行,这些行除了AdminTime列 (Column  ) 之外都相同。当一组连续的行具有相同的(Column  H) 值时,我知道它们除了 Column 之外都相同 。我想将组中的行合并为一行,其中的列包含组中所有行的值,以逗号分隔。LastRxNoCHAdminTimeAdminTime

这是我想要的图片

在此处输入图片描述
点击放大

有什么想法吗?我原本想使用 IF 函数,但我对 Excel 不太熟悉,无法让它发挥作用。


所有内容都是使用 Excel 中的 Microsoft Query 工具从 SQL 表中提取的;查询如下:

在此处输入图片描述

答案1

您可以根据这些数据制作一个数据透视表,不过它不是以行的形式显示,而是以列的形式显示。例如,选择所有数据,插入 > 数据透视表,将 PatID、LastRxNo 和 Admintime 拖到数据透视表的“行标签”区域,隐藏所有总计或小计(我会发布图片,但我在这里的声誉还不够高 - 这是我的第一篇帖子!)创建一个如下所示的数据透视表(不确定这在我的帖子中是否正确显示):855 87160 6AM 2PM 10PM(等等......)

或者,如果您将选择语句中的 SQL 查询更改为在一个单元格中返回整个名称(选择……,Patients.PatLName+','+Patients.PatFname,........),您可以让数据透视表返回整个患者姓名而不是编号,如下所示...Parker,Corde 87160 6AM 2PM 10PM(等等...)

它可能与您最初要求的格式不完全相同,但对我来说似乎是清晰易读的(假设您使用它来检查何时已用药?)

答案2

在此处输入图片描述

创建一个将计数添加到代码的列

=B5&" "&COUNTIF($B$2:$B5,B5)

然后您可以查找每个单独的条目并连接文本,d2 中的公式变为:-

=IF($B2&" "&1=D2, INDEX(C:C,MATCH($B2&" "&1,D:D,0))&" "&IFERROR(INDEX(C:C,MATCH($B2&" "&2,D:D,0)),"")&" "&IFERROR(INDEX(C:C,MATCH($B2&" "&3,D:D,0)),"")&" "&IFERROR(INDEX(C:C,MATCH($B2&" "&4,D:D,0)),""),"")

对于每一种可能性,您都需要添加“成为”等的&" "&IFERROR(INDEX(C:C,MATCH($B5&" "&5,D:D,0)),"")位置。上述公式仅适用于 4 个实例。&5&6

答案3

这是一个相当快速和混乱的宏,还有很多事情要做,但你会明白的。它还假定您的原始工作表(“Sheet1”)按 LastRxNo 排序。如果您有能力在 SQLServer 中添加和调用函数,那么这将是一个更简单、更不容易出错的任务。希望这能帮助您入门。它输出到名为“summary”的工作表

Sub conCatTimes()
Dim rx As String
Dim admTimes As String
Dim tmp As String
Dim i As Long
Dim LastRow As Long
LastRow = Sheets("Sheet1").Range("C" & ActiveSheet.Rows.Count).End(xlUp).Row
rx = ""
i = 1
For Each cell In Sheets("Sheet1").Range("C2:C" & LastRow)
    If rx <> cell Then
        rx = cell
        i = i + 1
        tmp = ""
    End If
tmp = cell.Offset(0, 11)
admTimes = admTimes + tmp + ", "
    If cell.Offset(1, 0) <> rx Then
        Sheets("summary").Range("A" & i) = rx
        Sheets("summary").Range("B" & i) = Left(admTimes, Len(admTimes) - 2)
        admTimes = ""
    End If
Next

End Sub

答案4

我会使用 Power Query 插件来实现这一点。我认为你无需编写一行代码就可以完成这项任务。

我将首先使用“复制列”命令复制 AdminTimes 列。然后我将使用 Pivot 命令将 AdminTimes 数据转换为列:

https://support.office.com/en-US/Article/Pivot-columns-abc9c8da-3be9-44c4-886e-0be331ab387a?ui=en-US&rs=en-US&ad=US

在 Pivot 定义中,我将值列设置为之前创建的“AdminTimes 的副本”列,并将聚合值函数设置为“不聚合”。这将自动按所有其他列进行分组。

然后,我将使用“合并列”命令将生成的新列合并为一列。我将使用自定义分隔符“,” (逗号,然后是空格),以获得您想要的演示文稿。

相关内容