토픽 EXCEL/VBA

24. 06. 14. 초심자 대상 VBA 속도 개선 팁

새회사 · M**********

[Select는 쓰지 말 것]
간혹 코드를 보면 Range("셀주소").Select를 한 후 활성화된 셀인 Selection 또는 ActiveCell에 대해 조작을 하시는 분들이 있다. 왜 이런 매크로가 종종 보이는지는 알 수 없지만 추정컨데 컴활 1급이 원흉이 아닐까 싶기도...

하지만 생각을 해보면 Select를 한다는 것은 내가 어느 셀을 접근하고자 하는지 이미 알고 있다는 뜻인데, 이 경우 Range 객체의 속성 값을 바로 접근하면 될 일이지 굳이 Select를 거칠 필요가 없다.

예로 A1에서 A100까지의 셀에 각 1을 더하는 프로시저를 실행한다고 가정해보자.

For i = 1 to 100 ... Next i 에 대해
1. Cells(i, 1).Value = Cells(i, 1).Value + 1
2. Cells(i, 1).Select : Selection.Value = Selection.Value + 1
을 실행하는 경우 1은 약 0.0043초, 2는 약 0.01초가 걸린다 (100회 수행 평균, ScreenUpdating=False인 경우)
ScreenUpdating을 켜져있을 때는 2는 화면 이동이 발생하므로 훨씬 큰 격차가 날 것으로 예상된다.

[데이터가 너무 많으면 배열에 집어넣고 계산을 하자]
특정 Range에 대해 셀을 하나씩 돌면서 확인할 때 흔히 각 셀을 직접 접근하면서 그 셀의 데이터를 직접 읽고 쓰거나 한다. 다만 데이터가 너무 많은 경우에는 배열 변수에 값을 전부 집어넣은 후 배열을 돌면서 값을 확인 및 조작하는게 빠르다.

A1:A100과 B1:B100의 각 행의 값이 동일한지 확인한 후 C1:C100에 동일하면 TRUE, 다르면 FALSE를 입력하는 프로시저를 실행한다고 가정해보자.

1.
For i = 1 To 100
If Cells(i, 1) = Cells(i, 2) Then
Cells(i, 3).Value = True
Else
Cells(i, 3).Value = False
End If
Next i

2.
arrA = Application.Transpose(Range("A1:A100").Value)
arrB = Application.Transpose(Range("B1:B100").Value)

For i = 1 To 100
If arrA(i) = arrB(i) Then
Cells(i, 3).Value = True
Else
Cells(i, 3).Value = False
End If
Next i

1은 평균 0.00457초, 2는 평균 0.00426초가 걸렸다
위와 같이 간단한 작업에서도 7% 정도의 속도 차이가 발생함을 알 수가 있다.
참고로 2에서의 Transpose의 역할은 2차원 배열로 변함을 막기 위함이다.

#엑셀 #EXCEL #VBA

댓글 1

앱에서만 댓글 입력이 가능한 채널입니다.
앱으로 이동해 댓글을 작성해주세요.

스타트업 · w***

😀😃😄😁

인기 채용

더보기

토픽 베스트

포켓몬스터
유우머
🐉 청룡띠 임신,출산,육아
꿀팁 공유하자!👏
여행·먹방
애니메이션
80년대생 이야기
디아블로4
주류탐험
와인