#excel #vba #replace #cell #contains
#excel #vba #заменить #ячейка #содержит
Вопрос:
кажется, достаточно простой вопрос, но я не смог найти здесь ответ. Я уже ооочень много использовал StackOverflow в прошлом году и, наконец, решил сам задать вопрос, я уверен, что кто-то знает ответ!
Ситуация: у меня есть столбец значений с уникальными именами файлов и были ли они обработаны или нет. Например: «20160810_123_a.xml обработанный » или «20160810_123_b.xml сбой» Длина имени файла изменяется, поэтому оно не является статичным. Я использую эти значения в другом отчете и хотел бы иметь только значения «Обработано» или «Сбой», в зависимости от того, что было в исходном содержимом.
Я предполагаю, что мне нужен какой-то цикл If, который будет делать что-то вроде этого: В диапазоне I: I, если значение ячейки содержит «обработано», замените всю ячейку на «Обработано». Если значение ячейки содержит «сбой», замените всю ячейку на «Сбой.
Заранее спасибо!
Комментарии:
1. Для этого можно использовать простую формулу. Должно ли это быть VBA?
2. Эй, Брайан, я использую VBA для обработки всего документа, это один шаг. Так что да. Конечно, я всегда мог бы ввести туда формулу. Что бы вы предложили?
3. Здесь есть несколько вариантов, но если вы хотите изменить регистр только для того, чтобы вы могли выполнять сравнение в VBA, вы можете просто использовать
LCase
илиUCase
в своем коде VBA при выполнении сравнения. Таким образом, независимо от регистра в строке, вы получите правильный результат4. Посмотрите на функцию instr.
5. Я не пытаюсь изменить случай здесь, это действительно не имеет значения. Извините, если это показалось таким. Я просто хочу выполнить поиск, соответствует ли ячейка критериям (имя файла содержит «сбой» или «обработано»), и изменить все значение ячейки на «сбой» или «обработано», в зависимости от того, какой из них был найден.
Ответ №1:
попробуйте это
Sub main()
With Worksheets("Conditions") '<--| change "Conditions" to your actual data sheet
With .Range("I1", .Cells(.Rows.Count, "I").End(xlUp)).SpecialCells(XlCellType.xlCellTypeConstants) '<--| change "I"s to your actual column index where to search for processed/failed
.Replace what:="*processed*", replacement:="Processed", LookAt:=xlWhole, MatchCase:=False
.Replace what:="*failed*", replacement:="Failed", LookAt:=xlWhole, MatchCase:=False
End With
End With
End Sub
Комментарии:
1. Это действительно хороший способ сделать это!
2. Спасибо @Brian. Давайте посмотрим, что Intuos думает об этом!
3. Работает как шарм! Я уже вводил этот комментарий пару раз, но, похоже, он не появляется, большое спасибо!
4. добро пожаловать. что касается исчезновения комментария, имейте в виду, что минимально необходимая длина комментариев составляет 15 символов
Ответ №2:
Это сработало для меня:
Option Explicit
Sub Test()
Dim arr() As Variant
Dim i As Long
Dim myRange As Range
Dim wf As WorksheetFunction
Set wf = Application.WorksheetFunction
With ActiveSheet
Set myRange = .Range(.Cells(1, 1), Cells(.Rows.Count, 1).End(xlUp))
End With
arr = myRange
For i = 1 To UBound(arr)
arr(i, 1) = wf.Proper(Right(arr(i, 1), Len(arr(i, 1)) - wf.Find(" ", arr(i, 1))))
Next i
myRange.Offset(0, 1) = arr
End Sub
Комментарии:
1. Спасибо, я собирался попробовать это, но мой разум начал ошеломлять после прочтения этого бита и увидел ответ user3598756, который сработал 🙂