【问题标题】:concatenate a range with macro, with conditional to omit empty cells - excel vba将范围与宏连接起来,有条件地省略空单元格 - excel vba
【发布时间】:2015-02-27 11:18:56
【问题描述】:

我正在尝试将列中的一系列输入单元格连接到单独工作表中的一个输出单元格。这以不同的范围重复到不同的单元格。例如范围(A1:5)-> 单元格(B1);范围(A6:10)-> 单元格(B2); ...ETC。输出工作表也需要受到严格控制,因此我不希望对其进行任何调整。

我目前在输出单元格中使用连接公式,但是当要连接的范围内的单元格为空时(函数中的分隔符是“,”),我觉得很混乱。例如,由于空单元格,输出单元格有可能变为“,,x,y,,,,z”等。因此,我需要将条件语句合并到宏中以忽略空单元格,并将其余部分与分隔符“,”连接起来。

所需输出的示例是:“x,y,z”。 整洁

作为一名 vba 业余爱好者并四处搜索,我所能找到的只是执行此操作的函数(因此没有初始代码)。我更喜欢“按钮”对象,以便用户可以以受控方式完成该过程。

任何帮助将不胜感激。

问候,

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    考虑一下这个UDF

    Public Function concat(rng As Range, sep As String) As String
    For Each r In rng
        If concat = "" Then
            concat = r.Value
        Else
            concat = concat & sep & r.Value
        End If
    Next
    '
    
    End Function
    

    用户定义函数 (UDF) 非常易于安装和使用:

    1. ALT-F11 调出 VBE 窗口
    2. ALT-I ALT-M 打开一个新模块
    3. 粘贴内容并关闭 VBE 窗口

    如果您保存工作簿,UDF 将与它一起保存。 如果您使用的是 2003 年以后的 Excel 版本,则必须保存 文件为 .xlsm 而不是 .xlsx

    要删除 UDF:

    1. 如上所示打开 VBE 窗口
    2. 清除代码
    3. 关闭 VBE 窗口

    要使用 Excel 中的 UDF:

    =concat(A1:Z1,",")

    要了解有关宏的更多信息,请参阅:

    http://www.mvps.org/dmcritchie/excel/getstarted.htm

    http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

    有关 UDF 的详细信息,请参阅:

    http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

    必须启用宏才能使其工作!

    由于要求排除空格并使用逗号作为分隔符,这将是一个合理的UDF

    Public Function Konkat(rin As Range) As String
        For Each r In rin
            v = r.Value
            If v <> "" Then
                Konkat = Konkat & "," & v
            End If
        Next r
        Konkat = Right(Konkat, Len(Konkat) - 1)
    End Function
    

    编辑#1:

    如果所有输入单元格可能为空,则使用此版本:

    Public Function Konkat(rin As Range) As String
        For Each r In rin
            v = r.Value
            If v <> "" Then
                Konkat = Konkat & "," & v
            End If
        Next
        If Konkat = "" Then Exit Function
        Konkat = Right(Konkat, Len(Konkat) - 1)
    End Function
    

    【讨论】:

    • 谢谢。那么,您是说 UDF 是唯一可能的解决方案吗?如果是这样,那很好 - 我只需要使用它。输出工作表需要受到严格控制,因此我不希望对其进行任何调整......公式或其他方式。无论如何,谢谢,非常感谢。
    • @user3740620 如果 Concatenate() 工作表函数像 Sum() 一样工作,那就太好了…… ...那么 UDF 将无济于事。
    • 谢谢。不过只有一个问题......我得到一个“#VALUE!”在输入单元格中没有输入任何内容时可见 - 即输出单元格是#VALUE!默认。当输入存在时,输出正确连接。知道为什么#VALUE!正在发生,或者如何删除它?
    • @user3740620 查看我的 EDIT#1 如果所有单元格都是空的,那么 UDF() 中的最后一条语句将失败.... .........所以我们对此进行测试并提前离开!
    • 感谢 Gary 的学生。我认为#VALUE的原因!正在发生的是输入单元格中有一个“if”语句....您的解决方案解决了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    相关资源
    最近更新 更多