VBA — изменение значения ячейки в зависимости от условия

#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, который сработал 🙂