매크로 속도를 높이는 10가지 방법

Excel 매크로가 점점 강력해지고 복잡해짐에 따라 성능이 저하될 수 있습니다. 매크로를 논의할 때 성능 이라는 단어 는 일반적으로 속도 와 동의어입니다 . 속도는 VBA 프로시저가 의도한 작업을 수행하는 속도입니다. 다음은 Excel 매크로를 최적의 성능 수준에서 실행하는 데 도움이 되는 10가지 방법입니다.

시트 계산 중지

스프레드시트의 수식에 영향을 주는 셀이 변경되거나 조작될 때마다 Excel에서 전체 워크시트를 다시 계산한다는 사실을 알고 계셨습니까? 수식이 많은 워크시트에서 이 동작으로 인해 매크로 속도가 크게 느려질 수 있습니다.

Application.Calculation 속성을 사용하여 Excel에 수동 계산 모드로 전환하도록 지시할 수 있습니다. 통합 문서가 수동 계산 모드에 있으면 F9 키를 눌러 계산을 명시적으로 트리거할 때까지 통합 문서가 다시 계산되지 않습니다.

Excel을 수동 계산 모드로 전환하고 코드를 실행한 다음 자동 계산 모드로 다시 전환합니다.

하위 매크로1()
Application.Calculation = xlCalculationManual
 '여기에 매크로 코드를 넣으십시오.
Application.Calculation = xlCalculationAutomatic
엔드 서브

계산 모드를 xlCalculationAutomatic으로 다시 설정하면 워크시트의 재계산이 자동으로 트리거되므로 매크로가 실행된 후 F9 키를 누를 필요가 없습니다.

시트 화면 업데이트 비활성화

매크로가 실행될 때 화면이 상당히 깜박임을 알 수 있습니다. 이 깜박임은 Excel에서 워크시트의 현재 상태를 표시하기 위해 화면을 다시 그리려는 것입니다. 불행히도 Excel은 화면을 다시 그릴 때마다 메모리 리소스를 차지합니다.

Application.ScreenUpdating 속성을 사용하여 매크로가 완료될 때까지 화면 업데이트를 비활성화할 수 있습니다. 화면 업데이트를 비활성화하면 시간과 리소스가 절약되어 매크로를 조금 더 빠르게 실행할 수 있습니다. 매크로 코드 실행이 완료되면 화면 업데이트를 다시 켤 수 있습니다.

하위 매크로1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = 거짓
 '여기에 매크로 코드를 넣으십시오.
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
엔드 서브

ScreenUpdating 속성을 다시 True로 설정하면 Excel에서 자동으로 화면 다시 그리기를 트리거합니다.

상태 표시줄 업데이트 끄기

Excel 창 하단에 나타나는 Excel 상태 표시줄은 일반적으로 Excel에서 특정 작업의 진행 상황을 표시합니다. 매크로가 많은 데이터로 작동하는 경우 상태 표시줄이 일부 리소스를 차지합니다.

화면 업데이트를 끄는 것은 상태 표시줄 표시를 끄는 것과 별개입니다. 화면 업데이트를 비활성화하더라도 상태 표시줄은 계속 업데이트됩니다. Application.DisplayStatusBar 속성을 사용하여 상태 표시줄 업데이트를 일시적으로 비활성화하여 매크로의 성능을 더욱 향상시킬 수 있습니다.

하위 매크로1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = 거짓
Application.DisplayStatusBar = 거짓
 '여기에 매크로 코드를 넣으십시오.
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
엔드 서브

이벤트를 무시하도록 Excel에 지시

매크로를 이벤트 프로시저로 구현하여 워크시트나 통합 문서가 변경될 때 특정 코드를 실행하도록 Excel에 지시할 수 있습니다.

때때로 표준 매크로는 이벤트 프로시저를 트리거하는 변경을 수행합니다. 예를 들어 Sheet1의 여러 셀을 조작하는 표준 매크로가 있는 경우 해당 시트의 셀이 변경될 때마다 Worksheet_Change 이벤트가 실행되는 동안 매크로가 일시 중지되어야 합니다.

