我的数据如下:
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行,所以它应该更简洁一点。
答案 0 :(得分:4)
这是一个有趣的非VBA 方式:)你可能仍然想要与其他VBA答案一起使用。
让我们说你的范围看起来像这样
我可以想到两种方式。 您可能更喜欢2路 :)。我会提到两个
方式1
现在在单元格C1
或您希望输出的任何单元格中输入此内容(不要按ENTER键)。
=CONCATENATE(TRANSPOSE(IF(B1:B5="Y",A1:A5,"+")))
现在选择如下图所示的公式,然后按 F9
你会得到这样的东西。您可以在此处删除连续的"+","+"
,也可以在以后删除它们。
从公式中删除{
和}
,然后按 Enter 。你会得到这个
将单元格公式转换为值并在++
上执行替换,直到不再有++
为止。
第2天
在单元格C1
=IF(B1="Y",A1,"")
并在C2
=IF(AND(C1<>"",B2<>"N"),C1&"+"&IF(B2="Y",A2,""),IF(B2="Y",A2,C1))
只需将其拖下来。
答案 1 :(得分:1)
我写了一个用户定义函数来解决。您可以将函数ExtractPK
输入到单元格中并在那里获得结果,也可以将其作为VBA脚本的一部分进行处理。该函数有两个参数。首先,输入包含要连接的值的范围。接下来,输入连接字符串(在您的情况下为加号)。
要使用,请在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
接下来,将函数输入到选定的单元格中。假设您的数据位于单元格A1:A10
中,并且单元格B1:B10
中有主键指示符,请将此函数输入单元格C1
:
=ExtractPK(A1:A10,"+")
如果有效,请告诉我,如果您需要其他支持,请告诉我。
答案 2 :(得分:1)
如果我理解正确
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 +