반응형

'Range.Validaiton.Add
'①xlDVType : 데이터유효성검사 형식입니다. xlValidateList
'②AlterStype : 오유메시지 형식입니다.(기본값은 중지(Stop)입니다. 선택인수)
'③Operator : 연산방식입니다.(목록에서는 사용하지 않습니다. 선택인수)
'④Formula1 : 데이터유효성검사로 작성할 수식 또는 목록입니다.
'⑤Formula2 : 연산방식이 포함 또는 포함하지 않음일 경우, 두번째로 작성하는 수식입니다.
'상세설명링크
'오류메시지 형식 : https://docs.microsoft.com/en-us/office/vba/api/excel.xldvalertstyle
'연산방식 : https://docs.microsoft.com/en-us/office/vba/api/excel.xlformatconditionoperator
'Validation Add 상세 설명 : https://docs.microsoft.com/en-us/office/vba/api/excel.validation.add

 

 

데이터 > 데이터 유효성 검사

 

 

반응형

'VBA' 카테고리의 다른 글

With  (0) 2024.12.31
Collection  (0) 2024.12.27
VBA Tips  (0) 2024.12.17
확장 영역 자동 선택  (0) 2024.11.28
[직장인 필수] 엑셀 VBA 자동화, 이 영상으로 마스터하세요! | 초보자 맞춤, 4시간 완성 코스  (0) 2024.11.27
반응형

'같은 변수를 여러번 작성할 때 With문을 사용하면 편리하다.
'#With문 예제1
Dim WS As Worksheet
Set WS = Sheet1

WS.Range("A1").Font.Size = 14
WS.Range("A1").Interior.Color = vbRed
WS.Range("A1").RowHeight = 15


'#With문 예제2
Dim WS As Worksheet
Set WS = Sheet1

With WS.Range("A1")
    .Font.Size = 14
    .Interior.Color = vbRed
    .RowHeight = 15
End With

반응형
반응형

Collection

 

'#새로운 Collection 만들기
Dim Coll As Collection
Set Coll = New Collection

'#Collection의 값 제거하기
Coll.Remove (Key)

'#Collection에 값 추가하기
Coll.Add 값
Coll.Add 값, Key

'#Collection 값 돌아가며 확인하기
Dim v As Variant
For Each v In Coll
    Debug.Print v
Next

 

 

아래는 Collection의 Key를 이미 사용한 것일때 나오는 오류이다.

반응형

'VBA' 카테고리의 다른 글

데이터 유효성 검사  (0) 2024.12.31
With  (0) 2024.12.31
VBA Tips  (0) 2024.12.17
확장 영역 자동 선택  (0) 2024.11.28
[직장인 필수] 엑셀 VBA 자동화, 이 영상으로 마스터하세요! | 초보자 맞춤, 4시간 완성 코스  (0) 2024.11.27
반응형

VBA Tips

 

2024년 12월 17일 화

Sub and Function

'Sub >Sub Procedure > 어떤 동작을 수행할 때(실행문)
'Function > 어떤 값을 결과로 출력해야 할 때
'VLOOKUP, SUMIF, SUM, IF함수
'=VLOOKUP(찾을값, 범위, 열번호, 일치옵션)...

 

 

Function name(함수명)

함수명은 대소문자를 구분하지 않느나 중간중간 대문자를 썩어주는 오탈자 방지가 된다.

 

 

마지막 행과 마지막 열 찾기

    Set StartCell = Me.Range("A1")
    LastRow = StartCell.Worksheet.Cells(StartCell.Worksheet.Rows.Count, StartCell.Column).End(xlUp).Row
    LastCol = StartCell.Worksheet.Cells(StartCell.Row, StartCell.Worksheet.Columns.Count).End(xlToLeft).Column

 

마지막 행찾기에서 위에서 내려오는 방법에서 문제점
중간에 셀이 비어 있으면 멈춰버림. 따라서 마지막셀을 찾으려면 시트의 마지막셀에서 위로 올라오는 방법을 사용
행의 갯수는 ver2003이전에는 2^16=65536행, 이후 '2^20=1048576행

 

 

 

변수 정의

'Dim 통합문서 As Workbook
'Set 통합문서 = ThisWorkbook '현재통합문서
'Set 통합문서 = ActiveWorkbook '현재 실행중인 또 다른 활성화된 통합문서를 할당
'Set 통합문서 = Application.Workbooks.Open(경로) '경로에 있는 특정파일을 실행해서 그 통합문서로 만들어준다.

