sourcetip

열려 있는 모든 워크북이 아닌 전체 워크북을 계산하려면 어떻게 해야 합니까?

fileupload 2023. 8. 11. 22:32
반응형

열려 있는 모든 워크북이 아닌 전체 워크북을 계산하려면 어떻게 해야 합니까?

VBA에서 열려 있는 모든 워크북이 아닌 전체 워크북을 계산할 수 있는 방법이 있습니까?

에 대해 알고 있습니다.

worksheet.Calculate

한 장이면 됩니다.에 대해서도 알고 있습니다.

Application.CalculateFull

하지만 이렇게 하면 열려 있는 모든 문제집을 동시에 다시 계산할 수 있을 것 같습니다.

워크북 하나만 할 수 있습니까?

편집: 다음과 같은 방법이 있습니다.

For Each wks In ActiveWorkbook.Worksheets
    wks.Calculate
Next

하지만 시트 사이에 링크가 있으면 매우 위험합니다. 그러면 계산 순서가 중요합니다.정확한 순서를 찾아서 적용할 수 있다는 것을 알고 있습니다. 문제는 매우 큰 문제집에서 이 작업이 다소 까다로울 수 있다는 것입니다.

몇 가지 조사 및 테스트를 거친 후 모든 시트를 먼저 선택한 후 계산하면 다음과 같이 작동합니다.

Application.Calculation = xlManual
ThisWorkbook.Sheets.Select
ActiveSheet.Calculate 

선택한 모든 시트를 동시에 계산하여 올바른 계산 순서를 만듭니다.

Steven G의 대답은 실제로 효과가 없습니다. 그저 효과가 있는 것처럼 보입니다.(저는 50명 이상의 담당자가 없기 때문에 그 게시물에 답장할 수 없습니다. 귀찮습니다.)

여전히 시트를 1방향 순서로 계산합니다.저는 이것을 5장의 시트를 만들고 각각의 시트에 다른 방향으로 +1을 다른 셀에 배치하여 테스트했습니다.선택 시트를 사용한 다음 계산 방법을 사용하면 잘못된 결과를 얻을 수 있습니다.

시트가 보여야 하기 때문에 아래는 해당 방법을 사용하여 계산 함수를 대체하기 위해 만든 함수 I입니다. (사전 참조 라이브러리 필요.그러나 사용하지 마십시오.

    EXAMPLE, METHOD DOES NOT WORK
Function Calculate_Workbook(Optional Wb As Workbook)

'Application.calculate will calculate all open books, which can be very slow.
'Looping through all sheets in workbook to calculate can be risky due to formula referencing a cell thats not yet calculated, calculation order may be important.
Dim DicShtVisible As New Dictionary
DicShtVisible.CompareMode = TextCompare
Dim Asht As Worksheet, AWkbk As Workbook    'Previously selected books
Dim Sht As Worksheet

Set Asht = ActiveSheet
Set AWkbk = ActiveWorkbook

If Wb Is Nothing Then Set Wb = ThisWorkbook

Wb.Activate
'Unhide all sheets as can't select very hidden stuff
For Each Sht In Wb.Sheets
    DicShtVisible.Add Sht.Name, Sht.Visible
    Sht.Visible = xlSheetVisible
Next Sht

'Select all sheets and calculate the lot
Wb.Sheets.Select
ActiveSheet.Calculate

'Reapply visibility settings
Dim Key As Variant
For Each Key In DicShtVisible.Keys
    Wb.Sheets(Key).Visible = DicShtVisible.Item(Key)
Next Key

'Reset selections
AWkbk.Activate
Asht.Select

End Function

제가 보기에 해결책이 없는 한, 유일한 답은 워크북의 계산 순서를 알고 그 순서대로 시트를 수동으로 계산하거나 계산을 사용하여 열려 있는 모든 워크북을 계산하는 것입니다.

하지만 저는 틀렸다는 것이 증명되고 싶습니다.그것은 정말 짜증나고 어리석은 문제입니다.

내가 아는 건 아무것도 없어, 스티븐.

당신은 실제로 시간을 낭비합니다.Application.Worksheets(1).Calculate

타이밍 테스트를 실행했습니다. Excel의 동일한 인스턴스에 워크북 3개가 열려 있습니다.

8200개의 휘발성 함수가 있는 워크시트, 4개의 비연속 범위에서 한 워크시트에 8000개, 다른 워크시트에 200개.

총 100개의 기능을 갖춘 다른 두 권의 워크북.결과:

  • Application.Calculate4.41ms
  • ThisWorkbook.Worksheets(1).Calculate각 워크시트에 대해 52.05ms
  • ThisWorkbook.Worksheets(1).Range("R1").Calculate(4회 측정) - 84.64ms

반직관적이지만 사실입니다.

또한 다음을 선언하는 데 시간이 걸립니다.Dim wks as Worksheet당신이 하지 않는 한...각각 그것을 언급하는 것은ThisWorkbook.Worksheets(1) 빠름 ㅠㅠㅠㅠ

또한 다음을 참조하여 주의하십시오.ActiveWorkbook코드를 실행할 때 기본 워크북이 활성 워크북이 아닐 수 있습니다.ThisWorkbook(코드가 있는 것이) 더 안전합니다.

이 워크북은 코드가 있는 워크북만 사용합니다.

For Each wks In ThisWorkbook.Worksheets
    wks.Calculate
Next wks

또 다른 옵션은 Excel의 새 인스턴스를 만들고 워크북을 열어 해당 인스턴스를 계산하는 것입니다.이렇게 하면 원래 인스턴스의 모든 워크북이 계산되지 않고 다른 워크북의 계산 속도가 매우 느린 경우(예: 100k 이상 공식) 시간이 절약될 수 있습니다.

Dim xlApp As Excel.Application
Dim wbTest As Workbook

Set xlApp = New Excel.Application
Set wbTest = xlApp.Workbooks.Open("c:\temp\test.xlsx")

' do a bunch of stuff in wbTest

xlApp.Calculate

이것이 더 나은지는 당신의 상황에 달려 있습니다.Excel의 두 번째 인스턴스를 여는 데는 약간의 추가 시간과 아마도 더 많은 메모리가 필요합니다(비록 이것을 테스트하지 않았고 상당한 양은 아닐 수도 있습니다).

이 워크북이 다른 인스턴스에 있고 일부 기능에 문제가 있을 수 있으므로 코드를 더 변경해야 할 수 있습니다(예: Excel의 원래 인스턴스에 있는 모든 워크북을 스풀하여 워크북이 이미 열려 있는지 확인하는 경우).

계산만 사용

예:

Sub Cal_()
    Calculate
End Sub

우리는 사용할 수 있습니다.

Application.CalculateBeforeSave = True 

워크북을 저장하시겠습니까?현재 값을 트랩하기 위해 더 세분화할 수 있습니다. true가 아니면 설정하고, true가 아니면 저장하고, true가 아니면 재설정합니다.

사용해 보십시오.

Sub CalcBook()
    Dim wks As Worksheet
    Application.Calculation = xlManual
    For Each wks In ActiveWorkbook.Worksheets
        wks.Calculate
    Next
    Set wks = Nothing
End Sub

언급URL : https://stackoverflow.com/questions/43806643/how-can-i-calculate-an-entire-workbook-but-not-all-open-workbooks

반응형