2. 빈 줄을 빨리 삭제하자 - [빈칸지우기]
Serienz의 엑셀다루기2012. 2. 10. 17:38
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
엑셀을 쓰다 보면 종종 이런 경우가 있습니다. 1행에 자료가 있고 2,3행엔 없고 4행 5행에 자료 있고 6~12행에 자료 없고... 이런 식으로 한 100줄 이렇게만 있어도 수작업으로 한줄한줄 정성스레 지우려면 짜증이 올라올 겁니다. 그런데 만일 수천 행이나 수만 행이라면? 아오. 생각만 해도 끔찍하겠지요. 멘탈붕괴 옵니다.
[저런 식으로 한 3만 줄만 있다면 짜증은 3백만배 상승...]
이번 주제는 저럴 경우 간단하게 빈 줄을 없애보자! 라는 겁니다. VBA를 이용해서요. 간단하게 엑셀 2007에서 혹은 그 이상에서 [보기] 리본을 클릭하시면 맨 끝에 나와있는 매크로라는 녀석을 이용하는 겁니다. 주의하실 점은 .xls 확장자에서는 자유로이 저장이 가능한데, .xlsx라는 확장자에서는 저장이 안되므로 .xls라던가 아니면 .xlsm으로 바꾸셔야 한다는거. 만일 데이터가 65535행 이상이다 라고 한다면 .xlsm으로 바꾸셔야 정상적으로 작동합니다. 왜냐하면 엑셀 2003에서는 이 이상의 행을 인식하지 못하기 때문이지요.
엑셀 화면에서 Alt + F11 을 누르시면 자동으로 VBA 화면으로 넘어갑니다. 그리고 거기서 모듈을 추가해서 어쩌구저저구.....하면 코딩할 수 있는 창이 나오긴 하지만, 우린 야매니까요. 간단하게 합시다. 위의 단축키 누르지 마시고 저 위에 있는 보기 탭에서 매크로 라는 글자를(그림 말고) 클릭하시고, 기록 클릭하신 다음 확인 누르시고 바로 똑같은 곳을 클릭해서 기록 중지를 누르십니다.
그러고 나서 매크로 라는 글자 바로 위의 그림 부분을 누르시면 다음처럼 나옵니다!
[번개처럼 이런 창이 지나가지만 걍 엔터를 누르십니다.]
그러고 나서 매크로 라는 글자 바로 위의 그림 부분을 누르시면 다음처럼 나옵니다!
[여기까지 못오신 분은 없으시겠죠?]
이제 여기서 저 중간의 편집 이라는 녀석을 클릭하신 다음, 거기 기록되어 있는 녀석을 내비둔 채로 다음처럼 입력하시고 저장하시면 끗!
정상적으로 따라오셨다면 초록색밖에 없었을(물론 맨 윗줄이랑 맨 아랫줄의 sub 어쩌고는 있으셨겠죠...) 창에 이런 게 들어가다니 이게 뭐야...라고 하실까봐 친절하게 설명 들어갑니다.
[이게 뭐여 하시겠죠...이제 설명 들어갑니다.]
정상적으로 따라오셨다면 초록색밖에 없었을(물론 맨 윗줄이랑 맨 아랫줄의 sub 어쩌고는 있으셨겠죠...) 창에 이런 게 들어가다니 이게 뭐야...라고 하실까봐 친절하게 설명 들어갑니다.
Sub Macro1() Macro1 이라는 매크로를 지정합니다.
'
' Macro1 Macro Macro1 이라는 매크로입니다.(설명)
'
' 이런 식으로 작은따옴표가 찍힌 부분은 연산을 안하는 부분입니다. 욕써도 됨 ㅋ
Dim a As Integer a 라는 무언가를 정수값을 갖는(integer) 변수라고(as) 정의(dim)합니다.
Dim b As Integer b 라는 무언가를 정수값을 갖는(integer) 변수라고(as) 정의(dim)합니다.
Dim c As Integer c 라는 무언가를 정수값을 갖는(integer) 변수라고(as) 정의(dim)합니다.
Dim d As Variant d 라는 무언가를 일반값을 갖는(variant) 변수라고(as) 정의(dim)합니다.
이런 식으로 변수를 정의를 해 줘야 써먹을 수 있습니다. 숫자는 상관없음.
a = 1 a 에 1이라는 값을 집어넣습니다.
b = 1 b 에 1이라는 값을 집어넣습니다.
c = 500 c 에 500이라는 값을 집어넣습니다.
c = 500 c 에 500이라는 값을 집어넣습니다.
d = Cells(a, b) d 에는 셀 (a,b)의 값(a가 행이고 b가 열입니다. 여기선 당연히 1,1)을 넣습니다.
등호는 왼쪽에다가 등호 오른쪽의 값을 집어넣는다는 의미입니다.
For c = c To 1 Step -1 c 에는(for) c 부터(to) 1이 될때까지(step) -1씩 더한 값을 넣겠다(=)는 의미입니다.
If d = "" Then 만약에(if) d가 ""(빈칸) 이라면(=), 그렇다면(then)
Rows(a).Select a 번째 행(rows)을 선택(select)하고
Selection.Delete Shift:=xlUp 선택한 것(selection)을 지운(delete) 다음에 그 다음 칸을 올린다(shift=xlup)
d = Cells(a, b) 그리고 d 에는 다시 셀 (a,b)의 값을 넣는다.(a,b가 변동 없으니 다시 1,1)
여기서 다시 d 를 정의해주지 않으면...해보시면 아시겠지만 2행부터 모든 행을 지워버립니다.
참고로 매크로는 쓴 다음 컨트롤 z키도 안 먹히니 작업하시기 전에 무조건 작업하려는 파일을
따로 복사해두고 시작하세요. ㅠㅠ
여기서 다시 d 를 정의해주지 않으면...해보시면 아시겠지만 2행부터 모든 행을 지워버립니다.
참고로 매크로는 쓴 다음 컨트롤 z키도 안 먹히니 작업하시기 전에 무조건 작업하려는 파일을
따로 복사해두고 시작하세요. ㅠㅠ
Else 그런데 만약 d값이 ""가 아니었다면?
a = a + 1 그냥 a 에 a 에다 한 칸 더한(+1) 수를 집어넣고
d = Cells(a, b) d 에다가 다시 셀 (a,b)의 값을 넣는다(위에서 a 에 1 더했으니 이제 2,1)
End If if 연산을 끝냅니다.
Next c 가 저 위에 정한 step 값이 안 되었으면 다시(next) for 연산을 수행합니다.
End Sub 모든 연산이 끝났으면 이 sub Macro1()를 종료합니다.
적어놓고 보니 절대 안 친절하네요...ㅠㅠㅠㅠㅠㅠ 그냥 베껴다가 쓰시면 됩니다. 쓰실때 주의점만 적어둘게요.
1. b의 값을 적절히 조절하면 몇 번재 열의 값을 기준으로 이게 비어있으면 지울지 결정할 수 있습니다. b가 3이라면, 1행 3열의 셀 값을 시작으로 2행 3열, 3행 3열.....이렇게 매크로가 돌아가면서 비어있나 아닌가를 찾겠지요.
2. c의 값을 적절히 조절하면 자료가 1,000줄일땐 1,000, 20,000줄일땐 20,000을 넣으시면 됩니다. 이거 안 넣으시면 엑셀이 무제한으로 빙빙빙빙 돌아가는 불상사가 일어나진 않고, 이 값이 없으면 for 연산이 안 돌아가니가 디버깅 하라는 문구가 나올 겁니다. ㅋㅋ
3. Rows 대신 Columns를 넣으면 원하는만큼 열을 삭제하는 기능도 된다는거. 그런데 이렇게 바꾸려면 a랑 b도 바꿔주셔야 합니다. 안그러면 한개도 안지우거나 다지우거나 둘중 하나가 뜰수도 있음 ㄷㄷㄷ
4. a,b,c,d 말곤 알아서 넣으면 첫글자 대문자로 바뀝니다. 굳이 대문자로 넣으려고 고생 안하셔도 됩니다.
5. 이게 정답은 아니고 대강 야매로 만든거라 이거보다 더 깔끔한 로직이 있을 겁니다. 연구하시다 보면 어느새 맛스타?
6. 해설 중간 dim이니 뭐니를 한글옆에 적고 괄호쳐놓은건 알아먹기 쉬우시라고 야매로 해놓은 것이니 딱 그게 그 뜻이라고 생각하지 말아주세요. ㅠㅠ
'Serienz의 엑셀다루기' 카테고리의 다른 글
1. 파일의 수정을 간단하게 막아보자 - [최종본으로 만들기] (1) | 2012.02.10 |
---|