Вопрос: Как удалить определенный текст из нескольких ячеек сразу?


У меня массивный список адресов электронной почты; но просто для того, чтобы сделать все просто, я имею дело с 3 - 10 адресами электронной почты, которые напечатаны в 1 ячейке, и я не могу показаться MASS удалить конкретные. Есть ли способ удалить конкретный адрес электронной почты из ячейки, ДАННЫЙ что у меня есть список конкретных адресов электронной почты, которые я хочу удалить. Это вопрос поиска дубликатов и удаления или чего-то большего?

Разработать:

в ячейке A2 у меня есть abc@abc.com aaa@abc.com bbb@abc.com ccc@abc.com

в ячейке A3 У меня есть xyz@xyz.com xxx@xyz.com yyy@xyz.com zzz@xyz.com

В ячейках H1-H5 У меня есть abc@abc.com xxx@xyz.com bbb@abc.com ccc@abc.com yyy@xyz.com (каждый адрес электронной почты находится в отдельных ячейках)

Есть ли способ удалить конкретный адрес электронной почты из A2 и A3, чтобы я остался только с aaa@abc.com, xyz@xyz.com и zzz@xyz.com?

Дополнительная информация: Я использую Excel для Mac 2011

Любая помощь будет высоко оценена.

Спасибо!


1
2017-07-07 13:29


Источник




Ответы:


Сделайте свой следующий вопрос - Могу ли я запустить этот макрос быстрее? - Я подаю свой ответ здесь и голосую, чтобы закрыть этот вопрос как дубликат.


Если я понимаю вас, вы хотите взять все значения в столбце H и удалить их из столбца E? Я бы сделал это с некоторыми массивами, чтобы ускорить его -

Option Explicit
Sub DoTheThing()
Application.ScreenUpdating = False
Dim lastrow As Integer
'Find last row in column H to size our array
lastrow = ActiveSheet.Cells(Rows.Count, "H").End(xlUp).row

'Declare the array and then resize it to fit column H
Dim varkeep() As Variant
ReDim varkeep(lastrow - 1)

'Load column H into the array
Dim i As Integer
For i = 0 To lastrow - 1
    varkeep(i) = Range("H" & i + 1)
Next

Dim member As Variant
'find last row in column E
lastrow = ActiveSheet.Cells(Rows.Count, "E").End(xlUp).row

'loop each cell in column E starting in row 2 ending in lastrow
For i = 2 To lastrow
    'Make a new array
    Dim myArray As Variant
    'Load the cell into the array
    myArray = Split(Cells(i, 5), " ")
    Dim k As Integer
    'for each member of this array
    For k = LBound(myArray) To UBound(myArray)
        member = myArray(k)
        'call the contains function to check if the member exists in column H
        If Contains(varkeep, member) Then
            'if it does, set it to nothing
            myArray(k) = vbNullString
        End If
    Next
    'let's reprint the array to the cell before moving on to the next cell in column E
    Cells(i, 5) = Trim(Join(myArray, " "))
Next
Application.ScreenUpdating = True
End Sub


Function Contains(arr As Variant, m As Variant) As Boolean
    Dim tf As Boolean
    'Start as false
    tf = False
    Dim j As Integer
        'Search for the member in the keeparray
        For j = LBound(arr) To UBound(arr)
            If arr(j) = m Then
                'if it's found, TRUE
                tf = True
                Exit For
            End If
        Next j
        'Return the function as true or false for the if statement
        Contains = tf
End Function

Это создает массив из столбца H. Затем он проходит через каждую ячейку в столбце E, анализирует его на массив, ищет каждый член этого массива в массиве keep и, если найден, удаляет этот член массива. Пройдя через ячейку, она перепечатывает массив с отсутствующими найденными.


Массивы обычно быстрее, чем переходы по элементам, но, кроме того, мы создаем нашу собственную функцию, а не используя медленный  Find and Replace метод. Единственная проблема заключается в том, что в данных могут быть дополнительные пробелы. Если это так, мы можем быстро найти и заменить для этого. Мне было проще установить элементы массива в порядок, а не изменять размер массива и перемещать элементы.


Просто для полноты, вот рутина, которая удаляет лишние пробелы из столбца E

Sub ConsecSpace()
Dim c As Range
Dim lastrow As Integer
lastrow = ActiveSheet.Cells(Rows.Count, "E").End(xlUp).Row
Dim strValue As String
For Each c In Range("E2:E" & lastrow)
    strValue = c.Value
    Do While InStr(1, strValue, "  ")
        strValue = Replace(strValue, "  ", " ")
    Loop
    c = strValue
Next
End Sub

0
2017-08-06 11:47



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


Если я не пойму неправильно, самое лучшее, что вы можете здесь сделать, это использовать Найти и заменить

Найдите нужную электронную почту и замените ее на пустое значение.

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

Решение VBa - сначала сделайте резервную копию.

Согласно вашему примеру, я предположил, что ваш поиск начинается с H1 и заканчивается в какой-то момент.

Я также предположил, что другие данные начинаются на A2 и заканчиваются некоторой строкой в ​​A

Option Explicit
Sub DoTheThing()
 Dim keepValueCol As String
 keepValueCol = "H"               'You may need to update this

 Dim row As Integer
 row = 2                          'what row do the values start in column A

 Dim keepValueRow As Integer
 keepValueRow = 1

 Do While (Range("A" & row).Value <> "")

    Do While (Range(keepValueCol & keepValueRow).Value <> "")

    Range("A" & row).Value = Replace(Range("A" & row).Value, Range(keepValueCol & keepValueRow).Value, "")
    Range("A" & row).Value = Trim(Replace(Range("A" & row).Value, "  ", " "))

    keepValueRow = keepValueRow + 1
    Loop


 keepValueRow = 1
 row = row + 1
 Loop

End Sub

1
2017-07-07 13:56



Если я схожу по предложенному вами маршруту поиска и замены один за другим, мне потребуются возрасты, чтобы сделать это. Я работаю с более чем 2000 конкретными адресами электронной почты, которые необходимо удалить в ячейках. Я ищу более быстрый способ сделать это. Но я ценю вашу помощь! - Jase
Я мог бы помочь, если бы у вас была настоящая версия Excel, потому что это можно сделать в VBa довольно легко! Извините @Jase - Dave
В Office для Mac есть опция разработчика, которая включает в себя макросы и редактор Visual Basic. Есть ли способ помочь вам справиться с этими двумя функциями? - Jase
Я также могу получить руки на ПК, если у моей проблемы есть легкое исправление. @ Dave - Jase
Заметано! Спасибо! - Jase


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

Sub Replace_Email_List()

Dim rList as Range, rReplace as Range
Dim sEMail as String

'' Following your Example
Set rList = Range("H1",Range("H1").End(xlDown)) '' or just Range("H1:H5")
Set rReplace = Range("A1",Range("A1").End(xlDown)) '' or just Range("A1:A2")

For i = 1 to rList.Row
    sEMail = rList(i,1)

    rReplace.Replace What:=sEmail, Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=True
Next i

End Sub

Надеюсь, мой ответ поможет вам


0
2018-05-11 21:32