VBA - 计算空列,搜索和替换
VBA - Count empty cols, search and replace
我正在学习 VBA 并尝试做一些对我来说有点复杂的事情。这是交易:
在我的 "H" 列中,我使用 "CONCATENATE" 公式为每一行获取列中我想要的所有元素的键。如您所见,有些元素未填充,并且我有不需要的“-”分隔符。
我想要一个宏来搜索和替换我不想要的双重、三重 (...) 分隔符,如果有一行只填充分隔符(即我的 H5 单元格),我希望它替换为空。
问题是,我想在以后添加一些 columns/lines 并且我不想每次添加列或行时都更改宏。因此,如果有一种方法可以对我的宏说:"Whenever there's a line filled with nothing but separators, replace it with nothing".
,那就太好了
这是我不知道如何处理的部分。你们能给我提示吗?
感谢和抱歉这么长post,这是一个卡哇伊土豆
当然有一些方法可以从一开始就避免这种模式,但这是一个进行(后期)清理的宏:
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吧。您可以将以下代码添加到任何非 class 代码模块并将其用作用户定义的公式 (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(定界符, 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
我正在学习 VBA 并尝试做一些对我来说有点复杂的事情。这是交易:
在我的 "H" 列中,我使用 "CONCATENATE" 公式为每一行获取列中我想要的所有元素的键。如您所见,有些元素未填充,并且我有不需要的“-”分隔符。 我想要一个宏来搜索和替换我不想要的双重、三重 (...) 分隔符,如果有一行只填充分隔符(即我的 H5 单元格),我希望它替换为空。
问题是,我想在以后添加一些 columns/lines 并且我不想每次添加列或行时都更改宏。因此,如果有一种方法可以对我的宏说:"Whenever there's a line filled with nothing but separators, replace it with nothing".
,那就太好了这是我不知道如何处理的部分。你们能给我提示吗?
感谢和抱歉这么长post,这是一个卡哇伊土豆
当然有一些方法可以从一开始就避免这种模式,但这是一个进行(后期)清理的宏:
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吧。您可以将以下代码添加到任何非 class 代码模块并将其用作用户定义的公式 (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(定界符, 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