OfficeTutor.com
배움터 나눔터 교육센터 오튜장터
 통합검색  
  Home > 나눔터 > 엑셀 > 묻고답하기
엑셀
워드
액세스
파워포인트
아웃룩
프런트페이지
인포패스
원노트
비지오
쉐어포인트
포토드로우
퍼블리셔
오피스공통
MVP 안내
MVP 명예의 전당
MVP 카페

 

 

 

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

 조삿갓 (choga21)

추천:  0
파일:     조회:  631
제목:   [RE]메크로 재문의
     
  - 엑셀 버전(95,97,2000,xp,2003,2007): 2013

* 아래줄에 질문을 작성하세요 >>

매크로 함수 문의 드립니다.

1. 첫번째 1번행에서 "특정단어"를 찾아서 (ctrl + f 로)
2. 찾은 단어의 바로 아래의 셀부터 데이터가 입력된 끝 행까지 선택하는 함수를 만들고 싶습니다.(특정단어가 포함된 열만 선택)

[조건]
- a열은 모든 데이터가 들어있지만,
- 특정단어 밑에 있는 열은 중간중간 데이터가 없는 경우가 있어서
- a열의 데이터가 있는 행까지 강제로 선택하고 싶은 경우입니다
==============[소리새님 글에 대한 답변입니다]==============

우선, 함수(Function)나 프로시저(Sub)를 설계하려면
그 용도(목적)이 무엇인지,
어떤 조건(인수 = 파라메터)에서 실행할 것인지
고려해야 합니다.

1) 특정 단어를 찾는 선제행위를
   워크시트에서 직접 Ctrl+F를 눌러 실행할 것인지
   아니면 함수나 프로시저에 인수로 찾을 문자열을 전달할 것인지

2) 원하는 범위를 설정한 후에
   범위 자체를 반환 값으로 내 놓을 것인지 - 함수로 설계해야 함
   설정한 범위를 선택만 해 주면 되는 것인지 - Sub로 설계

다음에 이상 여러가지 상황에 따른 방법으로 구현해 보았으니 참고하시기 바랍니다.
주석을 자세히 달았으니 열공하시길... ^^

===========================

Sub SelRange()
' Ctrl+F로 직접 찾아 선택한 셀로부터
' 아래 쪽으로 더 이상 데이터가 없는 위치까지
' 범위를 선택하는 프로시저
    Dim r As Long
    Dim c As Long
    c = Selection.Column '현재 선택된 셀의 열번호 저장
    r = Cells(Rows.Count, 1).End(xlUp).Row
            'A 열의 마지막 행(맨 아래)의 셀로부터 출발하여
                              ' 위쪽 방향으로 처음 데이터를 만나는 곳의
                                        ' 행번호를 저장함
            ' 즉, A열의 맨 아래 데이터의 위치를 계산함
    Range(Selection, Cells(r, c)).Select
            ' 현재 선택된 셀과
                        ' 앞에서 저장한 행, 열의 셀까지를 대각선으로 하는 영역을
                                    ' 선택된 상태로 만듦
End Sub

Sub SelRange1(ByVal SearchStr As String, Optional ByVal RowNum As Long = 0)
' SearchStr 인수로 전달받은 문자열을 RowNum 인수로 지정한 열에서 찾아서
' 최초로 찾은 셀로부터
' 아래 쪽으로 더 이상 데이터가 없는 위치까지
' 범위를 선택하는 프로시저
    Dim c As Long
    Dim maxr As Long
    
    maxr = Rows.Count ' 워크시트의 최대 행(맨 아래 행) 번호
    If RowNum = 0 Then RowNum = Selection.Row
                 ' RowNum의 지정을 생략한 경우 현재 선택된 셀의 행을 대상으로 함
    
 ' == 지정한 행에서 지정한 문자열을 찾음
    c = Cells.Find(What:=SearchStr, After:=Cells(RowNum, 1), LookIn:=xlFormulas, LookAt:=xlPart _
            , SearchOrder:=xlByRows, SearchDirection:=xlNext).Column
 
 ' == 이하 루틴은 위 SelRange 프로시저와 같음 ==========
    r = Cells(maxr, 1).End(xlUp).Row
    Range(Cells(RowNum, c), Cells(r, c)).Select
    
