У меня есть 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 завершены, прежде чем я выключу вычисления и сделаю копирование и вставку.
Есть предложения по изменению кода?
=Plockdag(E2)
сама UDF сравнивает дату и время текущей строки с рабочим графиком. В определенное время он будет выводить текст, который я позже смогу отфильтровать в сводной таблице. Я тоже могу загрузить UDF, но так как график находится на листе, где он сравнивает данные, то это действительно не имеет значения. - person Andreas   schedule 12.12.2016