2017-01-18 20 views
0

Я добавляю макрос, чтобы пользователь мог изменить формулу в ячейке. Вот код, который добавляется к модулю:Excel VBA Formula - 1004 ошибка определения объекта или приложения

Sub OverrideCharge() 

title = "Override Total Labor Cost" 

'Ask user if they want to override 
overrideMsg = MsgBox("Override Total Labor Cost with 4-Hour Minimum Charge?", vbYesNo, title) 
If overrideMsg = vbYes Then 
    Sheets("Totals").Activate 
    Range("L25").Formula = "=SUM(IF(MOD(ROW(INDIRECT(""L11:L""&ROW()-1)),2)=1,INDIRECT(""L11:L""&ROW()-1),0)))" 
Else: overrideMsg = vbNo 
    Exit Sub 
End If 

End Sub 

Я получаю ошибку при определении Range("L25").Formula. Я не знаю, является ли это синтаксической ошибкой или я неправильно ссылаюсь на лист/ячейку.

+1

ли формула работы, когда вы вручную ввести формулу в ячейку? – Taelsin

+0

Попробуйте использовать «Диапазон (« L25 »). Формула =« = SUM (IF (MOD (ROW (IND) (L11: L & ROW() - 1)), 2) = 1, INDIRECT (L11: L & ROW () -1), 0)) "' – ManishChristian

ответ

0

Вы должны получить свои кавычки & скобки отсортированные, должны быть:

Range("L25").Formula = "=SUM(IF(MOD(ROW(INDIRECT(""L11:L""&(ROW()-1))),2)=1,INDIRECT(""L11:L""&(ROW()-1)),0))" 
+0

Спасибо. Исходная формула работала как фактическая формула Excel, но я не знал, что ее нужно немного отредактировать для VBA. – duberry

0

При работе с длинными сложными формулами я люблю добавлять переменную FormulaString, чтобы помочь мне отладки (так я могу видеть лучше, где ошибка приходит от).

Кроме того, нет необходимости в ActivateSheets("Totals"), а затем поместив формулу в ячейку L25, вы можете сделать это непосредственно с помощью Sheets("Totals").Range("L25").Formula.

Мои собственные предпочтения, вместо того, чтобы начать считать, сколько " или "", или, может быть """" мне нужно, мне нравится работать с Chr(34).

Код

Sub OverrideCharge() 

Dim FormStr As String 
Title = "Override Total Labor Cost" 

'Ask user if they want to override 
overrideMsg = MsgBox("Override Total Labor Cost with 4-Hour Minimum Charge?", vbYesNo, Title) 
If overrideMsg = vbYes Then 
    ' use a String for Formula to help debug it (before trying to put it inside a cell) 
    FormStr = "=SUM(IF(MOD(ROW(INDIRECT(" & Chr(34) & "L11:L" & Chr(34) & "&ROW()-1)),2)=1,INDIRECT(" & Chr(34) & "L11:L" & Chr(34) & "&ROW()-1),0))" 
    Debug.Print FormStr '<-- for debug only 
    Sheets("Totals").Range("L25").Formula = FormStr 
Else 
    overrideMsg = vbNo 
    Exit Sub 
End If 

End Sub