End Sub

Function SetRange(ByVal SearchStr As String, Optional ByVal RowNum As Long = 0) As Range
' SelRange1과 같은 조건으로 설정한 범위에 대해
' 범위 자체를 반환하는 함수
    Dim c As Long
    Dim maxr As Long
    
    maxr = Rows.Count
    If RowNum = 0 Then RowNum = Selection.Row
    c = Cells.Find(What:=SearchStr, After:=Cells(RowNum, 1), LookIn:=xlFormulas, LookAt:=xlPart _
            , SearchOrder:=xlByRows, SearchDirection:=xlNext).Column
    r = Cells(maxr, 1).End(xlUp).Row
    Set SetRange = Range(Cells(RowNum, c), Cells(r, c))
            ' 설정한 범위를 선택(Select)하는 대신 Set 명령으로 함수 반환값에 할당해 줌
            ' 이렇게 할 경우 호출한 쪽에서 SetRange("배송요청메모", 1).Select 또는
            ' SetRange("배송요청메모", 1).Copy 등으로 응용 가능함
End Function

' === 질문자가 댓글로 제시한 내용: 오류 원인 설명 =====

Sub SelError()
    Cells.Find(What:="배송요청메모", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
         xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
         , MatchByte:=False, SearchFormat:=False).Activate
            ' 현재 선택된 셀로부터 오른쪽 방향으로 문자열을 검색해서 찾은 셀 선택
    ActiveCell.Offset(1, 0).Activate
        ' 선택된 셀의 바로 아래 셀 선택
    k = Range("A65536").End(xlUp).Row
        ' A열의 데이터 끝 위치 찾음 - 오류는 없으나
        ' 기준 셀을 "A65536"로 지정할 경우 엑셀 버전에 따라서 오류가 날 수 있음
        ' Cells(Rows.Count, 1)이 안전한 방법임
        ' Rows.Count: 현재 버전의 워크시트에서 최대 허용 행 수를 반환함
    If k > 2 Then
'        Range(Cells(2, Column()), Cells(k, Column())).Select
            ' 이 명령은 오류임 - Column()은 워크시트에서 사용하는 함수이고
            ' VB는 이런 함수를 모름
            ' 다음과 같이 수정해야 함
        Range(ActiveCell, Cells(k, ActiveCell.Column)).Select
                ' 현재 선택된 셀과
                            ' 동일한 열에서 k행의 셀을 대각선으로 하는 영역을 선택
        Selection.Copy
    Else
        Selection.Copy
    End If
End Sub
 
[불량 게시물 신고]  
        
  

작성일 : 2018-03-13(13:57)
최종수정일 : 2018-03-13(13:57)
 


 ◎ 관련글

  제 목   작성자   날짜
메크로 재문의 소리새 2018-03-13
[RE]메크로 재문의 조삿갓 2018-03-13

 
 
회사소개 | 이용약관 | 개인정보 처리방침 | 회원정보수정 | 교육신청 및 문의 | 이메일무단수집거부 위로

오피스튜터 블로그 오피스튜터페이스북 오피스튜터유투브
110-722 서울 종로구 세종대로23길 47, 601-74 ㈜오피스튜터 ☎1544-4102 대표이사 : 전경수
개인정보관리책임자 : 이희진(privacy@officetutor.com) 사업자등록번호 120-86-14501
통신판매업신고 2013-서울종로-0547
norton
Copyright ⓒ OfficeTutor.com 이 페이지의 저작권은 ㈜오피스튜터와 콘텐츠 제공자에게 있습니다. 무단 복제를 금합니다.
Microsoft 및 Office 로고는 미국, 대한민국 및/또는 기타 국가에서의 Microsoft Corporation 등록 상표 또는 상표입니다.