各行の時刻と日付に応じてテキストを返すUDFがあります。VBAコードでUDFが計算されない
このUDF式はX2に配置されています。シート内のすべてのデータを置換するデータ更新コードを実行すると、X2のフィルダウンが使用されます。Y & LastRow。
私の計画は、UDFが完了した後でデータをフィルタリングし、不要なデータを削除することでした。
フィルタリングするときにExcelがデータを再計算するので、UDFが再度実行されないように値をコピーして貼り付けることができると思いました。
完全なコードは以下ですが、「興味深い」部分は''''''
の間にあります。
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がすべてのセルでUDFを実行しないことです。
コードがFillDownを完了した後、ステータスバー(?)で計算が開始され、100%に達した時点でまだ完了していません。それは50%未満を計算し、残りの値は#VALUE!
のエラーです。 (データ更新コードを停止すると、UDFが実行され、値エラーではなくフィンランド式になります)
これは、計算をオフにしてコピー貼り付けを行う前に、すべてのUDFセルが完了したときに検出する方法。
コードを変更する方法についてのご意見はありますか?
あなたのUDFが表示されませんか? VBAで計算を行い、結果を貼り付けるだけで、作業が簡単に(より速く)なる可能性があります。 –
X2には何か確かにありますか?あなたのコードの中には何も置かれていません。 – SJR
はい、X2に何かがあります。これはUDFの式 '= Plockdag(E2)'です。UDF自身が現在の行の日付と時刻を作業スケジュールと比較しています。特定の「時間」に、後でピボットテーブルでフィルタリングできるテキストを出力します。 UDFもアップロードできますが、スケジュールがデータを比較するワークシート上にあるので、実際には関係ありません。 – Andreas