'Dim 시트 As Worksheet
'Set 시트 = ActiveSheet
'Set 시트 = 통합문서.Worksheets("시트이름" 또는 순번) '실무에서는 이것만 알아도 된다.
'Set 시트 = Sheet1


'Dim 범위 As Range
'Set 범위 = 시트.Range("a1:a2")
'Set 범위 = 시트.Cells(행번호, 열번호)
'Set 범위 = Selection

 

 

 

하나의 모듈내에 실행문의 이름과 함수의 이름이 같으면 에러가 난다.

다음은 Sub DynamicRange(), Function DynamicRange(ws As Worksheet, Column As String, InitRow As Long) As Range 이렇게 같은 이름을 가진 실행문과 함수가 같은 모듈에 들어 있을때 나타나는 오류메시지이다.

 

 

Change Event사용시 주의사항

무한 반복에 빠질 수 있다.

따라서 Change Event에 아래 코드를 넣어준다.

Private Sub Worksheet_Change(ByVal Target As Range)
'Change 이벤트는 셀이 변경되었을 때 동작한다.
Application.ScreenUpdating = False
Application.EnableEvents = False

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

Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

 

 

Collection 알아두면 좋은 Tip

'#새로운 Collection 만들기
Dim Coll As Collection
Set Coll = New Collection

'#Collection의 값 제거하기
Coll.Remove (Key)

'#Collection에 값 추가하기
Coll.Add 값
Coll.Add 값, Key

'#Collection 값 돌아가며 확인하기
Dim v As Variant
For Each v In Coll
    Debug.Print v
Next
반응형

'VBA' 카테고리의 다른 글

With  (0) 2024.12.31
Collection  (0) 2024.12.27
확장 영역 자동 선택  (0) 2024.11.28
[직장인 필수] 엑셀 VBA 자동화, 이 영상으로 마스터하세요! | 초보자 맞춤, 4시간 완성 코스  (0) 2024.11.27
ReDim의 주요 목적  (0) 2024.11.11
반응형

확장 영역 자동 선택

 

Sub ExpandRange()
    Dim Rng As Range
    Dim StartCell As Range
    Dim LastRow As Long
    Dim LastCol As Long

    ' 초기 시작 셀 설정 (예: A1)
    Set StartCell = Range("A1")

    ' 마지막 행과 마지막 열 찾기
    LastRow = StartCell.Worksheet.Cells(StartCell.Worksheet.Rows.Count, StartCell.Column).End(xlUp).Row
    LastCol = StartCell.Worksheet.Cells(StartCell.Row, StartCell.Worksheet.Columns.Count).End(xlToLeft).Column

    ' 동적 범위 정의
    Set Rng = StartCell.Worksheet.Range(StartCell, StartCell.Worksheet.Cells(LastRow, LastCol))

    ' 결과 출력
    MsgBox "새로 정의된 범위: " & Rng.Address, vbInformation, "확장된 영역"
End Sub

 

 

코드 설명

  1. 시작 셀 지정
    • Set StartCell = Range("A1")를 통해 데이터가 시작되는 첫 번째 셀을 지정합니다.
  2. 마지막 행과 열 찾기
    • LastRow: 시작 열에서 데이터가 있는 마지막 행을 찾습니다.
    • LastCol: 시작 행에서 데이터가 있는 마지막 열을 찾습니다.
  3. 동적 범위 정의
    • Range(StartCell, Cells(LastRow, LastCol))를 사용하여 새로 확장된 영역을 동적으로 설정합니다.
  4. 결과 확인
    • 확장된 범위를 메시지 박스로 출력하여 확인할 수 있습니다.

 

데이터 추가 후 자동 실행 (워크시트 변경 이벤트 활용)

데이터가 추가될 때마다 자동으로 영역이 확장되도록 하려면 워크시트 변경 이벤트를 활용할 수 있습니다.

이벤트 코드: 워크시트 변경 감지

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim StartCell As Range
    Dim LastRow As Long
    Dim LastCol As Long
    Dim Rng As Range

    ' 초기 시작 셀 설정 (예: A1)
    Set StartCell = Me.Range("A1")

    ' 마지막 행과 열 찾기
    LastRow = Me.Cells(Me.Rows.Count, StartCell.Column).End(xlUp).Row
    LastCol = Me.Cells(StartCell.Row, Me.Columns.Count).End(xlToLeft).Column

    ' 동적 범위 정의
    Set Rng = Me.Range(StartCell, Me.Cells(LastRow, LastCol))

    ' 확장된 범위를 표시 (선택적)
    Debug.Print "확장된 영역: " & Rng.Address
End Sub

 

사용 방법

  1. 해당 코드를 변경하려는 워크시트의 코드 창에 추가합니다.
    • VBA 편집기에서 해당 워크시트를 선택 후 추가.
  2. 데이터를 추가하거나 변경하면 자동으로 동작합니다.

 

결과

  • 원래 데이터: $A$1:$B$10
  • 새 데이터 추가: A11 또는 B11에 데이터를 추가하면 자동으로 $A$1:$B$11로 범위가 확장됩니다.
  • 확인 방법: Rng 변수에 새롭게 확장된 영역이 저장됩니다.

위 코드는 엑셀에서 데이터를 동적으로 관리할 때 유용합니다.

반응형
반응형

[직장인 필수] 엑셀 VBA 자동화, 이 영상으로 마스터하세요! | 초보자 맞춤, 4시간 완성 코스

 

https://youtu.be/NAJpBaUU_9M?si=oPJSNvPTyUxzmWpR

 

반응형

'VBA' 카테고리의 다른 글

VBA Tips  (0) 2024.12.17
확장 영역 자동 선택  (0) 2024.11.28
ReDim의 주요 목적  (0) 2024.11.11
V=range("NFE")와 V=range("NFE").Value의 차이점  (0) 2024.11.10
VBA 코드에서 언더스코어(_)의 기능  (0) 2024.11.09
반응형

ReDim은 VBA에서 동적 배열의 크기를 변경할 때 사용되는 키워드입니다. Dim을 사용해 배열을 선언할 때 크기를 미리 지정하지 않고, 코드 실행 중 필요한 크기로 배열을 조정할 수 있습니다.

ReDim의 주요 목적

  1. 동적 배열 크기 조정: 초기에는 크기를 알 수 없는 배열의 요소 개수를 ReDim을 사용해 설정할 수 있습니다.
  2. 메모리 효율성: 필요한 크기만큼만 배열을 설정하고, 데이터 추가나 변경에 따라 배열 크기를 조정함으로써 메모리를 효율적으로 사용할 수 있습니다.
  3. 실행 중 배열 크기 변경: 배열 크기를 코드 실행 도중 변경해야 할 때 유용합니다.

사용 예시

다음은 동적 배열을 ReDim으로 설정하고 변경하는 예입니다.

Sub Example()
    Dim myArray() As Integer ' 크기를 지정하지 않은 배열 선언
    
    ' 배열의 크기 설정 (초기 크기: 5)
    ReDim myArray(1 To 5)
    myArray(1) = 10

    ' 배열 크기 재설정 (변경된 크기: 10)
    ReDim myArray(1 To 10)
End Sub

 

 

ReDim Preserve의 사용

기존 데이터가 있는 배열 크기를 변경하면서 데이터를 유지하려면 ReDim Preserve를 사용해야 합니다. Preserve를 붙이지 않으면 배열의 모든 요소가 초기화됩니다.

Sub ExampleWithPreserve()
    Dim myArray() As Integer
    ReDim myArray(1 To 5)
    myArray(1) = 10
    
    ' 배열 크기 변경, 기존 데이터 유지
    ReDim Preserve myArray(1 To 10)
End Sub

 

 

주의사항

  • ReDim Preserve는 배열의 마지막 차원만 변경할 수 있습니다.
반응형
반응형

V = Range("NFE")와 V = Range("NFE").Value는 엑셀 VBA에서 셀 값을 변수에 저장할 때 약간의 차이가 있습니다.

차이점

  1. V = Range("NFE"):
    • 이 코드는 Range("NFE") 객체 자체를 V에 할당하는 것입니다.
    • V는 이제 Range 객체의 참조를 가지며, V를 통해 Range 객체의 다양한 속성(Value, Formula, Address 등)에 접근할 수 있습니다.
    • 즉, V.Value, V.Formula 등을 통해 해당 셀의 값이나 수식을 직접 확인하고 조작할 수 있습니다.
    Dim V As Range
    Set V = Range("NFE") ' Range 객체를 참조
    MsgBox V.Value       ' V를 통해 해당 셀의 값에 접근
     
     
     
  2. V = Range("NFE").Value:
    • 이 코드는 Range("NFE")의 값만을 V에 할당하는 것입니다.
    • V는 셀의 Value 속성에 할당된 데이터만 저장하므로, V는 이제 셀의 값만을 가지는 변수로, 셀의 다른 속성이나 메서드에는 접근할 수 없습니다.
     
Dim V As Variant
V = Range("NFE").Value ' NFE 셀의 값만 가져옴
MsgBox V               ' 셀의 값 표시

 

