2016-12-12 5 views
0

各行の時刻と日付に応じてテキストを返す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セルが完了したときに検出する方法。
コードを変更する方法についてのご意見はありますか?

+0

あなたのUDFが表示されませんか? VBAで計算を行い、結果を貼り付けるだけで、作業が簡単に(より速く)なる可能性があります。 –

+0

X2には何か確かにありますか?あなたのコードの中には何も置かれていません。 – SJR

+0

はい、X2に何かがあります。これはUDFの式 '= Plockdag(E2)'です。UDF自身が現在の行の日付と時刻を作業スケジュールと比較しています。特定の「時間」に、後でピボットテーブルでフィルタリングできるテキストを出力します。 UDFもアップロードできますが、スケジュールがデータを比較するワークシート上にあるので、実際には関係ありません。 – Andreas

答えて

1

適切な時期にVBAコードで関連する計算を行い、それらの結果をワークシートに直接入力することをお勧めします。 UDFの完成を心配する必要はありません。コーディングは、より簡単で速くなければなりません。

関連する問題