
엑셀을 배울때 Vlookup을 배우고 나서는 이녀석과 늘 씨름을 하였다. 많은 영역을 가지고 있는 data에서 실제 값을 도출하려는 시트에서 함수식으로 그 영역을 채우고서는 수정하나 할려면 아직도 쌩쌩한 PC가 부들부들 떠는걸 보실 수 있다.
그래서 그꼴보기 싫어서 다늙어서 꾸역꾸역 VBA를 배우고 있는 이유이기도 하다.

허나 당신이 Vlookup을 안쓰려고 해도 Vlookup 한방이면 될거 같은 상황이 의외로 많이 접하게 된다. 그러니 불편한데도 당신이 야구 감독이라면 오늘도 Vlookup을 선발로 기용하게 될 것이다.
Vlookup의 대안으로 VBA코드들이나 파워쿼리를 이용하는 방법도 있긴 당신은 쉬운길로 갈 수 있는 걸 꼴보기 싫다고 억지로 돌아가는 수고스러움을 굳이 본인 체력을 볼모로 하게 될것이다.

VBA에서 Vlookup을 안쓰려는 이유를 알아보자
1. 영역 전체에 함수식이 들어가 있는 상태에서 다른 영역의 값을 계속 참조하기 때문에 무겁다.
2. Formula 를 통해서 셀에 함수식으로 출력을 한들 1번과 같은 상황이 발생한다.
3. Vlookup은 통상 셀기반이기에 출력하려는 영역을 모두 순환하면서 값은 출력해야 함으로 이 또한 시간이 걸린다.
1번과 2번의 해결책은 Vlookup 코드를 복사했다가 값이 나오면 해당 영역을 복사하여 같은 위치에 값으로 다시 뿌려주면 될것같고,
3번의 해결책은 배열로 담아서 한번에 뿌려주면 될것 같은데 문제는 여기서 발생한다.

출력하려는 위치 [b2]에서 Vlookup을 참조하려할때 [a2] 한셀만 참조하기에 순환문을 구성해야 하는데 이것만 배열로 담을 수 있으면 집나간 며느리도 돌아올 수 있다는 확신이 있다. 엑셀에서 전체영역을 잡은 후 한셀에 엑셀 함수식을 쓴 후 [Ctrl+Enter]를 누르면 전체 영역이 적용하는 걸 이용해 보면 되지않을까????

된다!!!!!
2년 결별한 Vlookup과 재결합을 공식 선언한다..ㅋㅋㅋ

유념할것은 다른 시트나 다른 파일을 참조영역을 잡을 때는 시트위치를 영역의 앞에 반드시 써줘야한다.
[ 다 쓴 코드도 다시보자 / 잘 쓴 Vlookup 하나, 열 코드 안부럽다 / Vlookup 하나만 써서 잘 키우자]
VLookup(rngAll.Columns(1), Sheets(2).Range(Sheets(2).[b2], Sheets(2).Cells(Rows.Count, "o").End(3)), C, 0)
[문제만들기] 코드 분석

이 코드에서 크게 어려울 건 없지만 Col변수의 값을 이해하기가 좀 어려울것 같다.

Index함수는 참조영역이 필요하고, 행번호와 열번호가 필요하다.
[문제만들기]에서는 새로운 이름을 가져와야 함으로 [DATA]시트에서 이름부분을 참조하였고, 총 500개의 이름에서 랜덤으로 뽑아와야 하기에 행번호를 랜덤으로 가져오라는 구문을 사용한것이다.
Col = WorksheetFunction.Index(Range([b2], [b2].End(4)), WorksheetFunction.RandBetween(1, 500))
Range([b2], [b2].end(5)) -> DATA 시트의 이름부분
Randbetween(1,500) -> 랜덤한 수 1부터 500중 하나를 뽑아서 index함수의 참조 열번호를 사용하여 이름 도출

오늘도 VBA로 시름하고 있을 당신께 행운이 깃들길....
'VBA' 카테고리의 다른 글
[VBA_Array Slicing] 랜덤한 이름생성하기 (0) | 2021.08.12 |
---|---|
[VBA_AdvancedFilter] 데이터 재배치하기 (0) | 2021.08.11 |
[VBA_Dictionary] 데이터 재배치 (0) | 2021.08.10 |
[VBA_Select Case] 데이터 재배치 (0) | 2021.08.09 |
[VBA_Sum vs Consolidate] 병합과 합계구하기 (0) | 2021.08.08 |
댓글