Уберите начальные / конечные пробелы и запятые в Excel - PullRequest
1 голос
/ 13 января 2012

Это кажется таким простым требованием, что я чувствую, что упускаю что-то очевидное.

У меня есть таблица Excel с «грязными» текстовыми данными, содержащими текст и нежелательные начальные и конечные пробелы,запятые и переводы строк.Я хотел бы TRIM ссылки на эти ячейки всех этих символов.

Примечание: я не хочу заменять все эти символы, так как они законно появляются в тексте ячейки - это только когда в начале иликонец текста ячейки (то есть значения), который я хочу обрезать.

Текстовые данные состоят из имен людей и школ, для очистки и импорта в CRM.

Итак,есть встроенная функция, или мне нужно написать?Я чувствую себя избалованным числом функций фильтрации строк в PHP; -)

Ответы [ 4 ]

2 голосов
/ 13 января 2012

Это хорошо подходит для регулярных выражений

Код ниже , адаптированный из этой статьи использует это регулярное выражение
"[,\s]*(.+?)[,\s]*$"
удалить все начальные и / или конечные пробелы / запятые, оставив любые такие символы в теле текста без изменений

Он заменит ваши существующие данные на месте

Sub RemoveDirt()
Dim rng1 As Range
Dim rngArea As Range
Dim lngRow As Long
Dim lngCol As Long
Dim lngCalc As Long
Dim objReg As Object
Dim X()


On Error Resume Next
Set rng1 = Application.InputBox("Select range for the replacement of leading zeros", "User select", Selection.Address, , , , , 8)
If rng1 Is Nothing Then Exit Sub
On Error GoTo 0

'See Patrick Matthews excellent article on using Regular Expressions with VBA
Set objReg = CreateObject("vbscript.regexp")
objReg.MultiLine = True
objReg.Pattern = "[,\s]*(.+?)[,\s]*$"

'Speed up the code by turning off screenupdating and setting calculation to manual

'Disable any code events that may occur when writing to cells
With Application
    lngCalc = .Calculation
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    .EnableEvents = False
End With

'Test each area in the user selected range

'Non contiguous range areas are common when using SpecialCells to define specific cell types to work on
For Each rngArea In rng1.Areas
    'The most common outcome is used for the True outcome to optimise code speed
    If rngArea.Cells.Count > 1 Then
       'If there is more than once cell then set the variant array to the dimensions of the range area
       'Using Value2 provides a useful speed improvement over Value. On my testing it was 2% on blank cells, up to 10% on non-blanks
        X = rngArea.Value2
        For lngRow = 1 To rngArea.Rows.Count
            For lngCol = 1 To rngArea.Columns.Count
                'replace the leading zeroes
                X(lngRow, lngCol) = objReg.Replace(X(lngRow, lngCol), "$1")
            Next lngCol
        Next lngRow
        'Dump the updated array sans dirt over the initial range
        rngArea.Value2 = X
    Else
        'caters for a single cell range area. No variant array required
        rngArea.Value = objReg.Replace(rngArea.Value, "$1")
    End If
Next rngArea

'cleanup the Application settings
With Application
    .ScreenUpdating = True
    .Calculation = lngCalc
    .EnableEvents = True
End With

Set objReg = Nothing
End Sub
1 голос
/ 07 сентября 2014

Я нашел этот код, который я вставил как модуль в свою электронную таблицу:

Option Explicit

Function ReReplace(ReplaceIn, _
    ReplaceWhat As String, ReplaceWith As String, Optional IgnoreCase As Boolean = False)

    Dim RE As Object
    Set RE = CreateObject("vbscript.regexp")
    RE.IgnoreCase = IgnoreCase
    RE.Pattern = ReplaceWhat
    RE.Global = True
    ReReplace = RE.Replace(ReplaceIn, ReplaceWith)
End Function

Это обеспечивает функцию замены, которая поддерживает RE (почему Excel не делает это сам? Это было только с 1987 года - у меня это было на моем Atari ST, обратите внимание, что вы можете добавить более десяти ячеек до его сбоя! ). Эта функция ячейки способна выполнить необходимую обрезку:

=ReReplace('source worksheet'!cell_reference, "^[\s,]+|[\s,]+$", "")

Это прекрасно работает.

(Примечание: этот ответ перенесен из текста вопроса, где его действительно не должно было быть.)

0 голосов
/ 02 апреля 2018

Я попробовал это, используя два шага

  1. Удаление пробелов
  2. Сняв запятую

Для удаления начальных и задних пробелов

Использовать прямую функцию TRIM(A1)

Для удаления начальных и конечных запятых

=MID(A1,IF(FIND(",",A1)=1,2,1),IF(RIGHT(A1)=",",LEN(A1)-2,LEN(A1)))

или

=SUBSTITUTE(TRIM(SUBSTITUTE(A1,","," "))," ",",")
0 голосов
/ 23 августа 2014

Рекурсивная функция для удаления запятой и конечных пробелов.Чистый VBA ..

Function removetrailcomma(txt As String) As String
    If Right(txt, 1) = " " Or Right(txt, 1) = "," Then
        removetrailcomma = removetrailcomma(Left(txt, Len(txt) - 1))
    Else
        removetrailcomma = txt
    End If
End Function
...