CONCATENATE(IF()) - 如何简化当前的解决方案?

时间:2015-07-30 17:17:41

标签: excel excel-vba if-statement excel-formula vba

我的数据如下:

     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行,所以它应该更简洁一点。

3 个答案:

答案 0 :(得分:4)

这是一个有趣的非VBA 方式:)你可能仍然想要与其他VBA答案一起使用。

让我们说你的范围看起来像这样

enter image description here

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

方式1

现在在单元格C1或您希望输出的任何单元格中输入此内容(不要按ENTER键)。

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

enter image description here

现在选择如下图所示的公式,然后按 F9

enter image description here

你会得到这样的东西。您可以在此处删除连续的"+","+",也可以在以后删除它们。

enter image description here

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

enter image description here

将单元格公式转换为值并在++上执行替换,直到不再有++为止。

第2天

在单元格C1

中输入此公式
=IF(B1="Y",A1,"")

并在C2

中输入此公式
=IF(AND(C1<>"",B2<>"N"),C1&"+"&IF(B2="Y",A2,""),IF(B2="Y",A2,C1))

只需将其拖下来。

enter image description here

答案 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 +