2010-06-03 52 views
5

Tôi có một vấn đề đơn giản với một số dữ liệu trong Excel. Tôi có rất nhiều dữ liệu với không gian hàng đầu được dán từ một bảng web và tôi muốn loại bỏ không gian ban đầu. Tôi cribbed đoạn mã sau (Tôi hoàn toàn mới để VBA), nhưng nó không có vẻ làm việc. Khi tôi bước qua nó trong trình gỡ lỗi, nó trông giống như một vòng lặp vô hạn. Bất kỳ trợ giúp sẽ được đánh giá cao!Cắt ô bằng VBA trong Excel

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

EDIT: Có vẻ như chức năng TRIM đang gặp sự cố với ký tự "khoảng trắng". Mã này:

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 

Thay đổi giá trị của ô, vì vậy tôi đoán đó là khoảng trắng không gian! Bất kỳ ý tưởng về làm thế nào để thoát khỏi những người?

+1

chr (255) xuất hiện dưới dạng khoảng trắng trong Excel. Nó thường là một nguyên nhân của vấn đề. – Fionnuala

Trả lời

7

Nếu bạn có một ký tự không in ở phía trước của chuỗi thử này


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

Tôi vẫn nhận được một ký tự không gian phía trước các chuỗi –

1

Tác phẩm tốt cho tôi với một sự thay đổi - dòng thứ tư nên:

cell.Value = Trim(cell.Value) 

Edit: Nếu nó có vẻ bị kẹt trong một vòng lặp, tôi muốn thêm

Debug.Print cell.Address 

bên trong vòng lặp For ... Next của bạn để biết thêm thông tin về những gì đang diễn ra.

Tôi cũng nghi ngờ rằng Trim chỉ dải không gian - bạn có chắc chắn bạn không có một số loại ký tự không hiển thị khác trong đó không?

0

Vòng lặp vô hạn là kết quả của câu lệnh On Error Resume Next ở đâu đó cao hơn trong mã của bạn. Loại bỏ nó ngay bây giờ. Nếu mã của bạn chỉ chạy với On Error Resume Next có hiệu lực, mã đó cần sửa chữa nhanh và hoàn chỉnh.

Và trong khi bạn đang ở đó, đặt một Option Explicit trên đầu trang của mô-đun yor. Nó buộc bạn phải khai báo tất cả các biến, một biện pháp bảo vệ chống lại các lỗi gây phiền nhiễu là kết quả của các tên biến sai. (Bạn có thể sửa đổi các tùy chọn trình soạn thảo VBA để có tùy chọn đó tự động thiết lập vào lần sau, được khuyến khích.)

Vấn đề trước mắt với mã của bạn là ô là đối tượng và không thể cắt đối tượng. Bạn muốn cắt bớt văn bản của ô, vì vậy bạn phải làm như vậy:

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

Đây là macro duy nhất trong sổ làm việc cá nhân của tôi. Và nó vẫn không hoạt động với phiên bản cell.Value. –

+0

@Greg Reynolds: Tệ của tôi, điều này đáng lẽ phải là '.Text', tôi đã sửa lại câu trả lời của mình. – Tomalak

+1

Nói chung không phải là ý tưởng tốt để sử dụng .tiếp theo vì nó cung cấp cho bạn giá trị như được định dạng bởi Excel (có thể là ### nếu người dùng đã thay đổi chiều rộng cột) thay vì giá trị thực tế. Ngoài ra, thuộc tính mặc định của đối tượng Range là .value, do đó Trim (Cell) hoạt động tốt nếu Cell là một đối tượng phạm vi. –

0

Điều này sẽ thực hiện những gì bạn muốn làm. Tôi chỉ thử nghiệm nó trên một tờ của tôi; cho tôi biết nếu điều này không hoạt động. LTrim là nếu bạn chỉ có không gian hàng đầu; các chức năng Trim có thể được sử dụng cũng như nó sẽ chăm sóc không gian hàng đầu và dấu. Thay thế phạm vi ô trong khu vực tôi có là "A1: C50" và cũng đảm bảo thay đổi "Sheet1" thành tên của trang tính bạn đang làm việc.

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

Tôi sẽ cố gắng giải quyết vấn đề này mà không cần VBA. Chỉ cần chọn không gian này và sử dụng thay thế (thay đổi thành không có gì) trên trang tính mà bạn đang cố gắng loại bỏ những không gian đó.

Nếu bạn thực sự muốn sử dụng VBA Tôi tin rằng bạn có thể chọn nhân vật đầu tiên

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

và sử dụng thay thế chức năng trong VBA theo cùng một cách

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

hoặc

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

Điều này phù hợp với tôi. Nó sử dụng một mảng để bạn không lặp qua từng ô. Chạy nhanh hơn nhiều so với các phần trang tính lớn.

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

Chỉ có điều mà làm việc đối với tôi là chức năng này:

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

Làm việc đối với tôi một cách hoàn hảo như thế này:

tính kỹ thuật tất cả các ô được chọn. Cẩn thận chọn toàn bộ cột/hàng: 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 
Các vấn đề liên quan