EnableEvents 속성을 사용하여 매크로가 실행되는 동안 이벤트를 무시하도록 Excel에 지시하여 다른 수준의 성능 향상을 추가할 수 있습니다.

매크로를 실행하기 전에 EnableEvents 속성을 False로 설정하십시오. 매크로 코드 실행이 완료되면 EnableEvents 속성을 다시 True로 설정할 수 있습니다.

하위 매크로1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = 거짓
Application.DisplayStatusBar = 거짓
Application.EnableEvents = 거짓
 '여기에 매크로 코드를 넣으십시오.
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
엔드 서브

페이지 나누기 숨기기

매크로가 행 수를 수정하거나, 열 수를 수정하거나, 워크시트의 페이지 설정을 변경할 때마다 Excel은 시트에 표시된 페이지 나누기를 다시 계산하는 데 시간이 걸립니다.

매크로를 시작하기 전에 페이지 나누기를 숨기기만 하면 이 문제를 피할 수 있습니다.

페이지 나누기를 숨기려면 DisplayPageBreaks 시트 속성을 False로 설정합니다. 매크로가 실행된 후 페이지 나누기를 계속 표시하려면 DisplayPageBreaks 시트 속성을 다시 True로 설정하십시오.

하위 매크로1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = 거짓
Application.DisplayStatusBar = 거짓
Application.EnableEvents = 거짓
Activesheet.DisplayPageBreaks = 거짓
 '여기에 매크로 코드를 넣으십시오.
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Activesheet.DisplayPageBreaks = True
엔드 서브

피벗 테이블 업데이트 일시 중단

매크로가 대용량 데이터 소스가 포함된 피벗 테이블을 조작하는 경우 피벗 필드를 동적으로 추가하거나 이동하는 것과 같은 작업을 수행할 때 성능이 저하될 수 있습니다.

모든 피벗 필드가 변경될 때까지 피벗 테이블의 재계산을 일시 중단하여 매크로의 성능을 향상시킬 수 있습니다. PivotTable.ManualUpdate 속성을 True로 설정하여 재계산을 연기하고 매크로 코드를 실행한 다음 PivotTable.ManualUpdate 속성을 다시 False로 설정하여 재계산을 트리거하기만 하면 됩니다.

하위 매크로1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
 '여기에 매크로 코드를 넣으십시오.
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=False
엔드 서브

복사 및 붙여넣기 금지

매크로 레코더가 VBA 코드를 작성하여 시간을 절약하지만 항상 가장 효율적인 코드를 작성하지는 않는다는 점을 기억하는 것이 중요합니다. 대표적인 예는 매크로 레코더가 기록하는 동안 수행하는 복사 및 붙여넣기 작업을 캡처하는 방법입니다.

중개자를 제거하고 한 셀에서 대상 셀로 직접 복사를 수행하여 매크로를 약간 향상시킬 수 있습니다. 이 대체 코드는 Destination 인수를 사용하여 클립보드를 무시하고 셀 A1의 내용을 셀 B1에 직접 복사합니다.

범위("A1").복사 대상:=범위("B1")

서식이나 수식이 아닌 값만 복사해야 하는 경우 Copy 메서드를 함께 사용하지 않으면 성능을 더욱 향상시킬 수 있습니다. 대상 셀의 값을 원본 셀에서 찾은 것과 동일한 값으로 설정하기만 하면 됩니다. 이 방법은 복사 방법을 사용하는 것보다 약 25배 빠릅니다.

범위("B1").값 = 범위("A1").값

한 셀에서 다른 셀로 수식만 복사해야 하는 경우(값이나 서식이 아님) 대상 셀의 수식을 원본 셀에 포함된 동일한 수식으로 설정할 수 있습니다.

범위("B1").공식 = 범위("A1").공식

With 문 사용

