2014-10-09 1 views
0

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

=UPPER(CONCATENATE(IF(J2=0,"",AlphaNumericOnly(SUBSTITUTE(J2,"0",""))),IF(M2=0,"",LEN(M2)),IF(N2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(N2,"0","")))),IF(P2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(P2,"0","")))),IF(R2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(R2,"0","")))),IF(W2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(W2,"0","")))),IF(X2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(X2,"0","")))),IF(Y2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(Y2,"0","")))),IF(Z2=0,"",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(Z2,"-","1"),".",""),"0","")),IF(AD2=0,"",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(AD2,"-","1"),".",""),"0","")))) 

Я пробовал записывать формулу, добавляемую в помощь, но в результате были удалены части макроса. Как будто он слишком длинный.

Может ли кто-нибудь предоставить метод добавления этой формулы в каждую строку? Я прочитал, вы можете оценить результат формулы в vba и вернуть результаты, а не добавлять формулу к листу. Должен ли я смотреть на этот маршрут?

ответ

2

В верхней части листа модуля поместите это объявление (под Option Explicit, если оно есть).

Public Const csFORMULA = "=UPPER(CONCATENATE(IF(J2=0,"""",AlphaNumericOnly(SUBSTITUTE(J2,""0"",""""))),IF(M2=0,"""",LEN(M2)),IF(N2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(N2,""0"","""")))),IF(P2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(P2,""0"","""")))),IF(R2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(R2,""0"","""")))),IF(W2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(W2,""0"","""")))),IF(X2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(X2,""0"","""")))),IF(Y2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(Y2,""0"","""")))),IF(Z2=0,"""",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(Z2,""-"",""1""),""."",""""),""0"","""")),IF(AD2=0,"""",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(AD2,""-"",""1""),""."",""""),""0"",""""))))" 

Теперь вы можете заполнить формулу в любом диапазоне. Пример:

Range("L2:L10").Formula = csFORMULA 
'Range("L2:L10") = Range("L2:L10").Value 

Вторая прокомментированная строка на случай, если вы хотите вернуться к значениям из введенной формулы. Обратите внимание, что я использую .Formula, а не .FormulaR1C1.

+0

Вероятно, нет причин объявлять постоянную публику, но это неудобно. – RubberDuck

+0

@ ckuhn203 - Да, в этом случае это, вероятно, перебор. * Публикация * заключается в том, что я склонен вкладывать все такие формулы в верхнюю часть одного модуля в более крупные проекты и не могу вызывать их из других листов модуля без него. Теперь это привычка как для крупных, так и для небольших проектов. – Jeeped

+0

@jeeped thanks - отлично работает! – chris1982

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