Excel 2013, поиск частичного текста в одной ячейке и перезапись соседней ячейки, если выполняется условие

Мне нужно написать макрос.

У меня есть книга с ~ 30000 строк (ежедневно меняется).

  1. Мне нужно найти выражение "ТОРГОВЛЯ" в строках в ячейках из столбца (A)

  2. Если строка внутри ячейки содержит выражение TRADE, мне нужно изменить строку в соответствующей ячейке в столбце (B) (та же строка) на выражение "TRADEIN"

  3. Если условие не выполняется, соответствующие ячейки из столбца (B) должны оставаться без изменений.


Чему я научился на данный момент:

Formula =IF(ISNUMBER(FIND("TRADE", A1 )), 1, 2) соответственно изменяет значение соседней ячейки, ТОЛЬКО если помещается непосредственно в ячейку и копируется вниз в Excel.

Проблемы начинаются, когда я пытаюсь получить строку в качестве результата

Formula: =IF(ISNUMBER(FIND("TRADE", A1 )), "TRADEIN", "") не работает -> ошибка

Formula: =IF(ISNUMBER(FIND("TRADE", A1 )), ""TRADEIN"", "") не работает -> ошибка


Тогда любые попытки заставить мой макрос вставлять более сложные формулы в ячейки из VBA не увенчались успехом, т.е.:

Ниже работает нормально:

For i=1 to i=NumberOfRows

ActiveSheet.Cells(i, 2).Formula = "= 2+2"

next i

Ниже не будет работать (опять же, формула работает, если ее поместить непосредственно в ячейку):

For i=1 to i=NumberOfRows

ActiveSheet.Cells(i, 2).Formula = "=IF(ISNUMBER(FIND("TRADE", (i, 1)), 1, 2)"

next i

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

Я не могу найти решение, столь же конкретное, как моя задача, и у меня есть проблемы с изменением некоторых найденных в Интернете, в то время как другие вообще не будут работать для меня. Возможно, я точно не знаю, как просить то, что мне нужно, наиболее эффективным способом. Будьте очень простыми и постарайтесь не пропустить никаких объявлений из предлагаемых модулей/подпрограмм, если сможете - я еще не уверен, когда дело доходит до использования и создания объектов и методов за пределами нескольких примеров, которым я следовал, или выбора/использования правильного тип переменных с совместимыми методами/функциями и т. д.


person VeryBasicAnswers    schedule 11.01.2016    source источник
comment
Есть много способов выполнить то, что вам нужно, как вы можете видеть в ответах ниже, но просто чтобы вы знали, если вы хотите, чтобы ваша формула работала в VBA, вы можете написать это: =IF(ISNUMBER(FIND(""TRADE"",A" & i & ",1,2). Обратите внимание на открытие и закрытие " вокруг кавычек в TRADE, чтобы VBA распознал, что вы хотите включить 's` в формулу, и как использовать & для переноса переменных в строки.   -  person Scott Holtzman    schedule 11.01.2016
comment
Я просто хочу прокомментировать, что для вашего первого вопроса он хорошо представлен. Вы представили четкий вопрос и показали код, который вы пробовали, но не смогли приступить к работе. Лучше многих первых вопросов. Добро пожаловать в СО.   -  person mrbungle    schedule 11.01.2016
comment
Спасибо Вам всем за быстрые ответы. Сегодня мы сядем, чтобы узнать, как вознаграждать ваши усилия в соответствии с правилами и механикой форума. Что касается решений, у меня должно быть время, чтобы проверить и выяснить, работает ли лучше всего в моем случае завтра на работе.   -  person VeryBasicAnswers    schedule 11.01.2016


Ответы (2)


Использование VBA позволяет достичь цели. Это найдет последнюю строку, используемую в столбце A, чтобы установить диапазон для работы.

Sub test()

Dim w As Range
lrow = Range("A1", Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible).Count
For Each w In Range("A1:A" & lrow).Cells
    If w.Value = "trade" Then
        w.Offset(0, 1).Value = "tradein"
    End If
Next w

End Sub
person mrbungle    schedule 11.01.2016
comment
Спасибо за этот модуль, единственный недостаток в том, что он будет работать только с точным соответствием (торговля) и будет игнорировать (TRADE;TradeIn и т. д.), использование звездочки, похоже, ничего не меняет. Я все еще могу скопировать функцию For для всех возможных случаев (40+), и это меня пока устраивает. Еще раз спасибо :) - person VeryBasicAnswers; 12.01.2016
comment
Теперь я понятия не имею, почему, но если я попытаюсь использовать модуль в полном файле (проверял его на образце с 20 строками данных, заполненными вручную), он не будет обновлять значения в столбце B. Однако он работает, если я удалить специальные ячейки (xlCellTypeVisible). со 2 ряда...? - person VeryBasicAnswers; 12.01.2016
comment
Я имел в виду: ... со 2-й строки, чтобы она выглядела так ->[lrow = Range(A1, Range(A & Rows.Count).End(xlUp)).Count]...? Полный файл.xlsx имеет значения, экспортированные из запроса базы данных Access с использованием процесса/кода, к которым у меня нет доступа в данный момент, значения в обоих столбцах кажутся строками, когда я смотрю на них в полном файле.xlsx (MSExcel2013) - person VeryBasicAnswers; 12.01.2016
comment
вы можете использовать LIKE вместо =. If w.value like "trade*" - person mrbungle; 12.01.2016
comment
Сэр, вы спаситель. Большое спасибо. Я могу использовать его в других местах, где я боролся, хотя и с гораздо меньшим количеством случаев для поиска. Еще раз спасибо и хорошего дня :) - person VeryBasicAnswers; 13.01.2016

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

Выберите столбец A и перейдите к Data=>Filter=>text Filter=>Contains... введите слово в поле для фильтрации.

введите здесь описание изображения

person Davesexcel    schedule 11.01.2016