매크로를 기록할 때 동일한 개체를 두 번 이상 조작하는 경우가 많습니다. With 문을 사용하여 주어진 개체에 대해 한 번에 여러 작업을 수행하면 시간을 절약하고 성능을 향상시킬 수 있습니다.

다음 예제에서 사용된 With 문은 Excel에 모든 서식 변경 사항을 한 번에 적용하도록 지시합니다.

    범위 포함("A1").글꼴
    .굵게 = 참
    . 기울임꼴 = 참
    .밑줄 = xlUnderlineStyleSingle
    종료

동작을 With 문으로 묶는 습관을 들이면 매크로가 더 빠르게 실행될 뿐만 아니라 매크로 코드를 더 쉽게 읽을 수 있습니다.

Select 메서드 피하기

매크로 레코더는 Select 메서드를 사용하여 작업을 수행하기 전에 개체를 명시적으로 선택하는 것을 좋아합니다. 일반적으로 작업하기 전에 개체를 선택할 필요가 없습니다. 실제로 Select 메서드를 사용하지 않으면 매크로 성능을 크게 향상시킬 수 있습니다.

매크로를 기록한 후에는 생성된 코드를 변경하여 Select 메서드를 제거하는 습관을 들이십시오. 이 경우 최적화된 코드는 다음과 같습니다.

    Sheets("Sheet1").Range("A1").FormulaR1C1 = "1000"
    Sheets("Sheet2").Range("A1").FormulaR1C1 = "1000"
    Sheets("Sheet3").Range("A1").FormulaR1C1 = "1000"

아무것도 선택되지 않음을 유의하십시오. 코드는 단순히 개체 계층을 사용하여 필요한 작업을 적용합니다.

워크시트로 이동 제한

매크로 속도를 높이는 또 다른 방법은 코드에서 워크시트 데이터를 참조하는 횟수를 제한하는 것입니다. 메모리에서보다 워크시트에서 데이터를 가져오는 것이 항상 덜 효율적입니다. 즉, 워크시트와 반복적으로 상호 작용할 필요가 없는 경우 매크로가 훨씬 빠르게 실행됩니다.

예를 들어 다음 간단한 코드는 VBA가 If 문에서 수행되는 비교에 필요한 숫자를 얻기 위해 Sheets("Sheet1").Range("A1")로 계속 돌아가도록 합니다.

ReportMonth의 경우 = 1 ~ 12
     If Range("A1").Value = ReportMonth 다음
     MsgBox 1000000 / ReportMonth
종료
다음 보고월

훨씬 더 효율적인 방법은 Sheets("Sheet1").Range("A1")의 값을 MyMonth라는 변수에 저장하는 것입니다. 이런 식으로 코드는 워크시트 대신 MyMonth 변수를 참조합니다.

Dim MyMonth as 정수
MyMonth = 범위("A1").값
ReportMonth의 경우 = 1 ~ 12
MyMonth = ReportMonth이면
MsgBox 1000000 / ReportMonth
종료
다음 보고월

워크시트를 직접 참조하는 대신 변수를 활용하여 메모리의 데이터로 작업하는 것을 고려하십시오.

과도한 언급을 피하세요

개체의 메서드나 속성을 호출할 때 OLE 구성 요소의 IDispatch 인터페이스를 거쳐야 합니다. 이러한 OLE 구성 요소에 대한 호출에는 시간이 걸리므로 OLE 구성 요소에 대한 참조 수를 줄이면 매크로 코드 속도가 향상될 수 있습니다.

객체 속성이나 메서드 호출에는  일반적으로 Object.Method 의 표현 메서드  , 즉 "."를 사용합니다. 기호는 속성과 메서드를 호출하는 데 사용됩니다.

따라서 "." 기호의 개수에 따라 메소드나 속성 호출 횟수를 판단할 수 있습니다. "."가 적을수록 기호를 사용하면 코드 실행 속도가 빨라집니다.

예를 들어 다음 문에는 3개의 기호 "."가 포함되어 있습니다.

