2016-06-06 3 views
1

Я хочу вставить формулу в столбце B с задержкой между ними. Формула должна вставить только формулу, если ячейка слева от нее (в случае B1 это A1) не пусто, как это:Правильная формула, дающая «Ошибка времени выполнения« 1004 »: определяемая приложением или объектная ошибка при запуске sub

enter image description here

У меня есть следующие VBA, что Пасты формула с задержкой 1 сек.

Option Explicit 

Sub RetrieveDataDelay() 
'paste formulas into cells, then calculate, then delay rinse repeat 

    '========================= 
    'Declare Variables 
    '========================= 
     Dim i As Long 'used to loop 
     Dim rowCount As Long 
     Dim LastRow As Long 'used to find the last row 

    '========================= 
    'Setup for Speed 
    '========================= 
     Application.ScreenUpdating = False 
     Application.Calculation = xlCalculationManual 

    '========================= 
    'Define Variables 
    '========================= 
     LastRow = Worksheets(ActiveSheet.Name).Cells(Rows.Count, 1).End(xlUp).Row 'This will find the last used row in column A, change the number 1 to whatever column number you want 
     rowCount = 1 ' set to how many rows you want to do at a time 

    '========================= 
    'Do Work 
    '========================= 
     For i = 1 To LastRow Step rowCount 
      Range("B" & i, "B" & WorksheetFunction.Min(i + rowCount - 1, LastRow)).Formula = "'=IF(ISBLANK(A" & i & ");" & """" & """" & ";Dump(Volumes(A" & i & ";2528;1010;TRUE;" & "Volume" & ";TRUE)))" 'set the formula to whatever it needs to be 
       Calculate 
        Application.Wait (Now + TimeValue("00:00:01")) 'this delays 1 second 
     Next i 

    '========================= 
    'Setup for Speed - Reverse 
    '========================= 
     Application.ScreenUpdating = True 
     Application.Calculation = xlCalculationAutomatic 

End Sub 

Ошибка возникает в этой части

Range("B" & i, "B" & WorksheetFunction.Min(i + rowCount - 1, LastRow)).Formula = "=IF(ISBLANK(A" & i & ");" & """" & """" & ";Dump(Volumes(A" & i & ";2528;1010;TRUE;" & "Volume" & ";TRUE)))" 

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

Range("B" & i, "B" & WorksheetFunction.Min(i + rowCount - 1, LastRow)).Formula = "'=IF(ISBLANK(A" & i & ");" & """" & """" & ";Dump(Volumes(A" & i & ";2528;1010;TRUE;" & "Volume" & ";TRUE)))" 

так, что она приклеивает формально буквально. Если я затем удаляю кавычку из формулы, она работает. Поэтому остаются вопросы, почему он не принимает эту конкретную формулу в VBA.

Использование Excel 2013.

ответ

0

Range.Formula нужна формула обозначения всегда в формате en_us независимо от текущих настроек локали. Это означает функции на английском языке, а также запятую как разделитель между параметрами формулы, а не точкой с запятой.

Так

.Formula = "=IF(ISBLANK(A" & i & ")," & """" & """" & ",Dump(Volumes(A" & i & ",2528,1010,TRUE," & "Volume" & ",TRUE)))" 

После установки Range.Formula, настройки локали будет, тем не менее активны в листе. Таким образом, в листе формула будет разделена точкой с запятой, если она установлена.

Btw: сложная строковая нотация для двойных кавычек не обязательна.

.Formula = "=IF(ISBLANK(A" & i & "),"""",Dump(Volumes(A" & i & ",2528,1010,TRUE," & "Volume" & ",TRUE)))" 
+0

Вы, сэр, герой. Это сработало. У вас есть идеи, почему этот VBA настолько медленный? Я просто тестировал его на 50 строк, для установки VBA по 1 строке за один раз требуется около 2 минут. Когда я устанавливаю, если по 10 строк за раз, он делает это через 46 секунд. Но 10 строк за раз должны быть 5 раз с задержкой на одну секунду, поэтому я думаю, что это будет менее 10 секунд. – Dechesne

+0

По-моему. скорость определяется главным образом временем 'Calculate'. И это в основном определяется вашим 'UDF'' Dump', который неизвестен мне. Поэтому я не знаю, почему это происходит медленно. Но почему цикл 'For' вообще? Почему не просто «Диапазон (« B1: B »и« LastRow ») .Formula =« = IF (ISBLANK (A1) »,« »« », Dump (Тома (A1, 2528, 1010, TRUE, Volume, TRUE))) 'а затем' Рассчитать' только один раз? –

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

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