在Excel中使用VBA修剪单元格

时间:2010-06-03 09:49:42

标签: excel vba excel-vba

我对Excel中的某些数据有一个简单的问题。我有很多数据与从Web表粘贴的前导空格,我想摆脱最初的空间。我抄了下面的代码(我对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

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

8 个答案:

答案 0 :(得分:8)

这适合我。它使用一个数组,因此您不会循环遍历每个单元格。在大型工作表部分上运行得更快。

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

答案 1 :(得分:7)

如果字符串前面有非打印字符,请尝试使用


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

答案 2 :(得分:1)

一次改变对我来说很好 - 第四行应该是:

cell.Value = Trim(cell.Value)

编辑:如果它似乎陷入循环,我会添加

Debug.Print cell.Address

For ... Next循环中,以获取有关正在发生的事情的更多信息。

我还怀疑Trim只剥离空格 - 你确定你没有其他类型的非显示字符吗?

答案 3 :(得分: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

答案 4 :(得分:0)

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

当你在它的时候,在你的模块上放置一个Option Explicit。它会强制您声明所有变量,以防止由于错误输入的变量名称导致的烦人的错误。 (您可以修改VBA编辑器首选项以在下次自动设置该选项,强烈建议这样做。)

代码的直接问题是单元格是一个对象,并且无法修剪对象。您想要修剪单元格的文本,因此您必须这样做:

cell.Text = Trim(cell.Text)

答案 5 :(得分: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

答案 6 :(得分:0)

我会尝试在没有VBA的情况下解决这个问题。只需选择此空间,然后在该工作表上使用替换(更改为空),您正试图摆脱那些空格

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

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

并以相同的方式在VBA中使用replace函数

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

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

答案 7 :(得分: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