2016-11-17 1 views
0

Goodafternoon все,VBA формула слишком долго, способы сократить его

В настоящее время перед лицом проблем VBA, где функция «запись макроса» делает работу, но когда я пытаюсь повторно запустить его, он дает мне ошибку 1004. я помню, что я мог бы сделать три вещи:

  1. Split формула в части, то обратитесь к следующей части в формуле (т.е. часть 2 = ABC + Защита + ГХИ, поэтому формула 123 + 3456 + ____, затем замените ____ на часть 2)
  2. Поместите формулу в виде текста в разные ячейки, затем обратитесь к этим ячейкам в формуле (формула является ячейкой («a1»). значение (?) + ячейка («b2») .value
  3. Give части коды конкретного имя, так что он будет сократить формулу (т.е. а = (?) «ВХОДА - МТК», то обратитесь к аЬсу в формуле

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

Сама формула:

ActiveCell.FormulaR1C1 = _ 
    "=IF(WEEKDAY(RC2)=6,COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2)" & _ 
    "+COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2+1)" & _ 
    "+COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2+2)" & _ 
    ",COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2)" 

Я делаю что-то неправильно, или формула слишком долго?

(немного фона, я хотел бы добавить значения субботы & sunday к значению пятницы, поэтому, если будний день равен 6, то сделайте это).

Заранее спасибо :)

+1

Зачем вы смешивали как стиль R1C1, так и общий стиль в вашей формуле? – bzimor

+0

Чтобы поместить формулу в ячейку с помощью VBA, вы должны использовать только стиль R1C1 – bzimor

+0

Что именно вы подразумеваете под стилем R1C1? И где я его не использую? Извините, относительно новичок в этой теме. – Thijsk

ответ

1

Вы можете укоротить формула, как это:

ActiveCell.FormulaR1C1 = _ 
    "=IF(WEEKDAY(RC2)=6,SUM(COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2+{0,1,2}))" & _ 
    ",COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2))" 
+0

Формула все еще слишком длинна для любого человека, чтобы переварить и понять цель расчета. – ja72

+1

Абсолютная ерунда. Любой полууровень компетентного пользователя excel должен уметь это понимать. (Длина не такая же сложность). Я упущу из виду, что я бесчеловечна. – Rory

+0

Это 'VBA' сгенерировано, поэтому не должно быть никаких повторяющихся жестко закодированных строк. Что делать, если что-то переехало или переименовано? Это ад для следующей бедной души, которая несет ответственность за это. Я уверен, что он будет отображаться на thedailywtf.com в некотором смысле. – ja72

3

Эта формула полностью неосновательный. Никогда не делайте этого снова!

Я лично никогда не использую VBA для набора формул в ячейках. Я всегда делаю вычисления в VBA и представляю результаты только в ячейках. Это имеет недостаток, заключающийся в том, что он не является «живым» вычислением и требует триггера (например, нажатия кнопки), но упрощает его поддержку.

Предлагаю переместить все ваши вычисления в VBA.

  • вводные ячейки Отдельные должны быть названы диапазоны

name

  • Вытащите значения в VBA с x = Range("OrderDate").Value2
  • Если у вас есть таблица, чем вы знаете размер вы можете вытащить значения в массив VBA.

Например, при 100 × 7 таблицы:

Dim table_values() as Variant 
table_values = Range("top_left_cell").Resize(100,7).Value2 
' to loop through values 
For i=1 to 100 
    table_values(i,7) = ... 
Next i 
' Replace the values with new calculated values 
Range("top_left_cell").Resize(100,7).Value2 = table_values 
  • держать вас сложные расчеты разделить на этапах с комментариями

Например:

Set r = Range("table_name") 
For i = 1 To n 
    'Find the column with the date 
    d = r.Offset(i - 1, 2).Value2 
    If WorksheetFunction.Weekday(d) Then 
     ' If weekday count items with ... 
     n_confirmed = WorksheetFunction.CountIfs('... 
     n_shipped = WorksheetFunction.CountIfs('... 
    Else 
     ' otherwise count ... 
     n_confirmed = WorksheetFunction.CountIfs('... 
     n_queue = WorksheetFunction.CountIfs('... 
    End If 
    ' Fill the result 
    r.Offset(i - 1, 3).Value2 = n_confirmed + n_shipped + n_queue 
Next i