Есть ли более элегантная формула / метод для написания строки макроса для переформатирования адресов в VBA / excel? - PullRequest
1 голос
/ 16 апреля 2020

Я новичок в 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)))
)
...