2010-06-03 49 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 
相關問題