2010-06-03 48 views
5

我对Excel中的某些数据看起来像是一个简单的问题。我有很多数据与从网络表粘贴的前导空格,我想摆脱最初的空间。我把以下代码分解了(我对VBA是全新的),但它似乎不起作用。当我在调试器中遍历它时,它看起来像一个无限循环。任何帮助,将不胜感激!使用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 2010-06-03 10:48:47

回答

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 
+0

我仍然在字符串前面得到一个空格字符 – 2015-07-15 06:40:23

1

工作正常,我有一个变化 - 第四行应该是:

cell.Value = Trim(cell.Value) 

编辑:如果它似乎陷入一个循环,我想补充

Debug.Print cell.Address 

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

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

0

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

当你在它的时候,将一个Option Explicit放在yor模块的顶部。它强制你声明所有变量,防止由于错误类型的变量名造成的恼人的错误。 (您可以修改VBA编辑器首选项,以便下次自动设置该选项,这是强烈建议的操作。)

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

cell.Text = Trim(cell.Text) 
+0

这是我个人工作簿中唯一的宏。它仍然不能与cell.Value版本一起工作。 – 2010-06-03 10:09:35

+0

@Greg Reynolds:我的不好,这应该是'.Text',我纠正了我的答案。 – Tomalak 2010-06-03 10:46:37

+1

使用.text通常不是一个好主意,因为它给了你格式化为Excel的值(如果用户改变了列宽,可以是###)而不是实际值。 另外,Range对象的默认属性是.value,因此如果Cell是范围对象,则Trim(Cell)可以正常工作。 – 2010-06-03 15:03:25

0

这应该完成你想要做的事情。我只是在一张纸上测试过它;让我知道如果这不起作用。 LTrim是,如果你只有领先的空间;修剪功能可以用来处理前后空间。将我所在区域中的单元格范围替换为“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

我会尝试解决这个没有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 
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 
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 
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 
相关问题