Я имею то, что походит на простую проблему с некоторыми данными в 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
Измененный значение ячеек, таким образом, я предполагаю, что это - пробел непространства! Какая-либо идея о том, как избавиться от тех?
Если у вас есть непечатаемый символ в начале строки, попробуйте это
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
Меня это устраивает. Он использует массив, поэтому вы не просматриваете каждую ячейку. Работает намного быстрее с большими разделами листа.
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
У меня работает нормально с одним изменением - четвертая строка должна быть:
cell.Value = Trim(cell.Value)
Edit: Если кажется, что он застрял в цикле, я бы добавил
Debug.Print cell.Address
внутри вашего For .... Next
цикл, чтобы получить немного больше информации о том, что происходит.
Я также подозреваю, что Trim
удаляет только пробелы - вы уверены, что у вас там нет какого-то другого не отображаемого символа?
Я бы попытался решить эту проблему без 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
Бесконечный цикл является результатом оператора On Error Resume Next
где-то выше в вашем коде. Избавьтесь от этого сейчас. Если ваш код работает только с On Error Resume Next
, он требует немедленного и полного пересмотра.
И пока вы это делаете, поместите Option Explicit
поверх вашего модуля. Он вынуждает вас объявить все переменные, чтобы защитить себя от досадных ошибок, которые являются результатом неверно введенных имен переменных. (Вы можете изменить настройки редактора VBA, чтобы этот параметр устанавливался автоматически в следующий раз, что настоятельно рекомендуется.)
Непосредственная проблема с вашим кодом заключается в том, что ячейка является объектом, и объекты нельзя обрезать. Вы хотите обрезать текст ячейки, поэтому вы должны сделать это:
cell.Text = Trim(cell.Text)
Это должно выполнить то, что вы хотите сделать. Я только что проверил это на своем листе; дайте мне знать, если это не сработает. 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