0

我正在学习 VBA 并尝试为我做一些有点复杂的事情。这是交易:

我的 Excel 文件

在我的“H”列中,我使用“CONCATENATE”公式为每一行获取列中我想要的所有元素的键。如您所见,某些元素未填充,并且我有不需要的“ - ”分隔符。我想要一个宏来搜索和替换我不想要的双、三(...)分隔符,如果有一行只用分隔符填充(即我的 H5 单元格),我希望它取而代之的是什么都没有。

问题是,我想在将来添加一些列/行,并且我不想每次添加列或行时都更改宏。因此,如果有办法对我的宏说:“只要有一行只填充分隔符,就什么都不替换”。

这是我不知道如何处理的部分。你们能给我一个提示吗?

感谢和抱歉发了这么长的帖子,这是一个卡哇伊土豆

土豆 - 嗨 9gag 用户!

4

2 回答 2

4

TEXTJOIN(分隔符,ignore_empty,text1,[text2],...)

=TEXTJOIN(" - ",TRUE,A2:G2)

在此处输入图像描述

更新:如果您的 Excel 版本没有 TEXTJOIN

Function UDFTextTJoin(delimiter As String, ignore_empty As Boolean, ParamArray Text()) As String
    Dim s As String
    Dim v As Variant
    Dim x As Long

    For x = 0 To UBound(Text)
        If TypeName(Text(x)) = "Range" Then
            For Each v In Text(x)
                If Not ignore_empty Or v <> "" Then
                    If Len(s) Then s = s & delimiter
                    s = s & v
                End If
            Next
        Else

            If Not ignore_empty Or Text(x) <> "" Then
                If Len(s) Then s = s & delimiter
                s = s & Text(x)
            End If
        End If
    Next

    UDFTextTJoin = s

End Function
于 2016-12-15T22:11:40.767 回答
1

当然,有一些方法可以从一开始就避免这种模式,但这是一个宏来进行(后期)清理:

Sub Cleanup()
    Dim cel As Range, i As Long
    With Worksheets("Products").UsedRange.Columns("J")
        For i = 1 To 5
           .Replace "- - ", "- "
        Next
        For Each cel In .Cells
            If Trim(cel.Value) = "-" Then cel.Clear
        Next
    End With
End Sub

编辑

既然你我都没有TextJoin,而且是小伙伴们提出的一个很好的解决方案,就让我们把它当作UDF吧。您可以将以下代码添加到任何非类代码模块并将其用作用户定义公式 (UDF):

Public Function TextJoin(ByVal sep As String, ByVal ignoreEmpty As Boolean, ByRef ar As Variant) As String

    Dim cel As Range
    For Each cel In ar
        If Trim(cel.Text) <> "" Or Not ignoreEmpty Then
            If TextJoin <> "" Then TextJoin = TextJoin + sep
            TextJoin = TextJoin + cel.Text
        End If
    Next
End Function
于 2016-12-15T22:10:07.563 回答