나눔터  
  HOME > 나눔터 > 묻고답하기 > 엑셀
엑셀
엑셀에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내

작성자:  

 루아흐뉴마 (ruahneuma)

추천:  2
파일:     조회:  2222
제목:   UsedRange가 아닌 UsingRange 참조
     
  - 엑셀 버전(95,97,2000,xp,2003,2007): 2013


#1 UsedRange를 활용하여 동적인 범위를 추출할 때 거품이 끼는 이유

   일단 UsedRange는 말 그대로 사용한 셀을 모두 참조합니다.
   셀에 값이 들어있지 않더라도 서식이 들어 있거나(셀 배경 색깔 같은)
   심지어는 어떤 값도 넣지 않고 셀서식을 "일반"에서 "통화"로 바꾸기만
   해도 UsedRange로 인식해버립니다.
   이외에도 셀 값을 삭제하였으나 워크북을 저장하지 않은 경우에도
   변경 전의 데이터를 인식하여 UsedRange로 인식합니다.

#2 동적으로 UsingRange 참조
   UsedRange가 아닌 어떤 값이 들어 있는 영역을 참조하기 위해서 다음과
   같은 코드를 사용합니다.

Sub usingRng()

Dim firstRow As Long
Dim firstCol As Long
Dim lastRow As Long
Dim lastCol As Long


firstRow = Cells.Find(what:="*", searchorder:=xlByRows, searchdirection:=xlNext).Row
firstCol = Cells.Find(what:="*", searchorder:=xlByColumns, searchdirection:=xlNext).Column

lastRow = Cells.Find(what:="*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
lastCol = Cells.Find(what:="*", searchorder:=xlByColumns, searchdirection:=xlPrevious).Column

Range(Cells(firstRow, firstCol), Cells(lastRow, lastCol)).Select

End Sub


언뜻 보기에도 상당히 번거로운 코드입니다.
firstRow와 firstCol이 정해져 있다면,
예컨대 "A1" 셀로 이미 한정되어 있다면
코드를 2줄 정도로 줄일 수 있겠습니다만,

그럼에도 불구하고
UsedRange의 범용성을 따라가기엔 무리가 있어 보입니다.
 
[불량 게시물 신고]  
조삿갓감사합니다. 제가 작년 11월달에 질문한 건데 잊지 않고 답변해 주시네요. 거기에 답변을 다셨다면 아마 저도 못보았을텐데... 이렇게 따로 답변주셔서 감사합니다.

번거롭기는 하지만 상당히 유용할 것 같습니다.
범용성 문제는 속성으로 쓸 수는 없지만
어차피 경계선의 좌표 값을 알아내는 것이 주 목적일 것이므로
해당 변수( firstRow 등)들을 ByRef 파라메터로 선언하고
함수 반환값을 Range형으로 받아서 쓰면 될 것 같고요.

Find 메소드도 처음 접해보는데 이 자체로도 상당히 유용해보입니다. 사실은 Seacrh 함수를 만들어 쓰고 있었는데... 간단히 대체가 가능할 것도 같아요.

아무튼 좋은 정보 감사합니다. 덕택에 많이 배웠습니다.
03-06 (16:18)
삭제 ■신고
조삿갓Function UsingRange(Optional ByRef firstRow As Long, Optional ByRef firstCol As Long, Optional ByRef lastRow As Long, Optional ByRef lastCol As Long) As Range

  firstRow = ... ' 4개 파라메터 계산루틴 동일

 Set UsingRange = Range(Cells(firstRow, firstCol), Cells(lastRow, lastCol))

End Function

테스트 해 보니 아주 잘 됩니다.

UsingRange.Select

처럼 사용해도 잘 먹히고요. ^^
03-06 (16:30)
삭제 ■신고
루아흐뉴마저도 고민했던 문제였습니다. ^^ 
질문글 보고서 궁금증이 돋아 여기저기 찾아봤네요. 
해외에서도 이 문제를 가지도 이리저리 궁리한 글들이 보이던데 상기 방법 외에는 딱히 묘수가 없는듯 합니다.

친절하게 사용자정의 함수도 만들어주시고, 대단히 감사합니다.
03-06 (20:24)
삭제 ■신고
        
  

작성일 : 2018-03-06(00:19)
최종수정일 : 2018-03-06(00:19)