我对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
更改了单元格的值,所以我猜这是一个非空格的空格!关于如何摆脱这些的任何想法?
答案 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