내일도 화이팅

입고 데이터 추가하기 코드 분석 본문

엑셀/엑셀 매크로 사무자동화 이해

입고 데이터 추가하기 코드 분석

내일도화이팅 2023. 7. 15. 19:48

https://ksm30546.tistory.com/10

입고 데이터 추가하기-코드 제공(복붙용)

입고 데이터를 자동입력해주는 매크로 코드를 제공하겠습니다. 아래 복붙하시면 바로 사용 가능합니다. Sub 데이터입력() Dim input_data As String Dim data As Integer data = 3 Do While (Cells(data, "B").Value "") data

ksm30546.tistory.com

위 매크로에 나오는 코드를 분석해보겠습니다.
 
분석이 끝나면 원하는 대로 코드를 변경할 수 있습니다.
 

1. 데이터입력(하나의 데이터 입력) 매크로

먼저 개별 데이터를 입력했던 "데이터입력"이라는 매크로(위의 링크의 첫번째 매크로)부터 분석해보겠습니다.
 
해당 매크로의 코드는

Sub 데이터입력()
    Dim input_data As String
    Dim data As Integer
    data = 3
    Do While (Cells(data, "B").Value <> "")
        data = data + 1
    Loop
    input_data = "B" & Trim(Str(data)) & ":" & "E" & Trim(Str(data))
    Range(input_data).Value = Range("G3:J3").Value
End Sub

 
였습니다. 한줄씩 뜯어보겠습니다.
 
1행 : Sub 데이터입력()
프로시저에는 sub와 function이 있는데, sub는 반환을 하지않는 프로시저이고 function은 반환을 하는 프로시저입니다.
그리고 "데이터입력"은 제가 만든 매크로명이며, ()는 입력할 인수가 없다는 뜻입니다.
 
2행 : Dim input_data As String
위 코드는 문자열을 담는 변수를 선언하겠다는 뜻입니다. 그리고 변수명은 "input_data"로 제가 설정했으며 원하신다면 바꾸실 수 있습니다.
 
3행 : Dim data As Integer
위 코드는 정수형을 담는 변수를 선언하겠다는 뜻입니다. 그리고 변수명은 "data"로 설정했으며 이 역시 원하신다면 바꾸실 수 있습니다.
 
4행 : data = 3
반복 작업을 하기 위해 시작값을 3으로 설정했습니다.(아래에서 언급하겠지만, 3행부터 탐색할 목적으로 3으로 설정했으며, 2행부터 탐색하려면 2행, 1행부터 탐색하려면 1행으로 바꾸실 수 있습니다.)
 
5행~7행 :
    Do While (Cells(data, "B").Value <> "")
        data = data + 1
    Loop
 
해당 코드는 데이터를 빈 값에 넣기 위해서 B열에서 빈 값을 찾기 위해 만든 반복문입니다.
Do While은 조건이 맞으면 While 밑에 Loop위에 있는 코드를 반복하며(무한 반복문이 될 수 도 있으니 주의하여야합니다.)
 
제가 입력한 조건으로는 Cells(data, "B").Value <> ""으로
직역하면 B열의 data번째 행(data라는 변수에 들어있는 값 -> 시작값은 3으로 셋팅)의 셀 값이 ""(공란)이 아니면 반복한다.이고 만약 공란이 아닐 경우 data의 변수를 1증가시켜서 다음 행을 탐색하도록 코드를 짰습니다.
 
- Cells함수는 셀을 의미하며 인수를 행과 열순으로 입력합니다. 예를들어 B7이면
Cells(7,"B") 또는 Cells(7,2)로 쓸 수 있습니다.(A = 1, B = 2, ... , Z = 26 입니다.)
- Value는 값을 의미합니다.
- <>는 같지않다를 의미합니다.
 
8행 : input_data = "B" & Trim(Str(data)) & ":" & "E" & Trim(Str(data))
8행이 실행되었다는 것은 B열에서 빈칸을 찾았음을 의미합니다. input_data에 빈칸의 범위를 저장합니다.
 
