Я новичок в VBA, поэтому, пожалуйста, потерпите меня. Недавно я создал макрос, который переформатирует донорские данные и данные о пожертвованиях из CSV (регулярно загружаемые с онлайн-платформы для пожертвований) в формат, который можно импортировать в нашу основную базу данных.
Так что я работаю с действительно раздражающими данными "людей", такими как адреса, номера телефонов, имена и т. Д. c. Еще больше раздражает тот факт, что данные в загрузке CSV вводятся самими донорами.
Я написал очень длинную формулу (см. Ниже), предназначенную для исправления формата адресов (в меру своих возможностей) ), но я представляю, что есть гораздо более краткий (* ~ элегантный ~ *) способ написать его специально с использованием функций vba вместо excel.
До сих пор я использовал текстовую запись для формул (пример ниже; я определил Lastrow и хотел бы, чтобы формулы на этом останавливались, и этот метод, кажется, немного проще) однако я видел рекомендации против этого метода, поэтому я готов изменить его для этого монстра.
Range("F2:F" & Lastrow).Formula = "=PROPER(TRIM(M2))"
Формула взорвалась по длине из-за следующего:
- Есть 2 столбца для адреса улицы, которые необходимо объединить в один для формата импорта. Я использовал TEXTJOIN (). Однако ...
- Если вторым столбцом является квартира, сюита и т. Д. c, разделителем должны быть запятая и пробел ","
- Если первый столбец - здание имя, а второй - это уличный адрес, разделителем должен быть возврат каретки CHAR (10).
- Вторая вещь - это заглавные буквы (потому что люди вводят свой собственный адрес в стиле фанк). Я использовал формулу PROPER (). Однако есть несколько странных нюансов
- Улицы с NE, NW, SW и SE заканчиваются неправильно: Ne, Nw, Sw, Se
- Улицы с 1-й, 2-й, 3-й 4-е и др. c. в конечном итоге неправильно: 1-е, 2-е, 3-е, 4-е и т.д. c. (я еще не включил исправление для этих адресов, потому что формула уже огромна, и этот шаг заставляет меня задаться вопросом, является ли это лучшим способом - именно поэтому я публикую это) .
IFS(
AND(
OR(
LEFT(U2,1)=""#"",
LEFT(U2,3)=""apt"",
LEFT(U2,9)=""apartment"",
LEFT(U2,4)=""bldg"",
LEFT(U2,8)=""building"",
LEFT(U2,2)=""fl"",
ISNUMBER(FIND("" fl"",U2)),
ISNUMBER(FIND("" floor"",U2)),
LEFT(U2,5)=""floor"",
LEFT(U2,3)=""ste"",
LEFT(U2,5)=""suite"",
LEFT(U2,4)=""unit"",
LEFT(U2,2)=""rm"",
LEFT(U2,4)=""room""
),
OR(
RIGHT(T2,3)="" NW"",
RIGHT(T2,3)="" Nw"",
RIGHT(T2,3)="" nw"",
ISNUMBER(FIND("" NW "",T2)),
ISNUMBER(FIND("" Nw "",T2)),
ISNUMBER(FIND("" nw "",T2))
)
),
SUBSTITUTE(PROPER(TRIM(TEXTJOIN("", "",TRUE,T2,U2))),""Nw"",""NW""),
AND(
OR(
LEFT(U2,1)=""#"",
LEFT(U2,3)=""apt"",
LEFT(U2,9)=""apartment"",
LEFT(U2,4)=""bldg"",
LEFT(U2,8)=""building"",
LEFT(U2,2)=""fl"",
ISNUMBER(FIND("" fl"",U2)),
ISNUMBER(FIND("" floor"",U2)),
LEFT(U2,5)=""floor"",
LEFT(U2,3)=""ste"",
LEFT(U2,5)=""suite"",
LEFT(U2,4)=""unit"",
LEFT(U2,2)=""rm"",
LEFT(U2,4)=""room""
),
OR(
RIGHT(T2,3)="" NE"",
RIGHT(T2,3)="" Ne"",
RIGHT(T2,3)="" ne"",
ISNUMBER(FIND("" NE "",T2)),
ISNUMBER(FIND("" Ne "",T2)),
ISNUMBER(FIND("" ne "",T2))
)
),
SUBSTITUTE(PROPER(TRIM(TEXTJOIN("", "",TRUE,T2,U2))),""Ne"",""NE""),
AND(
OR(
LEFT(U2,1)=""#"",
LEFT(U2,3)=""apt"",
LEFT(U2,9)=""apartment"",
LEFT(U2,4)=""bldg"",
LEFT(U2,8)=""building"",
LEFT(U2,2)=""fl"",
ISNUMBER(FIND("" fl"",U2)),
ISNUMBER(FIND("" floor"",U2)),
LEFT(U2,5)=""floor"",
LEFT(U2,3)=""ste"",
LEFT(U2,5)=""suite"",
LEFT(U2,4)=""unit"",
LEFT(U2,2)=""rm"",
LEFT(U2,4)=""room""
),
OR(
RIGHT(T2,3)="" SW"",
RIGHT(T2,3)="" Sw"",
RIGHT(T2,3)="" sw"",
ISNUMBER(FIND("" SW "",T2)),
ISNUMBER(FIND("" Sw "",T2)),
ISNUMBER(FIND("" sw "",T2))
)
),
SUBSTITUTE(PROPER(TRIM(TEXTJOIN("", "",TRUE,T2,U2))),""Sw"",""SW""),
AND(
OR(
LEFT(U2,1)=""#"",
LEFT(U2,3)=""apt"",
LEFT(U2,9)=""apartment"",
LEFT(U2,4)=""bldg"",
LEFT(U2,8)=""building"",
LEFT(U2,2)=""fl"",
ISNUMBER(FIND("" fl"",U2)),
ISNUMBER(FIND("" floor"",U2)),
LEFT(U2,5)=""floor"",
LEFT(U2,3)=""ste"",
LEFT(U2,5)=""suite"",
LEFT(U2,4)=""unit"",
LEFT(U2,2)=""rm"",
LEFT(U2,4)=""room""
),
OR(
RIGHT(T2,3)="" SE"",
RIGHT(T2,3)="" Se"",
RIGHT(T2,3)="" se"",
ISNUMBER(FIND("" SE "",T2)),
ISNUMBER(FIND("" Se "",T2)),
ISNUMBER(FIND("" se "",T2))
)
),
SUBSTITUTE(PROPER(TRIM(TEXTJOIN("", "",TRUE,T2,U2))),""Se"",""SE""),
OR(
LEFT(U2,1)=""#"",
LEFT(U2,3)=""apt"",
LEFT(U2,9)=""apartment"",
LEFT(U2,4)=""bldg"",
LEFT(U2,8)=""building"",
LEFT(U2,2)=""fl"",
ISNUMBER(FIND("" fl"",U2)),
ISNUMBER(FIND("" floor"",U2)),
LEFT(U2,5)=""floor"",
LEFT(U2,3)=""ste"",
LEFT(U2,5)=""suite"",
LEFT(U2,4)=""unit"",
LEFT(U2,2)=""rm"",
LEFT(U2,4)=""room""
),
PROPER(TRIM(TEXTJOIN("", "",TRUE,T2,U2))),
OR(
RIGHT(T2,3)="" NW"",
RIGHT(T2,3)="" Nw"",
RIGHT(T2,3)="" nw"",
ISNUMBER(FIND("" NW "",T2)),
ISNUMBER(FIND("" Nw "",T2)),
ISNUMBER(FIND("" nw "",T2))
),
SUBSTITUTE(PROPER(TRIM(TEXTJOIN(CHAR(10),TRUE,T2,U2))),""Nw"",""NW""),
OR(
RIGHT(T2,3)="" NE"",
RIGHT(T2,3)="" Ne"",
RIGHT(T2,3)="" ne"",
ISNUMBER(FIND("" NE "",T2)),
ISNUMBER(FIND("" Ne "",T2)),
ISNUMBER(FIND("" ne "",T2))
),
SUBSTITUTE(PROPER(TRIM(TEXTJOIN(CHAR(10),TRUE,T2,U2))),""Ne"",""NE""),
OR(
RIGHT(T2,3)="" SW"",
RIGHT(T2,3)="" Sw"",
RIGHT(T2,3)="" sw"",
ISNUMBER(FIND("" SW "",T2)),
ISNUMBER(FIND("" Sw "",T2)),
ISNUMBER(FIND("" sw "",T2))
),
SUBSTITUTE(PROPER(TRIM(TEXTJOIN(CHAR(10),TRUE,T2,U2))),""Sw"",""SW""),
OR(
RIGHT(T2,3)="" SE"",
RIGHT(T2,3)="" Se"",
RIGHT(T2,3)="" se"",
ISNUMBER(FIND("" SE "",T2)),
ISNUMBER(FIND("" Se "",T2)),
ISNUMBER(FIND("" se "",T2))
),
SUBSTITUTE(PROPER(TRIM(TEXTJOIN(CHAR(10),TRUE,T2,U2))),""Se"",""SE""),
TRUE,
PROPER(TRIM(TEXTJOIN(CHAR(10),TRUE,T2,U2)))
)