엑셀시트의 자료에서 특정행을 삭제하는데 수작업으로 가능하지만 양이 많을때는 VBA 코드를 짜서 편리하게 이용할수 있습니다. 아래 예제는 특정조건에 맞는 데이터가 셀에 포함되어 있을 때 행 전체를 삭제하는 샘플입니다.
▼ 샘플데이터에서 소속이 “관리부” 인 데이터를 삭제하고자 합니다. 데이터가 많은 경우 일일이 삭제하는 것이 비효율적이고 쉽지 않기 때문에 매크로를 만들어 작업 속도를 올려보세요.
▼ 데이터 자동 삭제 매크로를 만들어 보겠습니다. 개발 도구 > 매크로 리본 메뉴를 클릭합니다.
▼ 매크로를 실행할 함수를 만들어야 합니다. 매크로 이름에 함수명을 넣고 오른쪽 사이드 메뉴에서 만들기 버튼을 클릭합니다.
※ 아래는 참고하면 좋을 만한 글들의 링크를 모아둔 것입니다. ※ ▶ 엑셀 VBA 다른 셀에 일치하는 코드 값에 데이터 찾아 추가하기 ▶ 엑셀 VBA 마지막 행과 열의 수 찾기 ▶ 엑셀 VBA 시트에서 데이터 셀 영역 구하기 ▶ 엑셀 VBA – 매크로 이용해서 특정 조건의 데이터를 삭제하고 싶을 때 ▶ 엑셀 VBA 입력된 값 형식 확인 Information 관련 함수 모음 |
▼ 함수에 들어가는 전체 소스는 다음과 같습니다.
Sub 관리부_삭제()
Dim co As Long, i As Long
Dim join As String
Dim buNum As String
Dim deleteRow As Integer
'추가할 시트에 Row count 를 알아옵니다
co = ActiveSheet.Range("B3").CurrentRegion.Rows.Count
Cells(3, "B").Select
For i = 0 To co
join = Selection.Offset(0, 0) ' 소속셀값
buNum = Selection.Offset(0, 1) ' 부서번호셀값
If join = "관리부" Then
Selection.EntireRow.Delete
co = co - 1
deleteRow = deleteRow + 1
Else
Selection.Offset(1, 0).Select
End If
Next
End Sub
▼ 핵심 소스만 간략하게 설명하겠습니다. 특정 조건에 맞는 리스트를 삭제하기 위해 현재 추가된 전체 행 개수를 알아야 합니다. CurrentRegion 는 좌측 최상단에서 연속된 셀의 데이터 전체를 가져옵니다. CurrentRegion 를 이용해 행의 개수를 알아옵니다. 속성값은 Row count 입니다. 이 값으로 For 문을 돌립니다.
co = ActiveSheet.Range("B3").CurrentRegion.Rows.Count
다음은 검색할 데이터 시작 지점을 지정해야 합니다.
Cells(3, "B").Select
위에서 선택된 영역을 가져와 Offset 을 이용해 소속 셀의 값을 알아 옵니다.
join = Selection.Offset(0, 0) ' 소속셀값
삭제할 셀의 비교 값으로 동일한지 여부를 판단하고 Selection.EntireRow.Delete 로 행 전체를 삭제합니다.
If join = "관리부" Then
Selection.EntireRow.Delete
co = co - 1
▼ 함수의 소스 작성이 끝났다면 매크로를 돌려 데이터를 삭제해 보겠습니다. 매크로 창에서 실행할 이름을 선택하고 오른쪽에 실행 버튼을 클릭합니다.
▼ 매크로 실행 결과는 다음과 같습니다. “관리부” 데이터가 모두 삭제되었습니다.
※ 아래는 참고하면 좋을 만한 글들의 링크를 모아둔 것입니다. ※ ▶ 엑셀 VBA 다른 셀에 일치하는 코드 값에 데이터 찾아 추가하기 ▶ 엑셀 VBA 마지막 행과 열의 수 찾기 ▶ 엑셀 VBA 시트에서 데이터 셀 영역 구하기 ▶ 엑셀 VBA – 매크로 이용해서 특정 조건의 데이터를 삭제하고 싶을 때 ▶ 엑셀 VBA 입력된 값 형식 확인 Information 관련 함수 모음 |
댓글을 달아 주세요
사하라 2016.05.13 16:31 댓글주소 수정/삭제 댓글쓰기
co = co - 1 대신 i = i + 1 써도 되는지요? 이런 방법이 좀 더 익숙해서 질문 드립니다.
i 는 for 문에서 자동 증가하는 값입니다. i + 1 을 하지 않아도 값은 한번 돌 때마다 늘어납니다. 소스는 정답이 없습니다. 자신만의 스타일이 있기 때문에 결과만 제대로 나온다면 상관없습니다.
안녕하세요 2018.12.25 23:51 댓글주소 수정/삭제 댓글쓰기
삭제되는 단어리스트를 "경리부" + 여러개를 같이 해주려고 합니다. 이럴 경우
Cells(2, "A").Select
For i = 0 To co
join = Selection.Offset(0, 0) '소속셀값
buNum = Selection.Offset(0, 1) '부서번호셀값
For n = 0 To 5
If join = Worksheets(2).Cells(n, 1).Value Then
Selection.EntireRow.Delete
co = co - 1
deleteRow = deleteRow + 1
Else
Selection.Offset(1, 0).Select
End If
Next n
Next i
이렇게 짜봤는데 에러가 나더라구요. join = Worksheets(2).Cells(n, 1).Value Then 이줄이 문제가
되는데....
포문으로 시트2에 있는 A1~A5 까지의 단어리스트를 포함하는 행을 삭제해주려고 하는데
제 코드에서 어디가 문제가 됐는지 좀 알려주실 수 있으신가요?
join = Worksheets(2).Cells(n, 1).Value Then
에서 n 이 0 부터 시작하면 안됩니다. 셀 주소는 1, 1 부터입니다. for 문의 n = 0 을 1로 바꾸세요.
초보 2019.02.07 13:07 댓글주소 수정/삭제 댓글쓰기
감사합니다. 근데 deleteRow+1 은 어디에 쓰이는 건가요. 이 코드에서 쓰임새를 못 찾겠네요ㅜㅜ
초보2 2020.05.25 10:37 댓글주소 수정/삭제 댓글쓰기
예제 그대로 해보고있는데
join = Selection.Offset(0,0)'소속셀값
이줄이 메서드 오류라고 뜨는데 왜그러는걸까요 ? ㅠ
중단모드에서는 코드를 실행할 수 없다고 뜨네요
임우준 2020.08.02 18:52 댓글주소 수정/삭제 댓글쓰기
Option Explicit
Sub Crawling()
Dim co As Long, i As Long
Dim join As String
Dim deleteRow As Integer
'추가할 시트에 Row count 를 알아옵니다.
co = ActiveSheet.Range("A1").CurrentRegion.Rows.Count
Cells(3, "A").Select
For i = 0 To co
join = Selection.Offset(0, 0) ' 소속셀값
buNum = Selection.Offset(0, 1) ' 부서번호셀값
If join = "언니들의즐거운쇼핑타임" Then
Selection.EntireRow.Delete
co = co - 1
deleteRow = deleteRow + 1
Else
Selection.Offset(1, 0).Select
End If
Next
End Sub
여기서 buNum = Selection.Offset(0, 1) ' 부서번호셀값에서 오류가 뜨는데 어떻하나요?
익명 2020.08.02 18:55 댓글주소 수정/삭제 댓글쓰기
비밀댓글입니다
Selection.Offset(0, 1) 의 결과값을 콘솔에 찍어 보셨나요? null 인가요?
익명 2020.08.04 17:34 댓글주소 수정/삭제 댓글쓰기
비밀댓글입니다
광광 2020.11.16 13:30 댓글주소 수정/삭제 댓글쓰기
안녕하세요
혹시 응용해서 써보려고 하는데
예를들어 관리부의 첫번째줄 1개 데이터 셀만 삭제하려면 어떤수식으로 수정하면 될까요?
첫 번째 삭제하고 바로 For 문을 빠져 나오는 것입니다. For 문 빠져나오는 소스는 Exit for 입니다.
초보의연습 2021.03.09 12:25 댓글주소 수정/삭제 댓글쓰기
안녕하세요. 매크로 초보입니다.
응용해서 써보는데 삭제 잘되고 좋습니다.
혹시 지운것을 다시 되돌릴 수 있는 방법이 있을 까요? (취소나 매크로 버튼 등?)
네 도움이 되었다니 다행입니다. 감사합니다.
삭제한 것을 다시 되돌릴 수 있는 수식이 있을까요?
OnUndo 라는 함수를 이용해 보시기 바랍니다.
매크로초짜 2021.05.27 14:01 댓글주소 수정/삭제 댓글쓰기
혹시 "관리부" 같이 정확히 나오는 단어말고
특정단어를 포함한셀을 지정하고 싶다면 어떻게해야할까지?
ex)
전표번호 : 20210527-182
-> "전표번호"라는 단어를 포함하고 있는 셀을 삭제하고싶습니다.
InStr() 함수를 사용해서 위치값을 리턴 받습니다. 0 이면 포함되어 있지 않은 문자로 판단합니다.
너른벌동쪽끝 2021.10.25 06:12 댓글주소 수정/삭제 댓글쓰기
녹두장군님! 정말 좋은 코드 감사합니다.
혹시 '관리부'만 남기고 나머지는 다 삭제하고 싶다면 어떻게 해야 할지 여쭤봐도 될까요?
매크로를 실행할 때 이 '관리부'에 해당하는 텍스트를 텍스트박스에 입력받아서 실행하게 하고 싶은데 그렇게 하지 않고 바로 소스에서 바꿔 실행하는것만 되어도 정말 엄청 감사하겠습니다 ㅠㅠ!!