CONCATENATE(IF()) – 如何简化当前的解决scheme?

我的数据如下所示:

ColumnName PrimaryKey 1 ID Y 2 JOB_NAME N 3 JOB_DESC N 4 START N 5 END N ... 

我正在寻找列出所有主键的列 – 所以,所有的列在哪里PrimaryKey =“Y” – 在一个单元格中,“+”标志之间的每个返回行ColumnName。 这是迄今为止的代码:

 =CONCATENATE((IF(C1="Y",B1,"")),(IF(C2="Y",B2,"")),(IF(C3="Y",B3,"")),(IF(C4="Y",B4,"")),(IF(C5="Y",B5,""))) 

它完成了这项工作,但是由于在ColumnName列中有超过50行,所以应该更简洁一些。

这是一个有趣的非VBA的方式来做到这一点:)你可能仍然想与其他的VBA答案。

假设你的范围是这样的

在这里输入图像说明

我可以想到两种方法。 你可能更喜欢方式2 :)。 我会提到两个


方法1


现在在单元格C1input这个或者你希望输出的任何单元格( 不要按ENTER键 )。

 =CONCATENATE(TRANSPOSE(IF(B1:B5="Y",A1:A5,"+"))) 

在这里输入图像说明

现在select下图所示的公式,然后按F9

在这里输入图像描述

你会得到这样的东西。 您可以在这里删除连续的"+","+" ,或者您可以稍后删除它们。

在这里输入图像说明

从公式中删除{} ,然后按Enter键 。 你会得到这个

在这里输入图像描述

将单元格公式转换为值并在++上进行replace,直到没有剩下++为止。


方法2


在单元格C1键入此公式

 =IF(B1="Y",A1,"") 

并在C2input这个公式

 =IF(AND(C1<>"",B2<>"N"),C1&"+"&IF(B2="Y",A2,""),IF(B2="Y",A2,C1)) 

简单地把它拖下来。

在这里输入图像说明

我写了一个用户定义函数来解决。 您可以将函数ExtractPKinput到单元格中并在那里获取结果,也可以将其作为VBA脚本的一部分进行处理。 该函数有两个参数。 首先,input要连接的值的范围。 接下来,inputjoinstring(在你的情况加号)。

要使用,请将以下代码input到VBA标准模块中:

 Function ExtractPK(rng As Range, sJoiner As String) As String Dim cel As Range Dim sOutput As String sOutput = "" For Each cel In rng If cel.Offset(, 1).Value = "Y" Then sOutput = sOutput & sJoiner & cel.Value End If Next cel ExtractPK = Mid(sOutput, 2) End Function 

接下来,将functioninput到所选的单元格中。 假设您的数据位于单元格A1:A10 ,在单元格B1:B10使用主键指示符,将该函数input到单元格C1=ExtractPK(A1:A10,"+")

让我知道这是否有效,如果你需要额外的支持。

如果我理解正确

 drop table #temp go select * into #temp from (values ('ID', 'Y' ) ,('JOB_NAME', 'N' ) ,('JOB_DESC', 'N' ) ,('START', 'N' ) ,('END', 'N' ) ,('ID2', 'Y' ) ,('ID3', 'Y' ) ,('ID4', 'Y' ) ) as temp (cl1, pk) declare @pks varchar(500) = '' select @pks += cl1 + ' + ' + char(10) from #temp where pk = 'Y' select @pks -- it returns --ID + --ID2 + --ID3 + --ID4 +