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

 조삿갓 (choga21)

추천:  2
파일:     조회:  2007
제목:   [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