이 글은 도움말을 번역한 내용입니다.
개체 및 컬렉션
개체는 워크시트, 셀, 차트, 양식 또는 보고서와 같은 응용 프로그램의 요소를 나타냅니다. Visual Basic 코드에서 개체의 메서드 중 하나를 적용하거나 해당 속성 중 하나의 값을 변경하려면 먼저 개체를 식별해야 합니다 .
개체를 식별한다는 말의 뜻을 알고 싶어서 ChatGPT에게 질문하고 답변받은 내용입니다.
Sub ManipulateWorksheet()
' 워크시트 개체를 식별하여 변수에 할당
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 워크시트의 속성 변경
ws.Name = "MyWorksheet" ' 워크시트 이름 변경
' 워크시트에 새로운 셀 값 입력
ws.Range("A1").value = "Hello, World!"
' 워크시트에 차트 추가
Dim cht As Chart
Set cht = ws.Shapes.AddChart.Chart
cht.ChartType = xlColumnClustered
cht.SetSourceData Source:=ws.Range("A1:B5")
' 워크시트의 셀 서식 변경
ws.Range("A1").Font.Bold = True
ws.Range("A1").Font.Color = RGB(255, 0, 0)
ws.Range("A1").Interior.Color = RGB(200, 200, 200)
End Sub
컬렉션(Collection)은 일반적으로 동일한 유형의 여러 개체를 포함하는 객체입니다. 하지만 항상 그렇지는 않습니다. 예를 들어 Microsoft Excel에서 Workbooks 객체는 열려 있는 모든 Workbook 객체를 포함하고 있습니다. Visual Basic에서 Forms 컬렉션은 애플리케이션 내의 모든 Form 객체들을 포함합니다.
엑셀로 몇가지 예를 들면 다음과 같은 컬렉션이 있습니다.
Workbooks,Worksheets,Sheets,Shapes,Ranges
컬렉션의 항목은 번호 또는 이름으로 식별할 수 있습니다.
Sub CollectionExample()
Dim ws As Worksheet
Dim rng As Range
Dim wb As Workbook
Dim colIndex As Long
Dim wsName As String
' 엑셀 워크북에서 첫 번째 워크시트를 가져옵니다.
Set ws = ThisWorkbook.Worksheets(1)
' 워크시트의 이름으로도 가져올 수 있습니다.
wsName = "Sheet1"
Set ws = ThisWorkbook.Worksheets(wsName)
' 워크시트에서 셀 A1을 가져옵니다.
Set rng = ws.Range("A1")
' Range의 열 인스를 사용하여 셀을 가져올 수 있습니다.
colIndex = 1
Set rng = ws.Cells(1, colIndex)
' Workbook 컬렉션에서 첫 번째 워크북을 가져옵니다.
Set wb = Application.Workbooks(1)
' 워크북의 이름으로 가져올 수 있습니다.
Dim wbName As String
wbName = "Book1"
Set wb = Application.Workbooks(wbName)
End Sub
다음 프로시저에서는 문자열로 지정된 이름을 사용하여 워크시트 개체를 식별합니다.
Sub IdentifyWorksheetByName()
Dim wsName As String
Dim ws As Worksheet
' 찾고자 하는 워크시트의 이름을 문자열 변수에 지정합니다.
wsName = "Sheet1"
' 문자열로 지정된 워크시트의 이름을 이용하여 해당 워크시트 객체를 식별합니다.
' 만약 해당 이름을 가진 워크시트가 없을 경우에는 오류가 발생할 수 있으므로
' 오류 처리에 유의해야 합니다. 이 예시에서는 오류 처리를 생략하였습니다.
Set ws = ThisWorkbook.Worksheets(wsName)
' 원하는 작업을 수행합니다. 예를 들어 해당 워크시트의 정보를 출력합니다.
MsgBox "찾은 워크시트 이름: " & ws.Name
End Sub
개체가 공통 메서드를 공유하는 경우 전체 개체 컬렉션을 조작할 수도 있습니다.
예를 들어, 다음 프로시저는 열려 있는 모든 폼을 닫습니다.
Sub CloseAll()
Forms.Close
End Sub
다음은 VBA에서 For each 문을 이용해 작업하는 예제입니다.
Sub CloseAllWorkbooks()
Dim wb As Workbook
' Application 객체의 Workbooks 컬렉션에서 모든 워크북을 순회하며 닫습니다.
For Each wb In Application.Workbooks
wb.Close SaveChanges:=False ' 저장하지 않고 워크북을 닫습니다.
Next wb
End Sub
Sub DeleteAllObjects()
Dim ws As Worksheet
Dim cht As ChartObject
' 모든 워크시트 개체 컬렉션을 순회하며 삭제합니다.
For Each ws In ThisWorkbook.Worksheets
ws.Delete ' 각 워크시트 개체를 삭제합니다.
Next ws
' 모든 차트 개체 컬렉션을 순회하며 삭제합니다.
For Each cht In ThisWorkbook.Sheets("Sheet1").ChartObjects
cht.Delete ' 각 차트 개체를 삭제합니다.
Next cht
End Sub
개체 반환
모든 애플리케이션에는 애플리케이션에 포함된 객체를 반환하는 방법이 있습니다. 그러나 모두 동일하지는 않으므로 애플리케이션에서 사용 중인 개체 또는 컬렉션에 대한 도움말 항목을 참조하여 개체를 반환하는 방법을 확인해야 합니다.
Font속성은 Font 개체를 반환합니다.
Sub ChangeFontStyle()
Dim myRange As Range
Set myRange = Range("A1:B5")
' Range 개체의 Font 속성을 사용하여 폰트 스타일 변경
myRange.Font.Name = "Arial"
myRange.Font.Size = 12
myRange.Font.Color = RGB(0, 0, 255) ' 파란색
myRange.Font.Bold = True
End Sub
Cells속성은 Range개체를 반환합니다.
Sub UpdateCellValues()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim targetRange As Range
Set targetRange = ws.Range("A1:C3")
Dim cell As Range
For Each cell In targetRange.Cells
' 각 셀의 값에 "Value"를 추가합니다.
cell.Value = cell.Value & " Value"
Next cell
End Sub
메서드
메서드는 개체가 수행할 수 있는 동작입니다.
메서드 예제 - 1
Sub RangeMethodsExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 원본 데이터가 있는 범위
Dim sourceRange As Range
Set sourceRange = ws.Range("A1:A5")
' 복사해서 붙여넣을 대상 범위
Dim targetRange As Range
Set targetRange = ws.Range("B1:B5")
' 원본 데이터를 복사하여 대상 범위에 붙여넣기
sourceRange.Copy
targetRange.PasteSpecial xlPasteValues ' 값만 붙여넣기
' 원본 데이터를 초기화하기 위해 원본 범위의 내용을 지우기
sourceRange.ClearContents
End Sub
메서드 예제 - 2
Sub AdvancedFilterExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 원본 데이터가 있는 범위
Dim sourceRange As Range
Set sourceRange = ws.Range("A1:E10")
' 고급 필터 조건 범위 (조건을 기록할 범위)
Dim criteriaRange As Range
Set criteriaRange = ws.Range("G1:H3")
' 결과를 출력할 범위
Dim resultRange As Range
Set resultRange = ws.Range("K1")
' 고급 필터 실행
sourceRange.AdvancedFilter Action:=xlFilterInPlace, criteriaRange:=criteriaRange, Unique:=False
' 필터링된 결과를 resultRange에 복사
sourceRange.SpecialCells(xlCellTypeVisible).Copy resultRange
' 필터 해제
ws.ShowAllData
End Sub
메서드 예제 - 3
Sub FindExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 원본 데이터가 있는 범위
Dim dataRange As Range
Set dataRange = ws.Range("A1:A10")
' 찾을 값을 지정
Dim searchValue As String
searchValue = "John"
' Find 메서드를 사용하여 값을 찾기
Dim foundCell As Range
Set foundCell = dataRange.Find(What:=searchValue, LookIn:=xlValues, LookAt:=xlWhole)
' 찾은 결과 출력
If Not foundCell Is Nothing Then
MsgBox "찾은 셀: " & foundCell.Address
Else
MsgBox "값을 찾지 못했습니다."
End If
End Sub
메서드 예제 - 4
Sub MergeExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 병합할 셀 범위 지정
Dim mergeRange As Range
Set mergeRange = ws.Range("A1:B2")
' 셀 병합
mergeRange.Merge
End Sub
메서드 예제 - 5
Sub PrintWorksheet()
' 현재 활성화된 워크시트 인쇄하기
ActiveSheet.PrintOut
' 현재 워크북의 모든 워크시트 인쇄하기
'ThisWorkbook.PrintOut
' 특정 시트를 인쇄
'Worksheets("시트명").PrintOut
' 페이지 지정하여 인쇄하기
'ActiveSheet.PrintOut From:=1, To:=2 ' 1페이지부터 2페이지까지 인쇄
End Sub
메서드 예제 - 6
Sub SortExample()
' Worksheet 변수를 선언하고 "Sheet1" 시트를 참조합니다.
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 정렬할 범위 지정
Dim sortRange As Range
Set sortRange = ws.Range("A1:F22")
'정렬 방식 설정 (예 : 오름차순)
Dim sortOrder As XlSortOrder
sortOrder = xlAscending
' 정렬 실행
sortRange.Sort Key1:=ws.Range("B1"), Order1:=sortOrder, Header:=xlYes
' 정렬 완료 메시지를 출력합니다.
MsgBox "데이터가 오름차순으로 정렬되었습니다."
End Sub
속성
속성은 크기, 색상 또는 화면 위치와 같은 개체의 특성 중 하나 또는 활성화 또는 표시 여부와 같은 동작의 측면을 정의하는 개체의 속성입니다. 개체의 특성을 변경하려면 해당 개체의 속성 값을 변경합니다.
속성 값을 설정하려면 마침표, 속성 이름, 등호(=) 및 새 속성 값이 있는 개체에 대한 참조를 따릅니다.
속성 예제 - 1
Sub GetCellAddressExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' C3 셀의 주소 가져오기
Dim cellAddress As String
cellAddress = ws.Range("C3").Address
' 가져온 주소를 메시지 상자로 표시
MsgBox "C3 셀의 주소: " & cellAddress
End Sub
속성 예제 - 2
Sub AddBordersExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' C4 셀에 테두리 추가 (전체 테두리)
ws.Range("C4").Borders.LineStyle = xlContinuous
ws.Range("C4").Borders.Weight = xlThin
' C4 셀의 테두리 색상 설정 (빨간색)
ws.Range("C4").Borders.Color = RGB(255
속성 예제 - 3
Sub GetCellColumnExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' E7 셀이 위치한 열 번호 가져오기
Dim cellColumn As Long
cellColumn = ws.Range("E7").Column
' 가져온 열 번호를 메시지 상자로 표시
MsgBox "E7 셀이 위치한 열 번호: " & cellColumn
End Sub
속성 예제 - 4
Sub GetFormulaExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' B2 셀의 수식 가져오기
Dim formulaText As String
formulaText = ws.Range("B2").Formula
' 가져온 수식을 메시지 상자로 표시
MsgBox "B2 셀의 수식: " & formulaText
End Sub
속성 예제 - 5
Sub ChangeFontExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' A2 셀의 폰트 크기를 변경
ws.Range("A2").Font.Size = 14
' A2 셀의 폰트 스타일을 변경 (굵게)
ws.Range("A2").Font.Bold = True
End Sub
속성 예제 - 6
Sub ChangeInteriorExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' B3 셀의 배경색을 노란색으로 변경
ws.Range("B3").Interior.Color = RGB(255, 255, 0)
' B3 셀의 배경 패턴을 변경 (선 없음)
ws.Range("B3").Interior.Pattern = xlNone
End Sub
속성 예제 - 7
Sub CheckMergeCellsExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' F10 셀이 병합된 셀인지 확인
Dim isMerged As Boolean
isMerged = ws.Range("F10").MergeCells
' 병합 여부를 메시지 상자로 표시
If isMerged Then
MsgBox "F10셀은 병합된 셀입니다."
Else
MsgBox "F10셀은 병합되지 않은 셀입니다."
End If
End Sub
속성 예제 - 8
Sub GetCellRowExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' D5 셀이 위치한 행 번호 가져오기
Dim cellRow As Long
cellRow = ws.Range("D5").Row
' 가져온 행 번호를 메시지 상자로 표시
MsgBox "D5 셀이 위치한 행 번호: " & cellRow
End Sub
속성 예제 - 9
Sub GetValueExample()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' A1 셀의 값 가져오기
Dim cellValue As String
cellValue = ws.Range("A1").value
' 가져온 값을 메시지 상자로 표시
MsgBox "A1 셀의 값: " & cellValue
End Sub
일부 속성은 설정할 수 없습니다. 각 속성에 대한 도움말 항목에는 해당 속성을 설정할 수 있는지(읽기-쓰기), 속성만 읽을 수 있는지(읽기 전용), 속성만 쓸 수 있는지(쓰기 전용)가 표시되어 있습니다.
Sub ReadWriteExample()
Dim ws As Worksheet
Dim rng As Range
' 워크시트에서 Range 개체를 가져옵니다.
Set ws = ThisWorkbook.Worksheets("Sheet1")
' A1 셀을 지정하는 Range 개체를 가져옵니다.
Set rng = ws.Range("A1")
' Range 개체의 Value 속성에 값을 설정합니다.
rng.value = "Hello, World!"
' Range 개체의 Value 속성으로 값을 읽어옵니다.
Dim cellValue As String
cellValue = rng.value
' 값을 출력합니다.
MsgBox "Cell A1 contains: " & cellValue
End Sub
Sub ReadOnlyExample()
Dim ws As Worksheet
Dim rng As Range
' 워크시트에서 Range 개체를 가져옵니다.
Set ws = ThisWorkbook.Worksheets("Sheet1")
' A1 셀을 지정하는 Range 개체를 가져옵니다.
Set rng = ws.Range("A1")
' Range 개체가 속한 행의 인덱스를 읽어옵니다. (읽기 전용)
Dim rowIndex As Long
rowIndex = rng.Row
' 행의 인덱스를 출력합니다.
MsgBox "The range is in row: " & rowIndex
End Sub
이벤트
이벤트는 마우스를 클릭하거나 키를 누르는 등 객체가 인식하는 동작으로, 이에 응답하는 코드를 작성할 수 있습니다. 이벤트는 사용자 작업이나 프로그램 코드의 결과로 발생할 수도 있고 시스템에 의해 트리거될 수도 있습니다.
이벤트 예제 - 1
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "You clicked on cell " & Target.Address
End Sub
이벤트 예제 - 2
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
MsgBox "Worksheet " & Sh.Name & " has been changed."
End Sub
이벤트 예제 - 3
Private Sub Workbook_Open()
MsgBox "Workbook has been opened!"
End Sub
이벤트 예제 - 4
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
MsgBox "Workbook is being saved!"
End Sub
이벤트 예제 - 5
Private Sub Workbook_BeforeClose(Cancel As Boolean)
MsgBox "Workbook is being closed!"
End Sub
이벤트 예제 - 6
Private Sub Workbook_NewSheet(ByVal Sh As Object)
MsgBox "New worksheet " & Sh.Name & " has been added!"
End Sub
이벤트 예제 - 7
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Me.Saved = False Then
MsgBox "Workbook has unsaved changes!"
End If
End Sub
이벤트 예제 - 8
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
' BeforeDoubleClick 이벤트 발생 시 실행되는 코드
' Target은 더블 클릭한 셀을 나타냅니다.
' Cancel 변수를 True로 설정하면 기본 이벤트 동작이 취소됩니다.
Dim clickedCellAddress As String
clickedCellAddress = Target.Address
MsgBox "You double-clicked on cell: " & clickedCellAddress
' 기본 이벤트 동작을 취소합니다.
Cancel = True
End Sub
이벤트 예제 - 9
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
' BeforeRightClick 이벤트 발생 시 실행되는 코드
' Target은 오른쪽 클릭한 셀을 나타냅니다.
' Cancel 변수를 True로 설정하면 기본 이벤트 동작이 취소됩니다.
Dim clickedCellAddress As String
clickedCellAddress = Target.Address
MsgBox "You right-clicked on cell: " & clickedCellAddress
' 기본 이벤트 동작을 취소합니다.
Cancel = True
End Sub
도움말 출처
Understanding objects, methods, properties, and events (VBA)
Office VBA reference topic
learn.microsoft.com