Excel:连接列中的最后一个非空单元格

既然我以前的post已经closures了,但问题仍然存在,我会在这里重新修改。 我想出了以下几点:

Function JoinLastInColIfEmpty(range_ As Range, delim_ As String) Dim cell As Range, result As String, current As String For Each cell In range_ current = LastNonEmptyInCol(cell) If current <> "" Then result = result & current & delim_ End If Next If Not IsEmpty(result) Then result = Left(result, Len(result) - Len(delim_)) End If JoinLastInColIfEmpty = result End Function Function LastNonEmptyInCol(cell_ As Range) Dim tmp As Range tmp = cell_ '<< The problem occurs here Do Until Not IsEmpty(tmp) Or tmp.Row = 1 tmp = tmp.Offset(-1, 0) Loop LastNonEmptyInCol = tmp.Value End Function 

问题是function永远不会结束,所以我的问题是:

  • 我的脚本有什么问题?
  • 我该怎么做才能解决我的问题 ?

要回答你的直接问题,在LastNonEmptyInCol中有几个错误

 Function LastNonEmptyInCol(cell_ As Range) On Error Resume Next Dim tmp As Range Set tmp = cell_ '<< The problem occurs here ' <<<<< use Set Do Until Not IsEmpty(tmp) Or tmp.Row = 1 ' <<<<< use tmp not cell_ Set tmp = tmp.Offset(-1, 0) ' <<<<< use Set Loop LastNonEmptyInCol = tmp.Value End Function 

这就是说,我认为这是一个非常低效的解决scheme,并不能完全解决你所说的问题

结果将是

  A | B | C | D | Concat -----+-----+-----+-----+--------- 1 | 2 | X | 5 | 12X5 | | f | 3 | 12f3 | 5 | R | 12 | 15R12 Z | 3 | T | | Z3T12 | G | | | ZGT12 

这是另一个版本,可能会更好

 Function MyJoinLastInColIfEmpty(range_ As Range, delim_ As String) Dim vData As Variant Dim cl As Range Dim i As Long Dim result As Variant vData = range_ For i = 1 To UBound(vData, 2) If vData(1, i) = "" Then Set cl = range_.Cells(1, i).End(xlUp) If cl <> "" Then vData(1, i) = cl.Value End If Else Exit For End If Next For i = 1 To UBound(vData, 2) result = result & vData(1, i) & delim_ Next MyJoinLastInColIfEmpty = Left(result, Len(result) - Len(delim_)) End Function 

我没有真正理解整个事情,但由于tmp是一个(范围)对象,所以你必须使用
Set tmp = ....

帮助行/列可以通过公式来实现:

进入单元格F1arrays( Ctrl+Shift+Enter ),然后滚动到您拥有的许多单元格:

 {=INDEX(A$1:A1,MAX(IF(ISBLANK(A$1:A1),0,ROW(A$1:A1))))} 

放在单元格K1 ,是指F1第一个单元格,这里不需要数组。

 =IF(ISBLANK(A1),IF(SUM(NOT(ISBLANK(INDEX($A1:A1,0)))+0)>0,"",F1),F1) 

– 放在任何你想要的结果。 MCONCAT是一个在用C ++编写的免费 MCONCAT中find的UDF函数 , CONCATENATE是Excel内置的公式。

=MConCat(K1:N1)=CONCATENATE(K1,L1,M1,N1)

我的个人偏好是VBA的方式。 我敢肯定,比我聪明的人可以拿出一些更好的公式。