UDF не рассчитывается в коде VBA

У меня есть UDF, который возвращает текст в зависимости от времени и даты каждой строки.

Эта UDF-формула помещается в X2, и когда я запускаю код обновления данных, который заменяет все данные на листе, я использую filldown для X2:Y и LastRow.
Мой план состоял в том, чтобы отфильтровать данные после завершения UDF и удалить ненужные данные.
Поскольку Excel пересчитывает данные при фильтрации, я подумал, что могу скопировать -> вставить значения, чтобы убедиться, что пользовательская функция не запускается снова.
Полный код приведен ниже, но «интересная» часть находится между ''''''.

Sub importera()

    Dim mainWB As Workbook
    Dim srcWB As Workbook
    Set mainWB = ThisWorkbook

    'Application.ScreenUpdating = False

    Sheets("XCFIL").Activate
    LastRow = Cells(Rows.Count, "A").End(xlUp).Row
    Range("A3:Y" & LastRow).ClearContents
    Range("A2:W2").ClearContents


    Workbooks.Open Filename:="C:\Textfiler\XCFIL.TXT"
    Range("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1)), TrailingMinusNumbers:=True


    Set srcWB = ActiveWorkbook



    ActiveWorkbook.Sheets(1).Range("A2:W" & ActiveSheet.UsedRange.Rows.Count).Copy
    ThisWorkbook.Activate
    ActiveSheet.Paste Destination:=Worksheets("XCFIL").Range("A2")

    Application.DisplayAlerts = False
    srcWB.Close
    Application.DisplayAlerts = True

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    LastRow = Cells(Rows.Count, "A").End(xlUp).Row
    Range("X2:Y" & LastRow).FillDown

    ' To make sure the UDF does not run again turn off calculations
    Application.Calculation = xlManual
    Range("X3:Y" & LastRow).Copy
    Range("X3").PasteSpecial xlPasteValues
    Application.Calculation = xlAutomatic
    ' Turn on calculations again when formulas is replaced with values

    ActiveSheet.Range("A1:Y" & LastRow).AutoFilter Field:=24, Criteria1:="0"
    With ActiveSheet.AutoFilter.Range
        .Offset(1).Resize(.Rows.Count - 1).EntireRow.Delete
    End With
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    ThisWorkbook.Activate

    Worksheets("Resultat").PivotTables("Pivottabell3").PivotCache.Refresh
    Worksheets("Resultat").PivotTables("Pivottabell2").PivotCache.Refresh
    Worksheets("Resultat").PivotTables("Pivottabell1").PivotCache.Refresh

End Sub

Проблема в том, что функция FillDown не запускает пользовательскую функцию для всех ячеек.
После того, как код выполнил функцию FillDown, в строке состояния (?) начинается подсчет, и когда он достигает 100 %, он еще не завершен. Он вычислил менее 50%, а остальные значения являются #VALUE! ошибками. (Если я остановлю код обновления данных, UDF запустится и закончит правильно без ошибок значения)

Но это означает, что мне нужен какой-то способ определить, когда все ячейки UDF завершены, прежде чем я выключу вычисления и сделаю копирование и вставку.
Есть предложения по изменению кода?


person Andreas    schedule 12.12.2016    source источник
comment
Я не вижу ваш UDF? Возможно, выполнение вычислений в VBA и просто вставка результата может упростить (и ускорить).   -  person Ron Rosenfeld    schedule 12.12.2016
comment
В X2 точно что-то есть? Ничто в вашем коде ничего не помещает туда.   -  person SJR    schedule 12.12.2016
comment
Да что-то есть в Х2. Это формула UDF =Plockdag(E2) сама UDF сравнивает дату и время текущей строки с рабочим графиком. В определенное время он будет выводить текст, который я позже смогу отфильтровать в сводной таблице. Я тоже могу загрузить UDF, но так как график находится на листе, где он сравнивает данные, то это действительно не имеет значения.   -  person Andreas    schedule 12.12.2016
comment
@RonRosenfeld Возможно, вы что-то там понимаете. Мне не нужен фактический UDF более одного раза. Я могу просмотреть рабочий лист, чтобы выполнить те же вычисления и вывести результат в виде текста напрямую. Я попробую, должно сработать.   -  person Andreas    schedule 12.12.2016
comment
@RonRosenfeld Вы правы. Код быстрее, проще и корректно работает с кодом UDF в коде обновления VBA. Если вы опубликуете это как ответ, я приму это.   -  person Andreas    schedule 12.12.2016


Ответы (1)


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

person Ron Rosenfeld    schedule 12.12.2016