For Each 구문은 비슷한 객체(collection)들을 순회하며 작업을 수행하는 데 유용합니다. 이 글에서는 For Each loop 구문의 기초부터 실제 코드 예제까지, 다양한 VBA 코드 활용법을 살펴보겠습니다.
VBA For Each 구문이란?
**For Each** 구문은 Excel VBA에서 컬렉션(Collection) 내의 모든 항목을 순회하는 반복문입니다. 예를 들어, 모든 워크시트(Worksheets), 셀(Ranges), 도형(Shapes), 차트(Charts) 등을 반복하며 특정 작업을 수행할 수 있습니다.
For Each 구문은 일반적인 For Next 반복문과 달리, 컬렉션 내에 포함된 항목의 개수를 사전에 알 필요 없이 사용할 수 있어 매우 유연합니다.
VBA For Each 구문의 기본 사용법
For Each 구문을 간단한 예제 코드로 살펴보겠습니다.
```vba
Sub Protect_All_Sheets()
Dim Sh As Worksheet
For Each Sh In ThisWorkbook.Worksheets
Sh.Protect Password:="test", AllowFormattingCells:=True
Next Sh
End Sub
```
이 코드는 먼저 sh라는 변수를 worksheet으로 선언
이 코드는 현재 작업 중인 Excel 워크북의 각각의 시트를 보호모드로 바꾸고, 비밀번호를 설정합니다. 사용자가 셀 서식을 변경할 수 있도록 허용합니다. For Each 코드는 워크북 내 모든 시트를 자동으로 순회하며 `Protect` 메서드를 적용합니다.
![](https://blog.kakaocdn.net/dn/qzGQv/btsI1vhrkiP/A6WhdaLLOlQl3mdTYki5vK/img.png)
![](https://blog.kakaocdn.net/dn/be3cvD/btsI1oiv9PN/XtkeldoLBmIEPyWQQQNH7k/img.png)
참고로 말씀드리면, vba코드를 잠그는 방법도있습니다. 만약 누군가가, 보호를 풀기위해서, vba 코드를 보려고 할수도있으니까요.
도구 - VBA 프로젝트 속성 - 보호탭 - 읽기전용으로 프로젝트 잠금 - 패스워드설정
![](https://blog.kakaocdn.net/dn/kw1Rn/btsI0ftCbKY/91TiS6VbrlK1q1cxXMFSQ0/img.png)
셀 범위에 For Each 구문 적용하기
셀 범위 내의 각 셀에 동일한 작업을 적용하고 싶을 때도 **For Each** 구문이 유용합니다. 예를 들어, A1에서 A10까지의 셀에 값을 입력하는 코드는 다음과 같습니다.
```vba
Sub Loop_Through_Cells()
Dim Cell As Range
For Each Cell In Range("A1:A10")
Cell.Value = "Looped"
Next Cell
End Sub
```
이 코드는 A1부터 A10까지의 각 셀에 "Looped"라는 텍스트를 입력합니다.
다른 객체 컬렉션에 For Each 구문 적용하기
For Each 구문은 셀과 워크시트 외에도 Excel의 다른 객체들에도 적용할 수 있습니다. 예를 들어, 현재 시트에 있는 모든 도형의 색상을 변경하거나 차트 제목을 업데이트할 수 있습니다.
- 도형의 색상 변경하기:
```vba
Sub Loop_Through_Shapes()
Dim Shp As Shape
For Each Shp In ActiveSheet.Shapes
Shp.Fill.ForeColor.RGB = RGB(255, 0, 0)
Next Shp
End Sub
```
- 차트 제목 업데이트하기:
```vba
Sub Loop_Through_Charts()
Dim Ch As ChartObject
For Each Ch In ActiveSheet.ChartObjects
Ch.Chart.ChartTitle.Text = "Updated Title"
Next Ch
End Sub
```
FOR EACH 와 IF THEN
위의 두 방식을 조합하면, 반복문 내에서 더욱 정교한 논리 처리가 가능해집니다. 다양한 상황에 적용할 수 있는 몇 가지 예시 코드를 소개합니다. 조건부 서식과 비슷한 코드가 되겠습니다.
아래에서 이러한 코드들의 예시를 보세요.
예제 1: 특정 조건에 따라 셀 서식 변경하기
이 코드는 범위 내의 셀을 순회하며, 셀 값이 50보다 큰 경우 해당 셀의 배경색을 노란색으로 변경합니다.
```vba
Sub Highlight_Cells_Above_50()
Dim Cell As Range
For Each Cell In Range("A1:A10")
If Cell.Value > 50 Then
Cell.Interior.Color = RGB(255, 255, 0) ' 노란색
End If
Next Cell
End Sub
```
예제 2: 특정 텍스트를 포함한 셀 찾기
이 코드는 지정된 범위에서 특정 단어(예: "Critical")가 포함된 셀을 찾아 해당 셀의 텍스트를 굵게 표시합니다.
```vba
Sub Bold_Critical_Text()
Dim Cell As Range
For Each Cell In Range("B1:B20")
If InStr(Cell.Value, "Critical") > 0 Then
Cell.Font.Bold = True
End If
Next Cell
End Sub
```
예제 3: 특정 시트만 보호하기
이 코드는 현재 워크북 내의 모든 시트를 순회하며, 시트 이름에 "Report"가 포함된 경우에만 시트를 보호합니다.
```vba
Sub Protect_Report_Sheets()
Dim Sh As Worksheet
For Each Sh In ThisWorkbook.Worksheets
If InStr(Sh.Name, "Report") > 0 Then
Sh.Protect Password:="mypassword"
End If
Next Sh
End Sub
```
예제 4: 특정 조건에 따라 도형의 크기 조정하기
이 코드는 현재 시트에 있는 모든 도형을 순회하며, 도형의 이름에 "Button"이 포함된 경우 해당 도형의 크기를 150%로 확대합니다.
```vba
Sub Resize_Buttons()
Dim Shp As Shape
For Each Shp In ActiveSheet.Shapes
If InStr(Shp.Name, "Button") > 0 Then
Shp.Width = Shp.Width * 1.5
Shp.Height = Shp.Height * 1.5
End If
Next Shp
End Sub
```
예제 5: 조건에 따라 차트의 제목 업데이트하기
이 코드는 현재 시트에 있는 모든 차트를 순회하며, 차트 제목에 "Sales"가 포함된 경우 해당 제목을 "Updated Sales Data"로 변경합니다.
```vba
Sub Update_Sales_Charts()
Dim Ch As ChartObject
For Each Ch In ActiveSheet.ChartObjects
If InStr(Ch.Chart.ChartTitle.Text, "Sales") > 0 Then
Ch.Chart.ChartTitle.Text = "Updated Sales Data"
End If
Next Ch
End Sub
```
예제 6: 빈 셀 찾기 및 메시지 표시
이 코드는 범위 내의 셀을 순회하며, 빈 셀을 찾으면 메시지 박스를 표시하고, 그렇지 않으면 아무 작업도 하지 않습니다.
```vba
Sub Find_Empty_Cells()
Dim Cell As Range
For Each Cell In Range("C1:C10")
If Cell.Value = "" Then
MsgBox "빈 셀이 있습니다: " & Cell.Address
End If
Next Cell
End Sub
```
예제 7: 값이 특정 범위에 있는 셀 색상 변경
이 코드는 범위 내의 셀을 순회하며, 셀 값이 10에서 20 사이인 경우 셀의 배경색을 녹색으로 변경합니다.
```vba
Sub Highlight_Cells_In_Range()
Dim Cell As Range
For Each Cell In Range("D1:D10")
If Cell.Value >= 10 And Cell.Value <= 20 Then
Cell.Interior.Color = RGB(144, 238, 144) ' 연녹색
End If
Next Cell
End Sub
```
예제 8: 특정 파일 확장자를 가진 파일 찾기
이 코드는 지정된 폴더 내의 모든 파일을 순회하며, 파일 확장자가 ".xlsx"인 파일을 찾아 메시지 박스를 표시합니다.
```vba
Sub Find_Excel_Files()
Dim File As String
File = Dir("C:\YourFolder\*.*")
Do While File <> ""
If InStr(File, ".xlsx") > 0 Then
MsgBox "엑셀 파일 발견: " & File
End If
File = Dir
Loop
End Sub
```
결론
For Each 구문은 Excel VBA에서 반복 작업을 자동화하는 데 있어 필수적인 도구입니다. 이를 통해 반복적인 작업을 효율적으로 처리할 수 있으며, 코드 작성 과정에서 오류를 줄이고 유지보수를 용이하게 할 수 있습니다.
더 많은 예제와 VBA 관련 팁을 원한다면, [마이크로소프트 공식 문서]를 참조하세요.
For Each...Next statement (VBA)
Office VBA reference topic
learn.microsoft.com
'엑셀' 카테고리의 다른 글
Vba 사용자와 상호 교류, 메세지박스 (0) | 2024.08.12 |
---|---|
VBA의 데이터 타입과 변수 (0) | 2024.08.11 |
엑셀 vba with을 쓰는 여러가지 경우들 (0) | 2024.08.10 |
VBA 복사 붙여넣기 3가지 방법 (0) | 2024.07.30 |
엑셀 VBA에서 셀을 참조하는 10가지 방법 (0) | 2024.07.29 |
댓글