2016-09-27 2 views
0

Я следующие данные в листе 1: не может показатьсяЗамена часть строки (Excel VBA)

    A 
1 1C BAC Z6 : CHF QM : 1M TOIS 
2 2C BAC Z6 : CHF QM : 1M TOIS 
3 3C BAC H7 : CHF QM : 1M TOIS 
4 30C BAC H7 : CHF AM : 1M TOIS 
5 45C BAC M7 : CHF QM : 1M TOIS 
6 5C BAC Z7 : CHF QM : 1M TOIS 

Я пытаюсь заменить 2-буквенный код, который следует «БАК», но для этого используйте функцию REPLACE(). Я не достаточно знаком с VBA, чтобы использовать InStr.

Фон: 2-символьный код, который следует за «BAC», представляет собой месяц и год.

Первый символ в 2-символьном коде представляет собой месяц. Например,

"H" представляет собой март

"M" представляет июнь

"U" представляет сентябрь

"Z" представляет собой декабрь

Есть только четыре месяца (март , Июнь, сентябрь, декабрь).

Второй символ в 2-символьном коде представляет год. Например,

"6" представляет 2016

"7" представляет +2017

"8" представляет +2018 и т.д., и т.д.

Кто-нибудь знает решение, которое может заменить 2- код символа с следующий 2-символьный код (т.е. следующий месяц и год)?

Например,

"Z6" (декабрь 2016) станет "H7" (март 2017 г.)

"H7" (март 2017 года) станет "М7" (июнь 2017)

"М7" (июнь 2017) станет "U7" (сентябрь 2017)

"U7" (сентябрь 2017) станет "Z7" (декабрь 2017)

"Z7" (декабрь 2017) станет «H8» (2 марта) 018)

и т.д., и т.д.

Заранее спасибо за вашу помощь с этим!

+0

Просто уточнить: A1 содержит '1C BAC Z6: CHF QM: 1M TOIS'? –

+0

Да, это правильно. – equanimity

ответ

2

Try:

=REPLACE(A1,FIND("BAC",A1)+4,2,VLOOKUP(MID(A1,FIND("BAC",A1)+4,1),{"H","M";"M","U";"U","Z";"Z","H"},2,FALSE)&MID(A1,FIND("BAC",A1)+5,1)+(MID(A1,FIND("BAC",A1)+4,1)="Z")) 

Мы используем функцию REPLACE вместе с VLOOKUP, чтобы определить, что заменить букву часть кода.

FIND находит два символьных кода, которые должны быть заменены на REPLACE или проверены с помощью функции MID.

VLOOKUP решает заменить Н с М, М с U, и т.д.

Испытание Логическое равенство в конце решает, чтобы увеличить число на единицу, если и только если письмо Z.

EDIT: ОП указывает, что он может захотеть найти один из нескольких кодов, предшествующих подлежащей замене детали. Это можно сделать, используя константу массива в функции FINDfind_text. Мы также добавляем эти константы в конец строки, чтобы избежать ошибок, зависящих от того, что не найдено. MIN возвращает наименьшее число, которое, если ключ найден, будет находиться внутри ключа.

В этой модификации, я также использовал функцию MOD так, что бы пролонгировать .

=REPLACE(A1,MIN(FIND({"BAC","EMC"},A1&"BACEMC"))+4,2,VLOOKUP(MID(A1,MIN(FIND({"BAC","EMC"},A1&"BACEMC"))+4,1),{"H","M";"M","U";"U","Z";"Z","H"},2,FALSE)&MOD(MID(A1,MIN(FIND({"BAC","EMC"},A1&"BACEMC"))+5,1)+(MID(A1,MIN(FIND({"BAC","EMC"},A1&"BACEMC"))+4,1)="Z"),10)) 
+0

Это прекрасно работает, спасибо! – equanimity

+0

Приятное использование 'VLOOKUP()' с внутренним массивом! –

+0

@ Gary'sStudent Спасибо. Я склонен использовать это, если таблица небольшая и вряд ли потребует обслуживания в будущем. –

Смежные вопросы