예제파일.xlsx
0.01MB

메모 넣기(comment)
- 주의 점 
- 메모가 이미 추가된 곳에 메모를 넣으면 오류 발생(삭제 후 추가)
- 메모에는 텍스트만 입력 가능

Sub delComment()

    With ActiveSheet.Range("A1")
    	.Interior.ColorIndex = 0
        .ClearComments
    End With

End Sub

Sub addComment()

    With ActiveSheet.Range("A1")
        '메모 삭제
        .ClearComments
        .Interior.ColorIndex = 12
        '메모 넣기(문자열만 입력가능, 기존 메모가 있는데 넣으면 오류발생)
        .addComment ("hello world")
    End With

End Sub

 

 

숫자를 문자로 변환(Format)
- 주의 점 
- 충분히 큰 숫자를 감안하여 long 형으로 인자를 받음

Function numberToText(num As Long) As String
    numberToText = Format(num, "#,##0") ' 숫자를 포맷팅된 문자열로 변환 (예: 1,234,567)
End Function

 

딕셔너리(Dictionary)
- 착안 점
- 엑셀은 행, 열의 2차원 배열임.
- key 에는 데이터의 중복이 없는 키 값을 넣고
- value 에는 행번호를 넣고
- 나머지 컬럼 번호는 Enum 으로 처리하여 
- A-B 시트를 키값으로 매칭하여 데이터를 가져오는 코드를 작성가능
ex) 하나의 통일된 서식을 여러 부서에 뿌려서 취합할 경우 유용한 코딩 기법

Sub GetValuesFromSheet2()

  Dim ws1 As Worksheet
  Dim ws2 As Worksheet
  Dim dict1 As Object
  Dim dict2 As Object
  Dim key1 As String
  Dim key2 As String
  Dim i As Long
  Dim j As Long

  ' 시트 설정
  Set ws1 = ThisWorkbook.Sheets("1번 시트")
  Set ws2 = ThisWorkbook.Sheets("2번 시트")

  ' 딕셔너리 생성
  Set dict1 = CreateObject("Scripting.Dictionary")
  Set dict2 = CreateObject("Scripting.Dictionary")

  ' 1번 시트 값 저장
  For i = 2 To ws1.UsedRange.Rows.Count
    key1 = ws1.Cells(i, 1).Value & "," & ws1.Cells(i, 2).Value
    dict1.Add key1, i
  Next

  ' 2번 시트 값 저장
  For j = 2 To ws2.UsedRange.Rows.Count
    key2 = ws2.Cells(j, 1).Value & "," & ws2.Cells(j, 2).Value 
    dict2.Add key2, j
  Next

  ' 2번 시트 값 가져오기
  For i = 2 To ws1.UsedRange.Rows.Count
    key1 = ws1.Cells(i, 1).Value & "," & ws1.Cells(i, 2).Value 
    If dict2.Exists(key1) Then
      ws1.Cells(i, 4).Value = ws2.Cells(dict2(key1), 4).Value
    End If
  Next

  ' 메모리 해제
  Set dict1 = Nothing
  Set dict2 = Nothing

End Sub

 

Body 영역선택(currentRegion & offset & resize)
-  내용 :  header를 제외한 내용만 선택하는 코드

' ======================================================================================
' 설명: 데이터 시작 행부터 끝까지의 전체 데이터 범위를 설정하는 서브루틴
' ======================================================================================
Sub seletAllData()

    Dim DATA_START_ROW As Integer '데이터 시작 행 번호를 저장할 변수
    Dim allRange As Range '전체 데이터 범위를 저장할 변수
    
    DATA_START_ROW = 2 '데이터 시작 행 번호를 2로 설정

    ' 전체 데이터 범위 설정
    With Range("A1").CurrentRegion
        Set allRange = .Offset(DATA_START_ROW - 1).Resize(.Rows.Count - DATA_START_ROW + 1)
        ' A1 셀의 현재 데이터 영역에서 DATA_START_ROW 행부터 데이터가 끝나는 행까지의 범위를 allRange에 저장
    End With
    
    allRange.Select '전체 데이터 범위 선택 (주석 처리됨)
    
End Sub

 

Column 영역선택(columns)
-  내용 :  header를 제외한 내용 중 특정 컬럼 영역만 선택

'======================================================================================
' 설명: 데이터 시작 행부터 끝까지의 특정 컬럼 데이터 범위를 선택하는 서브루틴
' ======================================================================================
Sub selectColData()
    
    Dim DATA_START_ROW As Integer '데이터 시작 행 번호를 저장할 변수
    Dim allRange As Range '전체 데이터 범위를 저장할 변수
    Dim colNum As Integer '선택할 컬럼 번호를 저장할 변수
    
    DATA_START_ROW = 2 '데이터 시작 행 번호를 2로 설정
    colNum = 1 '선택할 컬럼 번호를 1로 설정 (A 열)

    ' 전체 데이터 범위 설정
    With Range("A1").CurrentRegion
        Set allRange = .Offset(DATA_START_ROW - 1).Resize(.Rows.Count - DATA_START_ROW + 1)
        ' A1 셀의 현재 데이터 영역에서 DATA_START_ROW 행부터 데이터가 끝나는 행까지의 범위를 allRange에 저장
    End With
    
    allRange.Columns(colNum).Select '전체 데이터 범위에서 colNum 번째 컬럼을 선택
    
End Sub

 

파일순회