ThisWorkbook.Sheet1.Range("A1").Value = 100

다음 명령문에는 "." 기호가 하나만 있습니다.

Activewindow.Top = 100

다음은 "." 기호 수를 줄이는 몇 가지 요령입니다. 더 빨리 달리려고.

첫째, 동일한 객체를 반복적으로 참조해야 하는 경우 객체를 변수로 설정하여 호출 횟수를 줄일 수 있습니다. 예를 들어 다음 코드에는 한 줄에 두 번의 호출이 필요합니다.

ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300

Sheets("Sheet1") 개체는 반복적으로 참조되어야 하기 때문에  먼저  변수  sht 로 설정하여  각 코드를 한 번만 호출하면 됩니다.

Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300

둘째, 임시 변수 sht를 선언하지 않으려면   앞서 언급한 With 문을 사용할 수도 있습니다. 다음 예에 표시된 대로:

With ThisWorkbook.Sheets("Sheet1")
    .Cells(1, 1) = 100
    .Cells(2, 1) = 200
    .Cells(3, 1) = 300
End With

셋째,  루프가 많은 경우 루프 외부에 속성과 메서드를 유지하도록 노력하세요.  동일한 객체의 속성값을 루프 내에서 재사용할 경우 먼저 루프 외부의 지정된 변수에 속성값을 할당한 다음 루프 내에서 해당 변수를 사용하면 더 빠른 속도를 얻을 수 있습니다. 다음 예에 표시된 대로:

For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = Cells(1, 2).Value
Next i

이 예제의 각 루프는 Cells(1,2) 셀의 Value 속성을 가져옵니다. 루프가 시작되기 전에 Cells(1.2)의 Value 속성을 변수에 할당하면 실행 속도가 빨라집니다. 다음 예에 표시된 대로:

tmp = Cells(1, 2).Value
For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = tmp
Next i

위 코드는   반복될 때마다 ThisWorkbook.Sheets("Sheet1")을 호출합니다. With 문을 사용하여  ThisWorkbook.Sheets("Sheet1")  에 대한 호출을   루프 외부로 이동하면 이 작업을 더 빠르게 수행할 수 있습니다. 다음 예에 표시된 대로:

tmp = Cells(1, 2).Value
With ThisWorkbook.Sheets("Sheet1")
    For i = 1 To 1000
        .Cells(1, 1) = tmp
        .Cells(2, 1) = tmp
        .Cells(3, 1) = tmp
    Next i
End With

변형 유형 사용을 피하세요

초보자는 일반적으로 Variant 유형 변수를 사용하는 것을 선호합니다. 이는 Integer 또는 Long 데이터 유형에 비해 데이터가 너무 큰 경우 메모리 오버플로 문제 없이 모든 유형의 데이터를 사용할 수 있기 때문에 덜 복잡하다는 장점이 있습니다. 그러나 Varienmt 유형 데이터는 다른 지정된 유형(Integer 데이터의 경우 2바이트, Long 데이터의 경우 4바이트, Variant 데이터의 경우 16바이트)보다 더 많은 추가 메모리 공간이 필요하며, VBA는 다른 지정된 유형보다 Variant 유형 데이터를 처리하는 데 더 많은 시간이 필요합니다. 데이터. 다음 예는 다음과 같습니다.

Sub VariantTest()
    Dim i As Long
    Dim ix As Integer, iy As Integer, iz As Integer
    Dim vx As Variant, vy As Variant, vz As Variant
    Dim tm As Date
    vx = 100: vy = 50
    tm = Timer
    For i = 1 To 1000000
        vz = vx * vy
        vz = vx + vy
        vz = vx - vy
        vz = vx / vy
    Next i
    Debug.Print "Variant types take " & Format((Timer - tm), "0.00000") & " seconds"
    ix = 100: iy = 50
    tm = Timer
    For i = 1 To 1000000
        iz = ix * iy
        iz = ix + iy
        iz = ix - iy
        iz = ix / iy
    Next i
    Debug.Print "Integer types take " & Format((Timer - tm), "0.00000") & " seconds"
