为了使其快速简单:(将其放在 VBA 窗口中的任何模块中)
Option Explicit
Public Function merge_merged(rng As Range) As Variant
Dim i As Long, j As Long, output() As Variant
ReDim output(1 To UBound(rng.Value), 1 To 2)
For j = 1 To UBound(rng.Value)
If Len(rng(j, 1).Text) Then
i = i + 1
output(i, 1) = rng(j, 1).Text
output(i, 2) = rng(j, 2).Text
Else
output(i, 2) = output(i, 2) & ", " & rng(j, 2).Text
End If
Next
For i = i + 1 To j - 1
output(i, 1) = ""
output(i, 2) = ""
Next
merge_merged = output
End Function
然后选择范围 D2:E13 并使用公式
=merge_merged(B2:C13)
这是一个数组公式,必须用Ctrl+Shift+Enter↵确认。
应该完全按照你的要求去做......如果你还有任何问题,请写评论
也适用于我的字符串:
编辑:
得到你想要的答案后,你不应该改变问题,最好问一个新的。不过,这次我会提供一个解决方案:
Option Explicit
Public Function merge_merged(rngIn As Range) As Variant
Dim i As Long, j As Long, k As Long, output() As Variant, rng As Variant
rng = rngIn.Value
ReDim output(1 To UBound(rng), 1 To UBound(rng, 2))
For j = 1 To UBound(rng)
If Len(rng(j, 1)) Then
i = i + 1
For k = 1 To UBound(output, 2)
If IsNumeric(Replace(rng(j, k), "*", "")) Then
output(i, k) = Replace(rng(j, k), "*", "")
Else
output(i, k) = rng(j, k)
End If
Next
Else
For k = 1 To UBound(output, 2)
If Len(rng(j, k)) Then
If IsNumeric(output(i, k)) And IsNumeric(Replace(rng(j, k), "*", "")) Then
output(i, k) = 0 + output(i, k) + Replace(rng(j, k), "*", "")
Else
output(i, k) = output(i, k) & ", " & rng(j, k)
End If
End If
Next
End If
Next
For i = i + 1 To j - 1
For k = 1 To UBound(output, 2)
output(i, k) = ""
Next
Next
merge_merged = output
End Function
- 只会检查第一列是否折叠
- 如果“2”到“end”列包含数字,则将它们相加
-
具有混合值(数字和字符串)可能会搞砸
- “A”、“3”、“5”将是“A、3、5”
- “3”、“A”、“5”将是“3、A、5”
- 但“3”、“5”、“A”将是“8、A”
-
* 如果字符串是数字的,将被删除
- 它将提取第一行的所有值(对于每个合并的部分)
- 如果没有“first”值,则找到的第一个将显示为“, value”
- 如果所有单元格都为空,则输出也将为空
- 空单元格将被忽略(“A”、“”、“C”将变为“A、C”)
- 将变量中的所有内容都推送到更大的表中以加快速度