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
现在在单元格C1
input这个或者你希望输出的任何单元格( 不要按ENTER键 )。
=CONCATENATE(TRANSPOSE(IF(B1:B5="Y",A1:A5,"+")))
现在select下图所示的公式,然后按F9
你会得到这样的东西。 您可以在这里删除连续的"+","+"
,或者您可以稍后删除它们。
从公式中删除{
和}
,然后按Enter键 。 你会得到这个
将单元格公式转换为值并在++
上进行replace,直到没有剩下++
为止。
方法2
在单元格C1
键入此公式
=IF(B1="Y",A1,"")
并在C2
input这个公式
=IF(AND(C1<>"",B2<>"N"),C1&"+"&IF(B2="Y",A2,""),IF(B2="Y",A2,C1))
简单地把它拖下来。
我写了一个用户定义函数来解决。 您可以将函数ExtractPK
input到单元格中并在那里获取结果,也可以将其作为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 +