Ячейки для обрезки с помощью VBA в Excel

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

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

Править: Действительно похоже, что функция ДЛЯ ОБРЕЗКИ сталкивается с проблемами с символом "пространства". Этот код:

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
задан Greg Reynolds 3 June 2010 в 13:34
поделиться

6 ответов

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


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
8
ответ дан 5 December 2019 в 07:57
поделиться

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

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
10
ответ дан 5 December 2019 в 07:57
поделиться

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

cell.Value = Trim(cell.Value)

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

Debug.Print cell.Address

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

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

2
ответ дан 5 December 2019 в 07:57
поделиться

Я бы попытался решить эту проблему без VBA. Просто выберите это пробел и используйте replace (ничего не менять) на том листе, который вы пытаетесь избавиться от этих пробелов .

Если вы действительно хотите использовать 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
ответ дан 5 December 2019 в 07:57
поделиться

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

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

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

cell.Text = Trim(cell.Text)
0
ответ дан 5 December 2019 в 07:57
поделиться

Это должно выполнить то, что вы хотите сделать. Я только что проверил это на своем листе; дайте мне знать, если это не сработает. 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
0
ответ дан 5 December 2019 в 07:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: