열려 있는 모든 워크북이 아닌 전체 워크북을 계산하려면 어떻게 해야 합니까?
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.Calculate
4.41msThisWorkbook.Worksheets(1).Calculate
각 워크시트에 대해 52.05msThisWorkbook.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
'sourcetip' 카테고리의 다른 글
앱 릴리스 미서명의pk가 서명되지 않았습니다. (0) | 2023.08.11 |
---|---|
Spring Boot + JPA + Hibernate는 repository.save 시 커밋되지 않습니다. (0) | 2023.08.11 |
노드에서 서버 측 이미지 조작에 사용할 라이브러리를 선택합니다.JS? (0) | 2023.08.11 |
하이디SQL을 사용하여 SSH 터널을 통해 MySQL 유닉스 소켓에 연결하려면 어떻게 해야 합니까? (0) | 2023.08.11 |
크기가 고정된 RecyclerView 집합 이해 (0) | 2023.08.11 |