'엑셀 vba 예제'에 해당되는 글 1건

  1. 2015.11.17 [엑셀 VBA 예제2] 여러 시트에 있는 값을 한 시트로 옮기기(합하기) 3


[엑셀 VBA 예제2] 여러 시트에 있는 값을 한 시트로 옮기기






이번 엑셀 VBA 예제는 여러 시트에 있는 값을 조건에 맞춰서 한 시트로 취합하는 예제입니다.

With문, For~Next문, Find문, If문, Offset문, Instr문이 사용됩니다.


예제를 받아주세요.






이번 엑셀 VBA 예제의 내용은 아래와 같습니다.





위 두 시트의 자산 총계를 아래 시트의 자산 란에 연도별로 넣고자 합니다.


2015, 2016 두 가지의 자료만 넣는 예제이지만, 시트를 추가하면 2000년부터 2099년까지 활용할 수 있는 예제입니다.




엑셀 VBA를 본격적으로 작성하기 전에 어떻게 만들것인지 구상이 필요합니다.


제 구상은 아래와 같습니다:


1.  시트1(2015년 재무재표) ~시트n(2099년 재무재표) 이름의 연도값(20xx)을 인식 및 변수로 추출

2.  년도별로 해당하는 시트에서 "자산총계" 문자가 있는 셀을 찾고, 바로 아래의 값을 변수로 추출

3.  "비교" 시트의 년도값(20xx)의 행값과 "자산"의 열값을 변수로 추출 (n, 2)

4.  (행값, 열값)셀에 각 시트의 자산총계 바로 아래에 있는 값을 넣는다

5.  마지막 시트까지 반복






이제 엑셀 VBA 코드를 보겠습니다.


COMP는 이름이 "비교"인 시트 값을 뜻합니다.


조건1. 시트의 이름에는 20을 포함하는 년도값이 한번 포함되야 합니다.

조건2. 데이타를 합하는 시트의 시트 값은 "COMP"로 설정되어 있어야 합니다.

조건3. COMP 시트를 제외한 모든 시트 값은 기본값인 Sheet1~Sheetn으로 되어있어야 합니다.

조건4. 코드는 COMP 시트에서 실행하면 안됩니다.





Option Explicit                '변수가 선언(dim) 없이 사용되는 것을 방지


Sub example()

Dim b As Object

Dim c As Object

Dim d As Object

Dim wks As Worksheet

Dim stryear As String

Dim currrow As Integer

Dim currcol As Integer

Dim curval As Long



With ActiveWorkbook                            '해당 워크북에서

    

    For Each wks In Worksheets                '모든 워크시트를 순환

    

        If InStr(wks.Name, "20") <> 0 Then            '해당 워크시트의 이름에 20이 들어가면

                                  

                 With wks.Range("a1:z20")                                    'range 범위는 모든 값을 포함하는 범위로 설정

                      Set b = .Find("자산총계", lookat:=xlWhole)            '"자산총계" 값이 있는 셀을 찾는다

                        If Not b Is Nothing Then                    '"자산총계" 값이 하나라도 있다면

                

                        curval = b.Offset(1, 0).Value                'curval(변수)는 "자산총계" 셀 바로 아래의 셀 값으로 설정

                      End If

                 End With


stryear = Mid(wks.Name, InStr(wks.Name, "20"), 4)                    'stryear(변수)는 시트 이름에 포함된 년도값(20xx)

               

    

                  With COMP.Range("a1:z20")                    'COMP 시트에서 (Range 범위는 모든 값을 포함하는 범위)

            

                  Set c = .Find(stryear, lookat:=xlPart)            'stryear값을 포함하는 셀을 찾는다.

                       If Not c Is Nothing Then                    'stryear 값을 포함하는 셀이 하나라도 있다면

                

                        currrow = c.Row                    'currrow(변수) 값은 그 셀의 행값

                

                        End If

                

                

                   Set d = .Find("자산", lookat:=xlWhole)            '"자산"을 포함하는 셀을 찾는다

                    If Not d Is Nothing Then            

                

                     currcol = d.Column                        'currcol(변수) 값은 그 셀의 열값

                

                   End If

                     

                

                  End With

        

    

COMP.Cells(currrow, currcol).Value = curval       '년도와 항목에 맞춰서 값을 집어넣는다         '


 

        End If

    Next wks                    '다음 시트로 넘어가기



End With

 

 MsgBox "입력 완료"


End Sub



파란색으로 표시한 Instr 문은 string(문자열) 내에서 해당 문자가 시작되는 위치를 찾아줍니다.


따라서 문자가 존재하지 않는 경우 0의 값을 돌려주게 됩니다.


이를 응용해서 년도값을 추출할 때에는 mid문을 사용해서 instr과 조합해서 사용할 수 있습니다.


stryear = Mid(wks.Name, InStr(wks.Name, "20"), 4)


위 코드는 시트 이름에서 20이라는 문자의 위치를 찾고, 그 위치부터 오른쪽으로 4 자리의 숫자를 추출하는 코드입니다.


2020년의 경우에도 알맞은 값을 돌려줍니다. (처음 만나는 20을 찾기 때문)









Posted by Simon K
: