EXCEL - VBA

데이터(레코드)별로 양식 시트에 기록하기

별동산 2024. 6. 5. 08:52
반응형

1. 문제

데이터를 양식시트에 자동 입력.xlsx
0.01MB

 

 

아래와 같은 데이터를

 

레코드(행)별로 시트를 추가해서 아래 양식 데이터에 기록하려고 합니다.

 

2. 관련 메서드 및 속성 등

시트를 레코드 개수에 따라 추가하거나 삭제해야 하고,

행별로 반복처리해야 합니다.

 

가. 시트 추가

구문 : Sheets.Add (Before, After, Count, Type)

인수명 필수/선택 데이터
형식
설명
Before Optional Variant An object that specifies the sheet before which the new sheet is added.
After Optional Variant An object that specifies the sheet after which the new sheet is added.
Count Optional Variant The number of sheets to be added. The default value is the number of selected sheets.
Type Optional Variant Specifies the sheet type. Can be one of the following XlSheetType constants: xlWorksheet, xlChart, xlExcel4MacroSheet, or xlExcel4IntlMacroSheet. If you are inserting a sheet based on an existing template, specify the path to the template. The default value is xlWorksheet.

 

예: Sheets.Add After:=Sheets(2)

괄호를 넣으면 오히려 에러가 납니다.

 

나. 시트 삭제

구문 : Worksheet.Delete

 

Worksheet를 삭제하는데,

Sheets(2) 또는 Sheets("Sheet1")식으로 지정합니다.

 

예 : Sheets(2).Delete

 

다. 시트의 개수

구문 : Sheets.Count

 

직접 실행창에

? sheets.count라고 입력하면

시트의 개수 3이 구해집니다.

 

라. 일정한 범위의 값을 배열에 넣기

Dim rng As Range
Dim record As Variant

'첫번째 시트의 데이터 영역을 변수와 배열에 저장
Sheets(1).Select
Set rng = Range("a1").CurrentRegion
record = rng

 

A1셀을 기준으로 CurrentRegion(연속된 범위)을 범위 변수 rng에 넣고,

다시 record = rng로 하면 범위가 record 배열에 저장됩니다.

 

위 화면 record의 오른쪽으로 가면 Variant/Variant(1 to 3, 1 to 11)로 표시되는데,

1 to 3는 행(row)이고,

1 to 11은 열(column)입니다.

마. Application.DisplayAlerts

시트명에서 마우스 오른쪽 버튼을 누른 후 삭제를 누르면

아래와 같이 시트를 영구적으로 삭제할 것인지 묻는데,

이 창을 표시할 것인지 여부를 설정하는 것이

Application.DisplayAlerts입니다.

 

Application.DisplayAlerts = False라고 하면 위 창이 나타나지 않고 바로 시트가 삭제됩니다.

원래대로 돌리려면

Application.DisplayAlerts = True라고 하면 됩니다.

 

3. 데이터(레코드) 별로 양식 시트에 기록하기

Option Explicit

Sub input_form()
    Dim i As Integer, j As Integer, k As Integer
    Dim rng As Range
    Dim record As Variant
    Dim ws As Worksheet
    
    '화면 업데이트 안함
    Application.ScreenUpdating = False
    
    '첫번째 시트의 데이터 영역을 변수와 배열에 저장
    Sheets(1).Select
    Set rng = Range("a1").CurrentRegion
    record = rng
    
    '레코드 개수로 시트 개수 맞추기
    i = Sheets.Count
    
    '작다면 시트를 추가하고
    If i < UBound(record, 1) Then
        
        '레코드의 개수보다 작을 동안 양식 시트 복사해서 추가
        While i < UBound(record, 1)
            Sheets(2).Copy After:=Sheets(Sheets.Count)
            i = i + 1
        Wend
        
    '크다면 시트 삭제
    ElseIf i > UBound(record, 1) Then
        For i = Sheets.Count To UBound(record, 1) + 1 Step -1
            '삭제시 경고 대화 상자 표시 안함
            Application.DisplayAlerts = False
            Sheets(i).Delete
        Next
        '삭제시 경고 대화 상자 표시 원래대로
            Application.DisplayAlerts = True
    End If
    
    '양식의 9행부터 기록함
    k = 9
    
    '한 줄씩 처리
    For i = 2 To UBound(record, 1)
        Set ws = Sheets(i)
        
        '한 열씩 처리
        For j = 1 To UBound(record, 2)
            'Raw Data의 데이터를 맞는 위치에 기록
            ws.Cells(k, "E") = Sheets(1).Cells(i, j)
            '2줄씩 아래에 기록
            k = k + 2
        Next
        '시트의 이름을 이름으로 변경
        ws.Name = ws.Range("e9") & "." & ws.Range("E15")
        
        'k값 초기화
        k = 9
    Next
    
    Application.ScreenUpdating = True
End Sub

 

데이터를 양식시트에 자동 입력.xlsm
0.03MB

반응형