Sub PrintFilesWithSpecificExtension()

    Dim fileName As String
    Dim extension As String

    ' 출력할 확장자 설정
    extension = "*.hw*" ' 예: .txt 파일

    ' 현재 폴더에서 첫 번째 파일 이름 가져오기
    fileName = Dir(extension)

    ' 파일 이름이 있는 동안 반복
    Do While fileName <> ""
        Debug.Print fileName

        ' 다음 파일 이름 가져오기
        fileName = Dir
    Loop

End Sub

파일순회 및 파일 내용 출력

Sub PrintFilesWithSpecificExtension()

    Dim pathName As String
    Dim fileName As String
    Dim extension As String

    pathName = ThisWorkbook.Path & "\취합폴더\"
    

    ' 출력할 확장자 설정
    extension = pathName & "*.xl*" '

    ' 현재 폴더에서 첫 번째 파일 이름 가져오기
    fileName = Dir(extension)

    ' 파일 이름이 있는 동안 반복
    Do While fileName <> ""
        Debug.Print fileName
        Call fileOpenAndClose(pathName & fileName)
        ' 다음 파일 이름 가져오기
        fileName = Dir
    Loop

End Sub

Function fileOpenAndClose(fileName As String)
    'Dim fileName As String
    Dim targetWb As Workbook
    
    'fileName = "3.신속집행계획(총무과).xlsx"
    '파일 열기
    Set targetWb = Workbooks.Open(fileName)
    Debug.Print (targetWb.Worksheets(1).Range("A1").Value)
    '파일 저장 없이 닫기
    targetWb.Close savechanges:=False
End Function

Sub fileOpenAndClose_test()

    Dim pathName As String
    Dim fileName As String
    
    fileName = "3.신속집행계획(총무과).xlsx"
    pathName = ThisWorkbook.Path & "\취합폴더\"

    Call fileOpenAndClose(pathName & fileName)

End Sub

파일순회 및 이름변경

Function 파일이름변경(oldFileName, newFileName)
  
    ' 파일명 변경
    Name oldFileName As newFileName

End Function


Sub 제출부서카운트()

    Dim 폴더경로 As String, 파일명 As String
    Dim 부서명 As String
    Dim 제출여부확인시트 As Worksheet
    Dim 부서명리스트 As Range
    
    
    '부서명 = "도시재생과"

    Application.ScreenUpdating = False

    폴더경로 = ThisWorkbook.Path & "\취합폴더\" '폴더경로 설정

    파일명 = Dir(폴더경로 & "*.xls*") '폴더 내의 모든 파일 목록 가져오기

    '제출여부확인 시트를 추가하고, 부서명 리스트를 작성
    Set 제출여부확인시트 = ActiveSheet
    
    With 제출여부확인시트
        
        '부서명리스트 세팅
        Set 부서명리스트 = Range(.Range("B2"), .Range("B2").End(xlDown))
        
    End With
    
    'Debug.Print (rng.Value)
    Do While 파일명 <> ""
    
        For Each rng In 부서명리스트

            'Debug.Print (파일명 & "- " & rng.Value)

            '파일명에 부서명이 있으면
            If InStr(1, 파일명, rng.value) > 0 Then

                'Debug.Print (파일명)
                rng.Offset(, 1).value = 1 + rng.Offset(, 1).value
                
                If InStr(1, 파일명, rng.Offset(, -1).value & ".") = 0 Then
                    Call 파일이름변경(폴더경로 & 파일명, _
                                      폴더경로 & rng.Offset(, -1).value & "." & 파일명)
                End If

            End If

        Next
        
        파일명 = Dir '다음 파일 이름 가져오기

    Loop

    Application.ScreenUpdating = True

End

 

파일 열고 닫기

Sub fileOpenAndClose()
    Dim fileName As String
    Dim targetWb As Workbook
    
    fileName = "3.신속집행계획(총무과).xlsx"
    '파일 열기
    Set targetWb = Workbooks.Open(ThisWorkbook.Path & "\취합폴더\" & fileName)
    '파일 저장 없이 닫기
    targetWb.Close savechanges:=False
End Sub

 

중복값 제거
- 특정 데이터의 컬럼영역에 대해 중복값 제거

' ======================================================================================
' 설명: 활성 시트의 B 열에서 중복된 데이터를 제거하는 서브루틴
' ======================================================================================
Sub removeDuplicateData()
    With ActiveSheet
        ' B2 셀부터 B 열의 마지막 행까지 범위 선택
        ' 선택된 범위에서 B 열(1번째 열)을 기준으로 중복 데이터 제거
        ' Header 옵션을 xlNo로 설정하여 첫 번째 행을 헤더로 취급하지 않음
        Range(.Range("B2"), .Range("B2").End(xlDown)).RemoveDuplicates Columns:=1, Header:=xlNo
    End With
End Sub

 

Enum
- 주로 컬럼명에 매칭하여 사용

Public Enum TargetColumns
    DATA_START_ROW = 4
    회계 = 1
    부서 = 2
    사업 = 3
    통계목 = 4
    당해예산액 = 6
    이월예산액 = 8
    기집행액 = 12
End Enum

'스터디내용' 카테고리의 다른 글

1강 파이썬이란 무엇인가?  (0) 2024.05.21
예제  (0) 2024.04.04
value_averaging(3)-최종화  (0) 2024.03.21
Value averaging code (2)  (0) 2024.03.07
Value averaging code (1)  (0) 2024.02.23

+ Recent posts