Как удалить определенный текст сразу в нескольких ячейках?
У меня есть огромный список адресов электронной почты; но для простоты я имею дело с 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
Любая помощь будет высоко оценена.
Спасибо!
3 ответа
Ответьте на следующий вопрос: можно ли запустить этот макрос быстрее? - Я отправляю свой ответ здесь и голосую, чтобы закрыть этот вопрос как дубликат.
Если я вас понимаю, вы хотите взять все значения в столбце 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
Если я не пойму неправильно, лучшее, что вы можете здесь сделать, - это найти и заменить
Найдите нужное письмо и замените его пустым значением.
Это может иметь негативные последствия для вашего значения 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
Прокрутите список электронной почты, который вы хотите удалить, просто выберите диапазон и замените его пустой строкой, например:
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
Надеюсь, мой ответ поможет вам