对 VBA 中的选定单元格执行修剪功能

Posted

技术标签:

【中文标题】对 VBA 中的选定单元格执行修剪功能【英文标题】:Perform trim function on the selected cells in VBA 【发布时间】:2016-05-03 14:00:34 【问题描述】:

我想弄清楚是否有一种方法可以在 Excel 宏中运行一个简单的函数(TRIM 删除重复的空格字符),以便直接在单元格上执行,因此我不必创建一个具有修剪前一列的函数的额外列。

它应该适用于选定的列或仅适用于选定的单元格

Sub trim()

 ActiveCell.FormulaR1C1 = "=trim(R1C1)"

End Sub

【问题讨论】:

因为您的 R1C1 在引号内,它们不会改变,您需要使用计数器设置循环,并且该计数器成为您地址的一部分。 【参考方案1】:

试试这个:

Sub TrimAndFit()
    Dim r As Range

    With Application.WorksheetFunction
    For Each r In Intersect(Selection, ActiveSheet.UsedRange)
        r.Value = .Trim(r.Value)
    Next r
    End With
End Sub

这将适用于所有选定的单元格。我们使用Intersect() 来提高性能。

【讨论】:

+1 添加Intersect method的好点。 @Jeeped 以防万一用户选择了整列! 是的,我最近一直在宣传它在 UDF 中的使用,以便可以使用完整的列或行引用而不会造成损害。除非我们先清理自己的 UDF,否则我们不能大声抱怨在 SUMPRODUCT 等原生函数中使用完整列引用。 @garys-student 谢谢,它比看起来更复杂。 :-( 另外,当我在整个列上执行它时,它会冻结在我身上(我在 Excel 2016 上),我必须退出它【参考方案2】:

虽然有原生 VBA Trim function,但它只删除左右两端的空格。它也不会将单词之间的双空格更改为单个空格。为此,您可以使用WorksheetFunction object 和工作表的TRIM function。

Sub myTrim()
    dim rng as range
    for each rng in Selection
        'use only one of these
        rng = Trim(rng.Value)
        rng = WorksheetFunction.Trim(rng.Value)
    next rng 
End Sub

有关针对 Application.Selection 属性运行代码的更多样板,请参阅 How to avoid using Select in Excel VBA macros。

对于快速整列修剪,Range.TextToColumns method 效果很好。

Sub myTrim2()
    Dim col As Range
    For Each col In Selection.Columns
        col.TextToColumns DataType:=xlFixedWidth, FieldInfo:=Array(0, 1)
    Next col
End Sub

后一种方法不会删除内部双空格;只有前导和尾随空格。

除非您有意覆盖该功能,否则将您的过程和/pr 函数命名为与现有函数相同不是一个好主意。

【讨论】:

好的,我明白了,我用 (Trim) 和 (WorksheetFunction.Trim) 行之一创建了 2 个宏,以防我只想修剪前导和尾随空格...所以我采取它与 garys-student 的解决方案相同,只是没有 Intersect() 无论如何都没有任何明显的区别......但是用于列修剪的 myTrim2 似乎不起作用:-(【参考方案3】:

试试:

Private Sub Worksheet_Change(ByVal Target as Range)

Target.Value = Trim(Target.Value)

End Sub

这会将您在工作表中更改的任何单元格更改为单元格值的修剪版本。

【讨论】:

将多个值粘贴到工作表上会发生什么情况?【参考方案4】:

用即时窗口试试

?Application.Trim("茶匙")

茶匙

?WorksheetFunction.Trim("茶勺")

茶勺

?Trim("茶匙")

茶匙

【讨论】:

【参考方案5】:

这不会奏效吗?

Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

这会比相交慢吗?

【讨论】:

以上是关于对 VBA 中的选定单元格执行修剪功能的主要内容,如果未能解决你的问题,请参考以下文章

VBA 中怎么只保护指定的单元格或者列

excel中怎样用vba使单元格在特定条件下才可以编辑?

VBA在选定的单元格中找到重复项并计算它们

从定义的范围转换excel宏,只对选定的单元格进行操作?

VBA UDF 多单元格引用

单元格中的 Excel VBA 换行会减慢合并任务的执行速度