如何检查前一个和下一个logging是否在Excel中是连续的

我有一个Excel的电子表格的值。 我试图build立一个值的string,将查看表中的所有logging,并确定哪些是相同的(基于序列).. 在这里输入图像说明

如图所示,有三列(E,F,G)包含源数据。 (源ID,目标ID和连接ID)..基本上只能有一个源到目标关系的组合,所以我将需要合并任何重复的连接。

到目前为止,我已经设法通过以下方式find它们重复的时间:连接源和目标(Col H)使用公式查找重复项(并sorting)

=IF(COUNTIF(H:H,H2)>1,COUNTIF(H$2:H2,H2),1) 

现在我正在试图build立一个将被用来合并logging的string。

基本上我正在尝试构build一个函数,在Col H中查找所有精确的string,然后查看序列(I)并构build一个string,如下所示:

34〜62〜65(它告诉我连接34必须与62然后65合并)问题是我没有设法做到这一点。 Col J中的当前公式是:

 =IF(H2=H3,IF(I3=I2+1,G3&"~"&G2,"")) 

但是正如你可以看到它的唯一配对,而不是实际上按顺序寻找重复(即1,2,3等)

前一段时间我为我的一个朋友写了一个相当广泛的UDF来处理这个问题。 它应该看起来像一个VLookup,除了一个额外的参数UniqueOnly和一个分隔符。

它所做的就是查找基于不同单元格的值,就像VLookup一样,但与Vlookup不同的是,它返回所有可能的值,而不仅仅是一个。

它是这样使用的:

= LookupConcatenate(LookupValue,LookupRange,LookupColumn,[Optional UniqueOnly = 0],[Optional Separator =“,”])

代码是:

 Public Function LookupConcatenate(LookupValue As Range, LookupRange As Range, Column As Integer, Optional UniqueOnly As Boolean = False, Optional Separator As String = ", ") As String ' by Marek Stejskal Dim rngMatch As Range Dim rngLookup As Range Dim varMatch As Variant Dim varIndex As Variant Dim intFoundAll As Integer Dim strFoundAll() As String Dim intFoundUnique As Integer Dim strFoundUnique() As String Dim blnFound As Boolean Dim strResult As String Dim i As Integer On Error GoTo ErrHandler: Set rngLookup = LookupRange Set rngMatch = rngLookup.Columns(1) Do While 1 = 1 ' Match function varMatch = Application.Match(LookupValue, rngMatch, 0) ' Exit checking if MATCH returned no value If IsError(varMatch) Then Exit Do ' Index function varIndex = Application.Index(rngLookup, varMatch, Column) intFoundAll = intFoundAll + 1 ' Adding space to ALL array ReDim Preserve strFoundAll(1 To intFoundAll) ' Checking if the new result is in ALL array blnFound = False For i = 1 To UBound(strFoundAll) If strFoundAll(i) = CStr(varIndex) Then blnFound = True Exit For End If Next ' If new result is unique add it to UNIQUE array If blnFound = False Then intFoundUnique = intFoundUnique + 1 ReDim Preserve strFoundUnique(1 To intFoundUnique) strFoundUnique(intFoundUnique) = CStr(varIndex) End If ' Add the new result to ALL array strFoundAll(intFoundAll) = CStr(varIndex) ' Shortening ranges Set rngLookup = rngLookup.Resize(rngLookup.Rows.Count - varMatch).Offset(varMatch) Set rngMatch = rngLookup.Columns(1) Loop ' Creating result string If UniqueOnly = True Then If intFoundUnique = 0 Then strResult = "" Else For i = 1 To UBound(strFoundUnique) strResult = strResult & IIf(strResult = "", "", Separator) & strFoundUnique(i) Next i End If Else If intFoundAll = 0 Then strResult = "" Else For i = 1 To UBound(strFoundAll) strResult = strResult & IIf(strResult = "", "", Separator) & strFoundAll(i) Next i End If End If LookupConcatenate = strResult Exit Function ErrHandler: LookupConcatenate = Err.Description End Function 

为了使你的工作,你将首先需要切换ConnectionID的顺序,然后你可以把第2行的公式是这样的:

= LookupConcatenate(G2,G2:J100,2,0,“〜”)

所以如果你想在不使用VBA的情况下做到这一点,唯一的办法就是在每一行下去的时候build立一个string。 我的意思是最终的数据看起来像:

在这里输入图像说明

这不符合包含完整级联string的所有列“F”的全部要求。 但是ID的最后一个唯一行将包含最后一个string。

在列F中的公式(假设你的数据如图所示在这里alignment)

 =IF(ISERROR(MATCH($D2,INDIRECT("D1:D"&ROW()-1),0)),""&$C2,IFERROR(INDEX(F:F,MATCH($D2,INDIRECT("D1:D"&ROW()-1),1)),INDEX(F:F,MATCH($D2,INDIRECT("D1:D"&ROW()-1),0)))&"~"&$C2) 

即使行没有sorting,它也可以工作(实际上它根本不使用序列列)。 这里是一张附加行作为testing数据的图片:

在这里输入图像说明

然后,您可以创build您正在search的列,方法是添加一个包含以下内容的列:

 =IF(COUNTIF($F:$F,SUBSTITUTE($F2,"~","*")&"*")=1,$F2,FALSE) 

这会得出以下最终结果:

在这里输入图像说明