Notice
Recent Posts
Recent Comments
Link
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Tags
more
Archives
Today
Total
관리 메뉴

kang's study

[VBA] Challenges_03_Doit 본문

[EXCEL]/[진짜쓰는 실무엑셀]

[VBA] Challenges_03_Doit

보끔밥0302 2024. 11. 6. 10:50

Sheet1(품목검색)

 

TEXTJOIN함수 만들기

함수 설명: 문자를 병합할 범위를 Rng로 입력받아, 구분자를 지정하면 Rng의 각 셀을 돌아가며 구분자로 병합한다.

 

@ 인수 설명
Rng : 값을 병합할 범위입니다.
Delimiter : [선택인수] 구분자입니다. 기본값은 쉼표(,)입니다.

 

선택 인수 optional

단, optional는 인수의 마지막 부분에만 위치할 수 있습니다. 

Function MyTextJoin(Rng As Range, _
                    Optional Delimiter As String = ",")

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

End Function

 

Hint1) For Each r In Rng
Hint2) If r.Value <> ""Then
Hint3) 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)

 

최종

Function MyTextJoin(Rng As Range, _
                                Optional Delimiter As String = ",")

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

For Each r In Rng
    If r.Value <> "" Then
        Result = Result & r.Value & Delimiter
    End If
Next

MyTextJoin = Left(Result, Len(Result) - 1)

End Function

 

동적 범위를 받아오는 VBA

마지막 셀 이동: ctrl + 방향키

- 위에서 아래로: 중간 빈 데이터에 걸림

- 아래에서 위로: 보다 정확 -> 선택

 

구성하기

Sub DynamicRange()

Dim WS As Worksheet
Dim Column As String
Dim i As Long
Dim Address As String
Dim InitRow As Long
I
Set WS = Sheet1
'Set WS= ThisWorkbook.Worksheets("품목검색")
Column = "C"
i= WS.Range(Column & "1048576").End(xlUp).Row
InitRow = 2

Address = Column & InitRow & ":" & Column & i

MsgBox Address

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

If i < InitRow Then i = InitRow
	Address = Column & InitRow & ":" & Column & i

Set DynamicRange = WS.Range(Address)

End Function

 

마지막 반환 시 개체 변수(범위)이므로 Set으로 할당하는 것을 주의

 

자동 필터 VBA

- Range.Offset(행이동, 열이동): Range에서 행, 열 개수만큼 이동한 셀을 반환

 

구성화

Sub Filterltems()

'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 = SheetT.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
End If
Next

End Sub

 

시트 이벤트 매크로

- 이벤트 매크로: SelectionChage(셀을 클릭할 때 반응) VS Change (셀이 변경되었을 때 반응)

- Sheet1(품목검색) > (선언)을 Worksheet

 

이벤트 명령어 주의사항

값이 바뀌면 무한 루프에 빠짐

-> 마스터 코드 

Application.ScreenUpdating = False '속도
Application.EnableEvents = False '이벤트 끄기(필수)

If Not Intersect(Target, Range("셀주소")) Is Nothing Then
'실행할 명령문
End If

Application.ScreenUpdating = True
Application.EnableEvents = True

 

실시간 데이터 필터링 (시트 이벤트)

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False '속도
Application.EnableEvents = False '이벤트 끄기(필수)

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

Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

 

오류 수정 (필터링 범위 초기화)

Sub ClearRange()

Dim i As Long

i = Sheet1.Range("G1048576").End(xlUp).Row

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

End Sub

 

시트 이벤트 최종

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False '속도
Application.EnableEvents = False '이벤트 끄기(필수)

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

Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

 

'[EXCEL] > [진짜쓰는 실무엑셀]' 카테고리의 다른 글

[VBA] Challenges_04_Final  (1) 2024.11.06
[VBA] Challenges_02_Key_syntax  (0) 2024.11.06
[VBA] Challenges_01_Basic  (4) 2024.11.06
8주차 학습정리 ( The end)  (0) 2022.04.23
7주차 학습정리  (0) 2022.04.17
Comments