|
- 엑셀 버전(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
|
|