End Sub

위 코드에서 8~13행은 Variant 변수의 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 100만 번 수행하고, 17~22행은 Integer 변수의 덧셈, 뺄셈, 곱셈, 나눗셈을 100만 번 수행합니다. 내 컴퓨터에서 Variant 변수의 연산은 약  0.09375  초가 걸렸고, Integer 변수의 연산은 약  0.03125  초가 걸렸다. 결과는 컴퓨터마다 다를 수 있지만  Variant 변수는 Integer 변수보다 상당히 느립니다 .

이러한 이유로  지정된 데이터 유형을 명시적으로 사용할 수 있는 경우 Variant 변수를 사용하지 않는 것이 좋습니다 .


스마트시트 9.1.1

스마트시트 9.1.1

Smartsheet는 프로젝트를 관리하고, 워크플로를 구축하고, 팀과 협업할 수 있는 동적 작업 플랫폼입니다.

공유 지점

공유 지점

SharePoint는 다양한 워크플로 응용 프로그램, "목록" 데이터베이스 및 기타 웹 구성 요소는 물론 보안 기능을 사용하여 비즈니스 그룹의 공동 작업을 제어하는 ​​웹 기반 공동 작업 시스템입니다.

퍼페추얼 캘린더 1.0.38/1.0.36

퍼페추얼 캘린더 1.0.38/1.0.36

반니엔 캘린더(Van Nien Calendar)는 휴대폰에서 달력 보기 애플리케이션으로, 휴대폰에서 태음태양일을 빠르게 확인하고 중요한 업무를 정리할 수 있도록 도와줍니다.

마이크로소프트 아웃룩 2021

마이크로소프트 아웃룩 2021

Microsoft Outlook은 Microsoft Corporation에서 개발한 비즈니스 및 생산성 응용 프로그램입니다.

클릭업

클릭업

ClickUp은 모든 비즈니스에서 가장 높은 평가를 받는 생산성 플랫폼 중 하나입니다. Google, Booking.com, San Diego Padres 및 Uber와 같은 대기업은 모두 ClickUp을 사용하여 직장 생산성을 높입니다.

PDF-XChange 뷰어 2.5.322.10

PDF-XChange 뷰어 2.5.322.10

PDF는 텍스트 문서를 읽고, 만들고, 보내는 데 일반적으로 사용되는 형식이 되었습니다. 결과적으로 이러한 유형의 문서화에 사용되는 프로그램 수가 증가했습니다. PDF-XChange Viewer는 점점 더 많은 PDF 뷰어 중 하나입니다.

아파치 오픈오피스

아파치 오픈오피스

Apache OpenOffice는 특히 Excel, PowerPoint 및 Word에서 Microsoft 365에 필적하는 완전한 Office 애플리케이션 제품군을 제공합니다. 프로젝트를 보다 효과적으로 관리할 수 있으며 다양한 파일 형식을 지원합니다.

iTaxviewer 1.8.7 다운로드

iTaxviewer 1.8.7 다운로드

iTaxViewer 소프트웨어는 오늘날 가장 널리 사용되는 XML 파일 읽기 소프트웨어입니다. 이 소프트웨어는 국세청의 XML 형식으로 된 전자 세금 신고서를 읽기 위한 애플리케이션입니다.

니트로 PDF 리더

니트로 PDF 리더

Nitro PDF Reader는 대부분의 사람들이 PDF 문서로 매일 수행하는 모든 기본 작업을 다루는 편리한 PDF 편집기입니다.

Foxit 리더 12

Foxit 리더 12

Foxit Reader는 기본적으로 PDF 리더이며 PDF 파일을 생성하고, 서명하고, 편집하고, 주석을 추가할 수도 있습니다. 운영 체제에서 작동하며 Microsoft Office 패키지의 다양한 프로그램에 대한 플러그인이 있습니다.