엑셀 VBA 매크로 속도 향상에 도움이 되는 주요 코드 작성법을 소개합니다.
<본문 이동 링크>
- Activate, Select 사용 자제하기
- Copy, Paste 사용 자제하기
- For문에 Each 구문 사용하기
- 변수 사전에 선언하기
- With 구문 사용하기
- Arrary로 데이터 수정하기
Activate, Select 사용 자제하기
Activate와 Select는 불필요한 화면 이동과 동작을 발생시켜 속도 저하가 발생함
불필요한 코드를 아래와 같이 수정하면 약 90% 이상 속도 향상됨
※ 실행코드에 따라 효과는 달라질 수 있음
(기존코드) _ 소요시간 0.017초
Sub Activate_Select_Before()
Sheets(2).Activate
Range("A1").Select
ActiveCell.Value = "test1"
Range("B1").Select
ActiveCell.Value = "test2"
Range("C1").Select
ActiveCell.Value = "test3"
Range("D1").Select
ActiveCell.Value = "test4"
End Sub
(변경코드) _ 소요시간 0.001초
Sub Activate_Select_After()
Sheets(2).Range("A1").Value = "test1"
Sheets(2).Range("B1").Value = "test2"
Sheets(2).Range("C1").Value = "test3"
Sheets(2).Range("D1").Value = "test4"
End Sub
Copy, Paste 사용 자제하기
Copy, Paste 대신 바로 값을 대입하면 약 70% 이상 속도 향상 가능
※ 실행코드에 따라 효과는 달라질 수 있음
(기존코드) _ 소요시간 0.021초
Sub Copy_Paste_Before()
Range("A1:A1000").Copy Range("B1:B1000")
End Sub
(변경코드) _ 소요시간 0.005초
Sub Copy_Paste_After()
Range("A1:A1000").Value = Range("A1:A1000").Value
End Sub
For문에 Each 구문 사용하기
For문 사용시 Each 명령어 사용해서 약 10% 이상 속도 향상 가능
※ 실행코드에 따라 효과는 달라질 수 있음
(기존코드) _ 소요시간 0.218초
Sub For_Each_Before()
Dim r As Integer
For r = 1 To 10000
Cells(r, 1).Value = 1
Next r
End Sub
(변경코드) _ 소요시간 0.186초
Sub For_Each_After()
Dim EachCell As Range
For Each EachCell In Range("A1:A10000")
EachCell.Value = 1
Next EachCell
End Sub
변수 사전에 선언하기
변수 선언을 사전에 선언하도록 설정해두고 코드를 짜면 코드가 길어질수록 실행 시간이 단축됩니다.
Option Explicit
▼▼▼변수 선언 요구 관련글▼▼▼
[엑셀/엑셀 VBA] - [엑셀 VBA] 편집창(화면) 초기세팅
[엑셀 VBA] 편집창(화면) 초기세팅
회사에서 PC가 바뀌면 꼭 하게 되는 엑셀 편집기 세팅방법입니다. "변수 선언 요구" 체크 글꼴 크기 수정(크게) 직접 실행 창 지역 창 조사식 창 "변수 선언 요구" 체크하기 VBA 편집기 창 - [도구] -
han8849.tistory.com
With 구문 사용하기
반복되는 오브젝트(Workbooks, Worksheets, Ranges) 등을 with구문으로 묶어주면 코드 보기가 용이하고 약간의 속도가 빨라짐
(기존코드)
Sub With_Before()
Sheets(2).Range("A1").Value = "test1"
Sheets(2).Range("B1").Value = "test2"
Sheets(2).Range("C1").Value = "test3"
Sheets(2).Range("D1").Value = "test4"
End Sub
(변경코드)
Sub With_After()
With Sheets(2)
.Range("A1").Value = "test1"
.Range("B1").Value = "test2"
.Range("C1").Value = "test3"
.Range("D1").Value = "test4"
End With
End Sub
Arrary로 데이터 수정하기
넓은 범위의 셀을 계산할 때는 셀을 순화시켜 값을 조정하기보다는 배열에 값을 저장 후 운용하는게 속도 향상에 도움이 됨
(기존코드) _ 소요시간 0.026초
Sub Array_Before()
Dim Cell As Range
For Each Cell In Range("A1:A1000")
Cell.Value = Cell.Value + 100
Next Cell
End Sub
(변경코드) _ 소요시간 0.006초
Sub Array_After()
Dim Arr_table() As Variant
Dim Value_Arr As Variant
Arr_table = Range("A1:A1000").Value
For Each Value_Arr In Arr_table
Value_Arr = Value_Arr + 100
Next Value_Arr
Range("A1:A1000") = Arr_table
End Sub
'엑셀 > 엑셀 VBA' 카테고리의 다른 글
[엑셀 VBA] 글자/배경 색상 변경하는 방법 5가지 (0) | 2022.11.20 |
---|---|
[엑셀 VBA] 작성자/사용자 정보 가져오기(이력관리) (0) | 2022.11.20 |
[엑셀 VBA] 매크로 속도 향상 방법 기본편_기본코드 4가지 (0) | 2022.11.19 |
[엑셀 VBA] 코드 실행 시간 측정하는 방법 (0) | 2022.11.19 |
[엑셀 VBA] 편집창(화면) 초기세팅 (0) | 2022.11.18 |