按相邻单元格值合并或连接列

是否有可能连接单元格依赖于值( ID )在另一列,然后输出为string(可能在另一个表,因为它会更干净)?

例如

 ID Text 1234 a 1234 b 1234 c 4321 a 4321 b 4321 c 4321 d 

输出:

 1234 abc 4321 abcd 

问题:

  • 列ID不正确(但可以sorting)。
  • 每个ID的金额不同

这看起来像一个可能的VBA解决scheme, 如何将列中的行合并到Excel中的一个单元格中?

 Function JoinXL(arr As Variant, Optional delimiter As String = " ") 'arr must be a one-dimensional array. JoinXL = Join(arr, delimiter) End Function 

用法示例:

 =JoinXL(TRANSPOSE(A1:A4)," ") 

所以我想也许如果INDEXMATCH等coulld结合使用TRANSPOSE它可以工作。 只是不知道该怎么去做。

我可以在另一张表中有一列唯一的ID。

这个解决scheme很好,因为它在以下情况下也能正常工作

  1. 您连接的文本包含空格。
  2. 你想使用除空格以外的分隔符(即逗号)。

首先,将“移调”添加到您的自定义function

 Function JoinXL(arr As Variant, Optional delimiter As String = " ") 'arr must be a one-dimensional array. arr = Application.Transpose(arr) JoinXL = Join(arr, delimiter) End Function 

对于垂直数组 ,请使用此公式(将逗号+空格replace为您select的分隔符,将“{}”replace为您select的垃圾字符):

 {=SUBSTITUTE(SUBSTITUTE(JoinXL(IF($A$2:$A$31=D3,$B$2:$B$31,"{}"),", "),"{}, ",""),", {}", "")} 

对于水平数组 ,请使用以下公式:

 {=SUBSTITUTE(SUBSTITUTE(JoinXL(IF(TRANSPOSE($E$19:$AH$19)=D12,TRANSPOSE($E$20:$AH$20),"{}"),", "),"{}, ",""),", {}", "")} 

确保你input公式作为数组公式(在单元格中input公式后按Ctrl + Shift + Enter)。

虽然没有像引用的例子那样方便的function,但可以考虑使用以ID列作为关键字的集合字典。 在macros下面假定数据从A2 (第一行的列标题)开始,并在DE列中输出结果:

 Sub TransposeValuesByID() Dim i As Integer, lastrow As Integer Dim valDict As Object Dim innerColl As New Collection Dim k As Variant, v As Variant Set valDict = CreateObject("Scripting.Dictionary") lastrow = Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To lastrow If Range("A" & i) = Range("A" & i + 1) Then innerColl.Add Range("B" & i) Else innerColl.Add Range("B" & i) valDict.Add CStr(Range("A" & i).Value), innerColl Set innerColl = Nothing End If Next i i = 2 For Each k In valDict.keys Range("D" & i) = k For Each v In valDict(k) Range("E" & i) = Trim(Range("E" & i) & " " & v) Next v i = i + 1 Next k End Sub 

既然所有你想要的是你可以使用你的代码几个变化之间的空间。

如果你的数据是垂直的,你需要转置数组使其成为一维数组:

 Function JoinXL(arr As Variant, Optional delimiter As String = " ") 'arr must be a one-dimensional array. arr = Application.Transpose(arr) JoinXL = Join(arr, delimiter) End Function 

如果它是水平的,那就用你所拥有的。

主要的变化是你怎么称呼它。

使用以下数组公式:

 =TRIM(JoinXL(IF($A$2:$A$8=C2,$B$2:$B$8,"")," ")) 

作为一个数组,在退出编辑模式时,需要使用Ctrl-Shift-Enter而不是Enter来确认。 如果正确完成,则Excel将在公式周围放置{}

If根据单元格是否等于条件传递值或空白数组。

把它放在第一个单元格中按住Ctrl-Shift-Enter。 然后拖/复制下来

在这里输入图像说明

我想出了一个解决办法,即使有点麻烦的工作很好。

表必须按IDsorting。

在另一张表。 ID 🙁 A栏)

1234

最小值:(B列)

 =ADDRESS(MATCH(A2,OCCRANGE,0)+1,6) 

MAX REF:(C列)

 =ADDRESS(MATCH(A2,OCCRANGE)+1,6) 

范围:( D栏)

 =CONCATENATE("'OCCS COMBINED'!",B2,":",C2) 

STRING 🙁 E栏)

 {=IF([@[MIN REF]]=[@[MAX REF]],INDIRECT(CONCATENATE("'OCCS COMBINED'!",[@[MIN REF]])),JoinXL(TRANSPOSE(INDIRECT(D2)), " "))}