Private Sub Worksheet_Change(ByVal Target As Range)
'Change는 선택한 셀이 변경되면 작동

Application.ScreenUpdating = False '화면의 업데이트 끔. 속도를 빠르게 해줌
Application.EnableEvents = False '이벤트가 동작하는 것을 끔.

If Not Intersect(Target, Range("E2")) Is Nothing Then
ClearRange
FilterItems
End If

Application.ScreenUpdating = True '다시 화면을 켜줌
Application.EnableEvents = True '이벤트 다시 활성화

'이벤트 마스터코드를 넣지 않으면 루한루프에 빠져 오류발생
'E2셀이 바뀔때만 특정 매크로 작동
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'SelectionChange는 셀을 클릭하면 바로 작동

End Sub

 

'-----------------------------------------
'미션1) 나만의 Sequence 매크로 만들기
'Column로 시작열을 지정하고, Count로 순번 개수를 지정하면
'시작열의 1행부터 순번을 출력하는 매크로를 작성합니다.
'예상풀이시간 : 3분
'-----------------------------------------
Sub SequenceNumber()

Dim Column As String '시작열 @ 예) "A", "B", "C", ...
Dim Count As Long '출력할 순번 개수 @ 예) 5, 10,15 ...
Dim i As Long ' For문 변수

'힌트1) Column = "A"
'힌트2) Count = 10

'힌트3) For i = 1 To Count
'힌트4) Range(Column & i).Value

End Sub

'-----------------------------------------
'미션2) 나만의 Sequence 매크로를 동적으로 만들기
'InitCell로 시작셀을 지정하고, Count로 출력할 순번 개수를 지정하면
'InitCell을 기준으로 한칸씩 내려가며 순번을 출력하는 매크로를 작성합니다.
'예상풀이시간 : 5분
'-----------------------------------------
Sub DynamicSequence()

Dim InitCell As Range '시작셀 @ 예) Range("A1")
Dim Count As Long '출력할 순번 개수 @ 예) 5, 10 15 ..
Dim i As Long 'For문 변수

'힌트1) Set InitCell = Range("A1")
'힌트2) Count = 10

 

'힌트3) For i = 1 To Count
'힌트4) InitCell.Offset(i-1).Value

End Sub

'-----------------------------------------
'미션3) 나만의 TextJoin 함수 만들기
'문자를 병합할 범위를 Rng로 입력하고, 구분자를 지정하면
'Rng의 각 셀을 돌아가며 구분자로 병합하는 함수를 작성합니다.
'예상풀이시간 : 7분
'-----------------------------------------
Function MyTextJoin(Rng As Range, _
Optional Delimiter As String = ",")
'@ 인수 설명
'Rng : 값을 병합할 범위입니다.
'Delimiter : [선택인수] 구분자입니다. 기본값은 쉼표(,)입니다.

Dim r As Range 'For Each문 변수
Dim Result As String '결과로 출력할 문자열

'힌트1) For Each r In Rng
'힌트2) If r.Value <> "" Then
'힌트3) Result = Result & r.Value & Delimiter
For Each r In Rng
If r.Value <> "" Then
Result = Result & r.Value & Delimiter
End If
Next

'힌트4) MyTextJoin = Left(○○○, Len(○○○) - 1)
MyTextJoin = Left(Result, Len(Result) - 1)

End Function

Sub ClearRange()
DynamicRange(Sheet1, "G", 2).ClearContents
DynamicRange(Sheet1, "H", 2).ClearContents

Dim i As Long

i = Sheet1.Range("G" & "1048576").End(xlUp).Row

If i > 1 Then
Sheet1.Range("G2:H" & i).ClearContents
End If

End Sub

Function DynamicRange(Ws As Worksheet, Column As String, InitRow As Long) As Range

Dim i As Long
Dim Address As String
'변수에 대한 선언
i = Ws.Range(Column & "1048576").End(xlUp).Row
'i는 워크시트의 범위인데, C열 맨 밑의 행에서 내용이 있는 셀로 이동한 후 그 행 번호를 반환한다.

Address = Column & InitRow & ":" & Column & i
'Address는 C2셀:C & C열 맨밑의 행에서 내용이 있는 셀로 이동한 행 번호

Set DynamicRange = Ws.Range(Address)

End Function

Sub test()
MsgBox DynamicRange(Sheet1, "c", 2).Address
End Sub

Sub FilterItems()

'GroupRng(구분)의 조건을 비교해서, 구분에 해당하는 제품과 가격을 표시

Dim GroupRng As Range ' 필터링 할 구분 범위 (동적으로 설정!)
Dim r As Range ' GroupRng를 For Each로 하나씩 참조할 셀
Dim FilterVal As String ' 비교할 조건
Dim i As Long ' r의 값이 조건과 같을 경우, 1씩 증가할 정수

Set GroupRng = DynamicRange(Sheet1, "A", 2)
FilterVal = Sheet1.Range("E2").Value

i = 2
For Each r In GroupRng
If r.Value = FilterVal Then
Sheet1.Range("G" & i).Value = r.Offset(0, 1).Value
Sheet1.Range("H" & i).Value = r.Offset(0, 2).Value
i = i + 1 '만약 if문의 바깥으로 빠진다면, 수식에 문제가 됨(조건과 일치할때만 1을 더해야 함)
End If
Next

End Sub

Sub UniqueList()

Dim Rng As Range '고유값을 추출할 범위
Dim r As Range 'Rng 를 For Each로 하나씩 참조할 셀
Dim Items As Collection '고유값을 추가할 Collection
Dim item As Variant 'Collection을 For Each로 하나씩 참조할 값
Dim itemList As String '고유값을 나열한 목록

End Sub