【问题标题】:VBA - Count empty cols, search and replaceVBA - 计算空列,搜索和替换
【发布时间】:2016-12-15 21:47:53
【问题描述】:

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

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

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

这是我不知道如何处理的部分。各位大神能给个提示吗?

感谢和抱歉这么长的帖子,这是一个可爱的土豆

【问题讨论】:

  • 您使用的是什么版本的 Excel?在 2016 年,有 =TextJoin()`,我认为这是您想要的。 =TEXTJOIN(" - ",TRUE,A2:G2)
  • This may give you a nice approach,只要在if语句中加上条件if ""

标签: vba excel textjoin


【解决方案1】:

TEXTJOIN(delimiter, 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

【讨论】:

  • 这是我最喜欢的公式之一,他们在较新版本的 Excel 中放入。我很惊讶他们没想早点这样做。
  • 这太棒了,我工作的office版本不是2016版:(
  • @Jean-FIC - 如果可以的话 - 这是为什么要升级的一个很好的例子!现在你必须引入一个宏,或者写一个比较复杂的If() 语句,才能得到你想要的。 Excel 2016 有一些相当可靠的升级,这使得它物有所值,IMO。另外,考虑到您正在花费时间(甚至可能是在工作!)试图解决这个问题 - 当新的 Excel 已经有了解决方案时:D
  • @BruceWayne 我忘了TEXTJOIN 是一个新功能。我更新了我的答案以包含我自己的版本UDFTextTJoin。允许范围或文本有点棘手,但我想我明白了。
  • @A.S.H 谢谢。您的功能将满足 OP 的需求 - Kudos。
【解决方案2】:

确实有一些方法可以从一开始就避免这种模式,但这是一个用于(后期)清理的宏:

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

【讨论】:

  • 作为替代方案,如果他们没有TextJoin(),是否可以将其转换为 UDF?他们可以运行=cleanUp([range])
  • @BruceWayne 当然,TextJoin 如果不可用,可以用 VBA 编写。如果 OP 愿意,我们可以编写它并从一开始就避免这种模式。否则,如果他们不想更改公式,这可能是一个简单方便的宏。顺便说一句,在这个主机上我也没有TextJoin
  • 谢谢 A.S.H !我稍后会试试这个,然后会回复你。度过一个愉快的夜晚!
猜你喜欢
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2016-12-17
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多