2013-10-22 6 views
1

Excel 용 매크로, 너무 화려하지 않은 개체, 수식이있는 일반 오래된 사이클이 있습니다. 기본적으로 다음과 같습니다.Excel, VBA : 메모리 지우기

행을 하나의 열로 순환하여 셀을 실행하지 않고 아주 큰 SUMPRODUCT 함수를 셀에 할당합니다. 행을 순환하면 Range.Value = Range.Value를 두 번 실행하여 수식을 실행하고 결과를 값으로 저장합니다. 그럼 다음 열로가.

Excel에서 사용하는 각 열 메모리가 크게 늘어나고 매크로가 완료된 후 파일을 저장하면 메모리가 여전히 사용됩니다 (작업 관리자를 신뢰할 수있는 경우). 파일을 닫았다가 다시 열면 물론 모든 메모리가 해제되어 작업을 계속할 수 있습니다. 32 비트 Excel에서 메모리 제한으로 인해 필요한 모든 열을 처리 할 수없는 지점에 도달했습니다.

나는 엑셀이 기억하고있는 것을 잊어 버릴 수 있도록 칼럼 사이에 구현할 수있는 트릭이 있을지 궁금했다. 성능에 영향을 줄지 신경 쓰지는 않습니다 (추가 계산에 유용한 데이터가 캐시되어있는 경우에 대비). 메모리 사용량을 너무 크게하여 처리 할 필요가 있습니다. 나는 조금만 봤지만 조금이라도 큰 물체를 아무것도 설정하지 않는 것과 관련하여 조언을한다. 아무 것도 할 일이별로 없으며주기를 거치지 않아 내 경우에는 아마 적용되지 않을 것이다.

코드는 다음과 같다 (지금 나에게 그것을 가지고 있지만, 그것은 일반적으로 단순화 거기에 어떤 버전의하지 않음) : 기본적으로

for i = 1 to 12 
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Font.Color = vbWhite 

    for m = 1 to x 
     ThisWorkbook.ActiveWorksheet.Cells(m, i).Formula = "'=SUMPRODUCT(blah)" 
    next m 

    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value 
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value 

    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Font.Color = vbBlack 
next i 

, 나는 흰색을 색상 그래서 난 몰라 지저분한 함수 텍스트를보고, 함수를 추가하고, 실행하고, 값으로 저장하고, 텍스트를 검정색으로 처리합니다. 중요한 추가 사항 : 닫힌 파일의 일부 셀을 합산하기 위해 SUMPRODUCT를 사용합니다.

+1

우리에게 코드를 보여주세요 :) –

+0

그래, 죄송합니다, 단순화 된 코드 예제를 추가했습니다 :) 다른 모든 코드는 기본적으로 일부 셀, 메시지 상자 및 몇 가지 ifs에 내용을 정리하고 있습니다. – pokrishka

+1

'SUMPRODUCT' 호출을 VBA 코드로 바꾸어 주시겠습니까? 이렇게하면 외부 통합 문서를 열고 닫을 때를 훨씬 더 효과적으로 제어 할 수 있습니다. 또는 별도의 인스턴스로 분리 할 수도 있습니다. 보너스 :'.Value = .Value'가 필요 없습니다. – Chel

답변

4

효율성 향상에 도움이되는 코드는 아닙니다. 나는 당신을위한 약간 끝을 지금 그러나 지적 할 수있다.

가장 먼저 기억해야 할 것은 매크로 시작시 응용 프로그램 화면 업데이트를 false로 전환하는 것입니다.

Application.ScreenUpdating = False

는 바로 글꼴 색상은 이제 불필요 변경 매크로 코드

Application.ScreenUpdating = True

이 끝나기 전에 다시 전환 할 수 있습니다. 매크로가 실행 중일 때 화면이 으로 잠겨 잠겨 매크로가 완료 될 때까지 변경 사항을 볼 수 없습니다.

이벤트를 사용 중지하는 것도 고려하십시오.

Application.EnableEvents = FalseApplication.EnableEvents = true 화면 업데이트와 동일한 아이디어입니다.

두 번째로 Evaluate() 함수를 사용하는 것입니다. Google에 그 기능이 얼마나 효율적인지 읽어보십시오.

셀에 함수를 넣은 다음 .Value = .Value을 수행하는 대신 Evaluate() 표현식을 사용하여 결과를 훨씬 빨리 셀에 반환 할 수 있습니다!

그래서 당신은

for i = 1 to 12 
    ThisWorkbook.ActiveWorksheet.Range(Cells(1,i),Cells(x,i)).Value = Evaluate("=SUM(blah)") 
next i 

처럼 뭔가를 할 수 난 당신이 생각을 바랍니다.

+0

팁 주셔서 감사합니다, 나는 그들을 시도합니다! 처음에는 VBA에서 필요한 값을 얻으려고 시도했지만 셀로 셀을 천천히 반복하는 반면 함수는 한 번에 모두 계산하면 매우 빠르므로 설명 된대로 만들어야했습니다. 나는 지금 평가할 것이고, 이것이 나의 경우에 도움이 될 수 있다고 본다, 대단히 감사한다! – pokrishka

+0

전체 제목과 관련하여 Excel을 닫지 않고 사용되는 메모리를 지우는 방법은 없습니다. – pokrishka

+0

아니요, 실제로 메모리를 정리할 수있는 방법이 없습니다. 'Set objName = Nothing'을보십시오. 그러나 나중에 코드에서 객체를 재사용해야하는 경우에는 도움이되지 않습니다. –

1

나는 이것이 오래된 질문이지만 작동하는 것처럼 보이는 방법은 통합 문서를 저장하는 것입니다. ThisWorkbook.Save을 가끔씩 실행하고 작업 관리자에서 EXCEL을 모니터링하면 상당한 양의 메모리가 정리됩니다.

Excel에서 특정 함수 호출이나 다른 것을 캐싱 한 것처럼 보이고 저장하면이 캐시가 지워지는 것처럼 보입니다.