2016-12-12 1 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의 완성에 대해 걱정할 필요가 없습니다. 코딩은 더 간단하고 빠릅니다.

관련 문제