在Excel中使用VBA裁剪单元格

10

我在Excel中遇到了一个看起来很简单的问题,我的数据是从网页表格中复制过来的,其中一些数据前面有空格,我想把这些空格去掉。我找到了下面这段代码(我完全不懂VBA),但它似乎没有起作用。当我在调试器中逐步执行时,它看起来像是一个无限循环。希望得到帮助!

Sub DoTrim()
  For Each cell In Selection.Cells
    If cell.HasFormula = False Then
      cell = Trim(cell)
    End If
  Next
End Sub

编辑: 看起来 TRIM 函数在处理 "空格" 字符时遇到了问题。这段代码:

Sub DoTrim()
Dim cell As Range, areaToTrim As Range
Set areaToTrim = Selection.Cells
For Each cell In areaToTrim
    cell.Value = "MUPPET"
Next cell
End Sub

更改了单元格的值,所以我猜它是非空格空白符!有什么办法可以摆脱这些空白符吗?


1
chr(255) 在 Excel 中显示为空格,这常常是问题的原因。 - Fionnuala
8个回答

11

这个对我很有效。 它使用了一个数组,所以你不需要循环遍历每个单元格。 在大型工作表部分上运行速度更快。

Sub Trim_Cells_Array_Method()

Dim arrData() As Variant
Dim arrReturnData() As Variant
Dim rng As Excel.Range
Dim lRows As Long
Dim lCols As Long
Dim i As Long, j As Long

  lRows = Selection.Rows.count
  lCols = Selection.Columns.count

  ReDim arrData(1 To lRows, 1 To lCols)
  ReDim arrReturnData(1 To lRows, 1 To lCols)

  Set rng = Selection
  arrData = rng.value

  For j = 1 To lCols
    For i = 1 To lRows
      arrReturnData(i, j) = Trim(arrData(i, j))
    Next i
  Next j

  rng.value = arrReturnData

  Set rng = Nothing
End Sub

9
如果字符串开头有一个非打印字符,请尝试以下方法:

Option Explicit
Sub DoTrim()
    Dim cell As Range
    Dim str As String
    Dim nAscii As Integer
    For Each cell In Selection.Cells
        If cell.HasFormula = False Then
            str = Trim(CStr(cell))
            If Len(str) > 0 Then
                nAscii = Asc(Left(str, 1))
                If nAscii < 33 Or nAscii = 160 Then
                    If Len(str) > 1 Then
                        str = Right(str, Len(str) - 1)
                    Else
                        strl = ""
                    End If
                End If
            End If
            cell=str
        End If
    Next
End Sub

我仍然在字符串前面得到一个空格字符。 - Ken Vernaillen

2

这对我来说效果很好,只需进行一项更改 - 第四行应为:

cell.Value = Trim(cell.Value)

编辑:如果出现卡在循环中的情况,我会添加

Debug.Print cell.Address

在你的For ... Next循环内部获取更多有关正在发生的情况的信息。我也怀疑Trim仅剥离空格- 你确定没有其他类型的非显示字符在里面吗?

1

我会尝试不使用VBA来解决这个问题。只需选择这个空格,并在你想要去除这些空格的工作表上使用替换(更改为空)。

如果你真的想使用VBA,我相信你可以选择第一个字符。

strSpace = left(range("A1").Value,1)

并且在VBA中以相同的方式使用替换函数

Range("A1").Value = Replace(Range("A1").Value, strSpace, "")

或者

for each cell in selection.cells
 cell.value = replace(cell.value, strSpace, "")
next

1

对我来说,这个方法非常完美:

修剪所有选定的单元格。注意不要选择整列/整行:P。

Sub TrimSelected()    
Dim rng As Range, cell As Range    
Set rng = Selection   

For Each cell In rng    
cell = Trim(cell)   

Next cell    

End Sub

0
无限循环是由于您的代码中某个更高级别的位置存在一个On Error Resume Next语句导致的。现在立即摆脱它。如果您的代码只在启用On Error Resume Next时运行,则需要立即进行完全彻底的改进。
顺便说一下,在您的模块顶部放置一个Option Explicit,这将强制您声明所有变量,以防止因变量名称拼写错误而产生烦人的错误。(您可以修改VBA编辑器首选项,以便在下次自动设置该选项,这是强烈推荐的。)
您代码的直接问题是单元格是一个对象,而对象不能被修剪。您想要修剪单元格的文本,因此必须这样做:
cell.Text = Trim(cell.Text)

这是我个人工作簿中唯一的宏。但使用cell.Value版本仍然无法正常工作。 - Greg Reynolds
@Greg Reynolds:我的错,应该是.Text,我已经更正了我的答案。 - Tomalak
1
通常不建议使用.text,因为它会给你Excel格式化后的值(如果用户更改了列宽,则可能是###),而不是实际值。此外,Range对象的默认属性是.value,所以如果Cell是一个Range对象,那么Trim(Cell)就可以正常工作。 - Charles Williams

0

这应该就能实现你想做的事情了。我刚才在我的一张表格上测试过,如果不行的话请让我知道。如果你只有前导空格,则使用LTrim函数;也可以使用Trim函数,因为它可以处理前导和尾随空格。将单元格区域替换为我指定的"A1:C50",同时确保将"Sheet1"更改为你正在使用的工作表的名称。

Dim cell As Range, areaToTrim As Range
Set areaToTrim = Sheet1.Range("A1:C50")
For Each cell In areaToTrim
    cell.Value = LTrim(cell.Value)
Next cell

0

对我有效的唯一函数是这个:

Sub DoTrim()
Dim cell As Range
Dim str As String
For Each cell In Selection.Cells
    If cell.HasFormula = False Then
        str = Left(cell.Value, 1) 'space
        While str = " " Or str = Chr(160)
            cell.Value = Right(cell.Value, Len(cell.Value) - 1)
            str = Left(cell.Value, 1) 'space
        Wend
        str = Right(cell.Value, 1) 'space
        While str = " " Or str = Chr(160)
            cell.Value = Left(cell.Value, Len(cell.Value) - 1)
            str = Right(cell.Value, 1) 'space
        Wend
    End If
Next cell
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接