在Excel中使用VBA修剪单元格

我有什么看起来像Excel中的一些数据的简单问题。 我有大量的数据与从networking表粘贴的前导空格,我想摆脱最初的空间。 我拆了下面的代码(我完全是VBA的新手),但似乎没有工作。 当我在debugging器中遍历它看起来像一个无限循环。 任何帮助,将不胜感激!

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

编辑:它看起来像修剪function运行到“空间”字符的问题。 此代码:

 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 

改变了单元格的值,所以我想这是一个非空格的空格! 任何想法如何摆脱这些?

如果你在string的前面有一个非打印字符,试试这个

 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 

这对我很好。 它使用一个数组,所以你没有循环遍历每个单元格。 在大型工作表部分运行得更快。

 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 

第一行应该是:

 cell.Value = Trim(cell.Value) 

编辑:如果它似乎被困在一个循环,我会补充

 Debug.Print cell.Address 

在你的For ... Next循环中获取更多关于发生了什么的信息。

我也怀疑Trim只能去掉空格 – 你确定你没有其他types的非显示字符吗?

为我完美的工作如下:

修剪所有选定的单元格。 谨防select完整的列/行: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 

无限循环是On Error Resume Next语句的结果,在您的代码中更高的地方。 现在摆脱它。 如果您的代码只能在On Error Resume Next效果On Error Resume Next运行,则需要立即彻底检修。

当你在它的时候,在yor模块的顶部放置一个Option Explicit 。 它强制你声明所有variables,防止由于错误types的variables名造成的烦人的错误。 (您可以修改VBA编辑器首选项,以便下次自动设置该选项,强烈build议使用该选项。)

您的代码的直接问题是单元格是一个对象,并且对象不能被修剪。 你想修剪单元格的文本,所以你必须这样做:

 cell.Text = Trim(cell.Text) 

这应该完成你想要做的事情。 我只是在一张纸上testing过; 让我知道如果这不起作用。 LTrim是,如果你只有领先的空间; 可以使用修剪function,也可以使用前后空格。 replace“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 

我会尝试解决这个没有VBA。 只要select这个空间,并使用replace(更改为无)在您试图摆脱这些空间的工作表上。

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

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

并以同样的方式在VBA中使用replacefunction

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

要么

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

唯一对我有用的是这个function:

 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