요약

  • Range("NFE"): 셀 자체(Range 객체)를 참조로 할당. 셀의 다양한 속성에 접근 가능.
  • Range("NFE").Value: 셀의 값만 할당. 값만을 읽거나 사용하려고 할 때 적합.

따라서, 단순히 셀의 값을 가져오려는 경우 V = Range("NFE").Value를 사용하는 것이 적합하며, 셀의 다른 속성이나 셀의 범위를 직접 제어하려면 V = Range("NFE")와 같이 Range 객체 참조를 사용하는 것이 좋습니다.

반응형
반응형

VBA 코드에서 **언더스코어(_)**는 줄 바꿈 문자로 사용됩니다. VBA에서는 한 줄에 모든 코드를 작성해야 하는 제한이 있기 때문에, 코드가 길어질 경우 언더스코어를 사용해 다음 줄로 이어서 작성할 수 있습니다. 이를 통해 코드의 가독성을 높일 수 있습니다.

사용 방법

언더스코어를 줄의 끝에 넣고 다음 줄에서 코드를 계속 작성하면 됩니다. 이때, 언더스코어 앞뒤에는 반드시 공백이 있어야 합니다.

Sub Example()
    Dim total As Integer
    total = 10 + 20 + 30 + _
            40 + 50 + 60 ' 언더스코어로 줄 바꿈
    MsgBox total
End Sub

주의 사항

  • 언더스코어 뒤에는 아무 내용도 없어야 합니다. 이어지는 줄은 다음 코드의 일부로 인식됩니다.
  • 문장 하나를 여러 줄에 걸쳐 작성하는 데 유용하며, 함수나 서브루틴 선언, If 문, For 문 등에서도 사용할 수 있습니다.

예시

긴 조건문을 언더스코어를 사용해 여러 줄로 나눌 수도 있습니다.

 
If total > 0 And total < 100 And _
   total Mod 10 = 0 Then
    MsgBox "조건이 만족되었습니다."
End If

 

반응형

'VBA' 카테고리의 다른 글

ReDim의 주요 목적  (0) 2024.11.11
V=range("NFE")와 V=range("NFE").Value의 차이점  (0) 2024.11.10
변수명 A와 A()의 차이  (0) 2024.11.08
Option Explicit 사용하는 이유는?  (0) 2024.11.07
변수명 끝에 &와 #  (0) 2024.10.23
반응형

VBA에서 변수명을 A로 선언하는 것과 A()로 선언하는 것에는 중요한 차이가 있습니다.

  • A : 일반 변수입니다. A는 단일 값(스칼라)을 저장하는 변수로, 숫자나 문자열과 같은 단일 데이터를 저장할 수 있습니다.
Dim A As Integer
A = 10 ' 단일 정수 값을 저장

 

  • A() : 배열입니다. A()는 여러 개의 값을 저장할 수 있는 배열 변수로, 특정 인덱스를 통해 각 요소에 접근할 수 있습니다. 배열은 한 번에 여러 값을 저장할 때 유용합니다.
Dim A(1 To 5) As Integer ' 5개의 정수를 저장할 수 있는 배열
A(1) = 10 ' 첫 번째 요소에 값 할당
A(2) = 20 ' 두 번째 요소에 값 할당

 

주요 차이점

  1. 데이터 저장 방식: A는 단일 값을 저장하지만, A()는 여러 값을 인덱스를 통해 저장할 수 있습니다.
  2. 용도: A는 단일 데이터를 저장하는 용도이고, A()는 여러 개의 관련된 데이터를 저장하는 용도입니다.
  3. 메모리 할당: A()와 같은 배열은 저장할 데이터 크기를 미리 정의하거나 동적으로 할당해야 하며, 메모리 관리가 필요할 수 있습니다.

 

동적 배열의 경우

배열의 크기를 코드 실행 중에 변경하고 싶다면, 동적 배열을 사용할 수 있습니다. 다음과 같이 ReDim을 사용하여 배열의 크기를 지정할 수 있습니다.

Dim A() As Integer
ReDim A(1 To 5) ' 배열의 크기 설정

 

따라서, A와 A()는 사용 목적과 저장 방식에서 큰 차이가 있습니다. A()는 특히 다수의 데이터를 효율적으로 관리할 때 유용합니다.

반응형

'VBA' 카테고리의 다른 글

V=range("NFE")와 V=range("NFE").Value의 차이점  (0) 2024.11.10
VBA 코드에서 언더스코어(_)의 기능  (0) 2024.11.09
Option Explicit 사용하는 이유는?  (0) 2024.11.07
변수명 끝에 &와 #  (0) 2024.10.23
Mohr's circle VBA code  (0) 2023.06.16

+ Recent posts