答案 0 :(得分:2)
试一试
Option Explicit
Public Sub MergeRows()
Dim rng As Range
Dim dict As Object
Dim tmp As Variant
Dim i As Long, j As Long
Dim c, key
Set dict = CreateObject("Scripting.dictionary")
dict.CompareMode = vbTextCompare
' Change this to where your source data is
With Sheet17
Set rng = .Range(.Cells(2, 10), .Cells(.Cells(.Rows.Count, 10).End(xlUp).Row, 10))
End With
For Each c In rng
If Not dict.exists(c.Value2) Then
ReDim tmp(1 To 3)
dict.Add key:=c.Value2, Item:=tmp
End If
j = 1
tmp = dict(c.Value2)
Do
If Not c.Offset(0, j).Value2 = vbNullString Then tmp(j) = c.Offset(0, j).Value2
j = j + 1
Loop Until j > UBound(tmp)
dict(c.Value2) = tmp
Next c
' Change this to where you want your output
With Sheet17.Range("A2")
i = 0
For Each key In dict.keys
.Offset(i, 0).Value2 = key
.Offset(i, 1).Resize(, UBound(dict(key))) = dict(key)
i = i + 1
Next key
End With
End Sub
答案 1 :(得分:1)
有趣的问题,这是我采用公式的方法,但确实有更好的解决方案。
它使用了您选项右侧的三个辅助列。列:
1 - 通过查找行中的(第一个)非空白单元格(根据these指令)确定选择哪个选项。将第一个范围作为标题行(option1,option2,... optionn),将第二个范围作为从option1到optionn的行。它应该看起来像这样:=INDEX($K$1:$M$1,MATCH(FALSE,ISBLANK(K2:M2),0))
并注意它应该是一个数组公式(ctrl + shift + enter)
2 - 使用简单的索引+匹配来注册选项。假设第一个辅助列在N列中,则为:=INDEX(k2:m2,MATCH(n2,$k$1:$m$1,0))
3 - 连接地址和选项名称,以便可以查找地址选项组合。这只是:=J2&N2
完成此操作后,您将创建一个简单表,其中最左侧列中只有一个地址,而选项作为标题行(根据地址数量,您可能希望使用数据透视表来填充它们)。然后你有一个索引匹配来查找你的结果:
=INDEX($O$2:$O$6,MATCH($J9&K$8,$P$2:$P$6,0))
。
你应该完成。