만약에 셀 B7이 비어있어 data가 7이라면,
input_data라는 변수에는 "B7:E7" 이라는 문자열이 담깁니다.
&는 문자열을 잇는 기호이고 Str은 숫자형 데이터를 문자형 데이터로 바꾸는 형변환 함수입니다.
data라는 변수가 정수형으로 선언이 되었기때문에 문자열과 결합하기 위해서는 문자열로 바꿔야 합니다.
 
※ data를 형변환하는 과정에서 7->"7"이 아니라 7 -> " 7" 으로 공백이 생깁니다. 그렇게 되면
input_data는 "B 7:E 7"이 되므로 해당 범위를 사용할 때 오류가 발생합니다.
때문에 Trim이라는 양쪽에 공백을 제거하는 함수를 사용해서 " 7"을 "7"으로 바꿔줍니다.
 
그러면 우리가 처음 원했던 값(범위)인 "B7:E7"이 input_data에 저장됩니다.
 
9행 : Range(input_data).Value = Range("G3:J3").Value
input_data에 들어있는 범위의 "값"을 G3:J3에 있는 "값"으로 대체한다는 뜻입니다.
- Range는 범위를 의미한다는 점에서 하나의 셀만 의미하는 Cells와 다릅니다.

10행 : End Sub
"데이터입력"이라는 프로시저를 종료하겠다는 뜻입니다.
 

2. 견적서입력(다량의 데이터 입력) 매크로

Sub 견적서입력()
    Dim input_data As String
    Dim data As Integer
    data = 3
    Do While (Cells(data, "B").Value <> "")
        data = data + 1
    Loop
    input_data = "B" & Trim(Str(data)) & ":" & "E" & Trim(Str(data + 100))
    Range(input_data).Value = Worksheets("견적서").Range("B3:E100").Value
End Sub

1행 : Sub 견적서입력()
앞서 설명했듯이 "견적서입력"이라는 프로시저를 뜻합니다.

2행~4행 :    

Dim input_data As String
Dim data As Integer
data = 3

2행~4행은 기초셋팅코드로 1번과 동일합니다.
 
5행~7행 :

Do While (Cells(data, "B").Value <> "")
     data = data + 1

Loop
위 코드도 역시 B열의 빈칸을 찾는 코드로 1번과 동일합니다.
 
8행 : input_data = "B" & Trim(Str(data)) & ":" & "E" & Trim(Str(data + 100))
input_data에 범위를 의미하는 값을 넣는다는 것은 1번과 동일하지만, 하나 다른점은 +100을 했다는 점입니다.
만약 data라는 변수의 값이 7이였다면 +100을 하기전에는
input_data에는 "B7:E7"이 저장되었을 겁니다.
하지만, +100을 함으로서 "B7:E107"로 바뀌게 되었습니다.
 
그렇다면,
100의 범위가 내가 원하는 범위보다 작다싶으면 100초과의 값으로 바꾸면되고
100의 범위가 내가 원하는 범위보다 크다싶으면 100미만의 값으로 바꾸면됩니다.
 
9행 : Range(input_data).Value = Worksheets("견적서").Range("B3:E100").Value
1번 코드와 다르점은 Worksheets라는 함수가 사용되었다는 점입니다.
Worksheets는 sheet를 의미하고 인수로 "견적서"를 넣으면서 "견적서"라는 이름의 시트를 의미합니다.
 
즉, Worksheets("견적서").Range("B3:E100").Value는 "견적서"라는 시트에 셀 B3에서 셀 E100까지의 값을 의미합니다.
 
그래서 위 코드를 전체 직역하면(input_data가 "B7:E107"이라 가정했을때)
"견적서"시트에 있는 B3부터 E100까지의 값을 해당 시트의 B7부터 E107의 값으로 넣을게. 입니다.
 
이 역시 알파벳과 숫자를 바꿔서 범위를 조정하면 원하는 크기로 바꿀 수 있고
Worksheets안의 인수인 "견적서"를 다른 시트이름으로 대체하면 복사해올 시트를 바꿀 수 있습니다.

10행 : End Sub
1번에서 언급한대로 프로시저 종료를 의미합니다.
 
도움이 되셨다면 좋아요 댓글 부탁드립니다.
 
모든 피드백, 질문 환영합니다 ㅎㅎ