Обрезать ячейки с помощью VBA в Excel - PullRequest
7 голосов
/ 03 июня 2010

У меня возникла простая проблема с некоторыми данными в Excel. У меня есть много данных с пробелами, вставленными из веб-таблицы, и я хотел бы избавиться от начального пробела. Я набрал следующий код (я совершенно новичок в VBA), но он, похоже, не работает. Когда я делаю это в отладчике, это выглядит как бесконечный цикл. Любая помощь будет оценена!

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

EDIT: Похоже, что функция 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 ]

8 голосов
/ 03 июня 2010

Это хорошо работает для меня. Он использует массив, поэтому вы не просматриваете каждую ячейку. Работает намного быстрее на больших разделах листа.

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
7 голосов
/ 03 июня 2010

Если у вас есть непечатаемый символ в начале строки, попробуйте это


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 &lt 33 Or nAscii = 160 Then
                    If Len(str) &gt 1 Then
                        str = Right(str, Len(str) - 1)
                    Else
                        strl = ""
                    End If
                End If
            End If
            cell=str
        End If
    Next
End Sub
1 голос
/ 12 августа 2016

отлично сработало у меня так:

Обрезает все выбранные ячейки. Остерегайтесь выбора полных столбцов / строк: 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
1 голос
/ 03 июня 2010

отлично работает у меня с одним изменением - четвертая строка должна быть:

cell.Value = Trim(cell.Value)

Редактировать: если кажется, что он застрял в цикле, я бы добавил

Debug.Print cell.Address

внутри вашего For ... Next цикла, чтобы получить немного больше информации о том, что происходит.

Я также подозреваю, что Trim только убирает пробелы - вы уверены, что у вас нет другого не отображаемого символа?

0 голосов
/ 20 марта 2014

Единственное, что сработало для меня, это функция:

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
0 голосов
/ 03 июня 2010

Я бы попытался решить эту проблему без 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
0 голосов
/ 03 июня 2010

Это должно выполнить то, что вы хотите сделать.Я только что проверил это на моем листе;дайте мне знать, если это не сработает.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 голосов
/ 03 июня 2010

Бесконечный цикл является результатом оператора On Error Resume Next где-то выше в вашем коде.Избавься от этого сейчас.Если ваш код работает только с On Error Resume Next, он требует немедленного и полного пересмотра.

И пока вы там, поместите Option Explicit поверх вашего модуля.Это вынуждает вас объявлять все переменные, предохраняя от надоедливых ошибок, которые являются результатом неправильно введенных имен переменных.(Вы можете изменить настройки редактора VBA, чтобы в следующий раз автоматически устанавливать эту опцию, что настоятельно рекомендуется.)

Непосредственная проблема с вашим кодом состоит в том, что ячейка является объектом, и объекты не могут быть обрезаны.Вы хотите обрезать текст ячейки, поэтому вы должны сделать это:

cell.Text = Trim(cell.Text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...