[엑셀 VBA 예제1] 텍스트 파일(.txt) 엑셀에 입력하기




실무적인 엑셀 VBA에 관한 질문이 들어와서, 엑셀 VBA 기초 강의와는 별개로 실전 예제도 연재해 보려고 합니다.

익숙하지 않은 내용들이겠지만 실전 예제를 통해 공부하는 것도 큰 도움이 될 것이라 생각합니다.

같이 진행되는 엑셀 VBA 기초 강의와는 번외적인 내용으로, 진도에 맞지 않는 점 인지하여 주시기 바랍니다.




엑셀 VBA는 매우 강력한 프로그래밍 툴으로써, 외부파일과 연계도 가능합니다.


이번 포스팅은 텍스트 파일을 엑셀에 입력하는 예제를 소개해드리도록 하겠습니다.





위와 같이 열과 열이 일정한 관계를 갖고 있는 텍스트 파일의 경우, 동일한 배열으로 엑셀에 옮겨담을 수 있습니다.


위의 텍스트 파일은 열 간의 간격이 탭키로 설정되어 있지만, 콤마( , ), 세미콜론( ; ) 등 뿐만 아니라 어떠한 규칙도 그 규칙이 일정 하다면 충분히 엑셀로 옮길 수 있습니다.


이 텍스트 파일의 첫번째 줄을 제외하고 숫자부분을 열에 맞춰서 엑셀에 옮기고자 합니다.


이 명령을 실행하는 엑셀 VBA 코드는 아래와 같습니다.


Sub text_to_excel()

    Const loadf As Long = 2             '텍스트 파일 속에서 가져와야 하는 시작하는 행 위치

    Const loadt As Long = 99999            '텍스트 파일 속에서 가져와야 하는 마지막 행 위치보다 큰 값을 설정

    Dim strFileName As String              '텍스트 파일 이름 설정

    Dim objText As Object           '텍스트 문서 값 개체변수

    Dim i As Long                       '변하는 행값 변수

    Dim varValue As Variant           '엑셀에 입력되는 값

    

    

    

    Application.ScreenUpdating = False


    With Application.FileDialog(msoFileDialogFilePicker)

                             .Show              '파일피커 열기

        If .SelectedItems.Count = 0 Then        '아무것도 선택되지 않았을 경우 프로시저 종료

            Exit Sub

        Else

            strFileName = .SelectedItems(1)        '파일 이름 지정

        End If

    End With

    

    If Len(strFileName) > 0 Then                   '파일 이름의 길이가 0보다 크면 (파일이 존재하면)

        

        Set objText = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFileName, _

        IOMode:=1, Create:=False, Format:=-2)           '지정된 이름의 파일을 열기

        

        For i = 1 To loadt                      '지정한 행 수 만큼 반복하기

            If Not objText.AtEndOfStream Then           '텍스트파일의 끝이 아니라면

            If i < loadf Then                            '행의 위치가 지정된 시작 행(loadf)보다 작다면

            objText.skipline                            '그 행을 뛰어 넘는다

            Else

                varValue = Split(objText.ReadLine, vbTab)         '텍스트파일의 한 행의 값을 탭으로 분리해서 가져온다    

'vbTab을 "," ";" " " 등으로 바꿔서 사용할 수 있다.

                Cells(Rows.Count, 1).End(3)(2).Resize(, UBound(varValue) + 1) = varValue        '셀에 텍스트파일 값을 넣기                  

            End If

            End If

        Next i

    End If

       objText.Close

    Set objText = Nothing

    

End Sub



위 엑셀 vba 프로시저를 끝낸 후 엑셀에 출력되는 값은 아래와 같습니다.




만약에 특정 열의 값만 추출하고 싶다면 파란색으로 표시된 varValue 를 varValue(숫자) 로 바꿔주시고, 주황색으로 표시된 UBound(varValue)+1 부분을 1로 바꿔주시면 됩니다.   


varValue의 숫자값은 0부터 시작하는 정수가 되어야 합니다.


예를 들자면, varValue(1)는 2번째 열만 가져오게 됩니다.


이러한 방법을 통해서 텍스트 파일을 엑셀으로 옮겨올 수 있습니다.





그냥 넘어가긴 아쉬우니 제가 엑셀 VBA에서 자주 쓰는 간단한 편법을 하나 공개하도록 하겠습니다.


엑셀 VBA에서는 Worksheetfunction을 사용해서 엑셀 고유의 함수 기능을 구현할 수 있습니다.


하지만 Worksheetfunction을 굳이 사용하지 않고 엑셀 함수를 적용할 수 있는 방법 또한 존재합니다.


예를 들어 텍스트 파일의 2번째 열만 추출해서 평균값을 "E2"셀에 넣고, 평균값을 제외한 모든 값을 삭제해 보겠습니다.


Sub text_to_excel()

    Const loadf As Long = 2             '텍스트 파일 속에서 가져와야 하는 시작하는 행 위치

    Const loadt As Long = 99999            '텍스트 파일 속에서 가져와야 하는 마지막 행 위치보다 큰 값을 설정

    Dim strFileName As String              '텍스트 파일 이름 설정

    Dim objText As Object           '텍스트 문서 값 개체변수

    Dim i As Long                       '변하는 행값 변수

    Dim varValue As Variant           '엑셀에 입력되는 값

    

    

    

    Application.ScreenUpdating = False


    With Application.FileDialog(msoFileDialogFilePicker)

                             .Show              '파일피커 열기

        If .SelectedItems.Count = 0 Then        '아무것도 선택되지 않았을 경우 프로시저 종료

            Exit Sub

        Else

            strFileName = .SelectedItems(1)        '파일 이름 지정

        End If

    End With

    

    If Len(strFileName) > 0 Then                   '파일 이름의 길이가 0보다 크면 (파일이 존재하면)

        

        Set objText = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFileName, _

        IOMode:=1, Create:=False, Format:=-2)           '지정된 이름의 파일을 열기

        

        For i = 1 To loadt                      '지정한 행 수 만큼 반복하기

            If Not objText.AtEndOfStream Then           '텍스트파일의 끝이 아니라면

            If i < loadf Then

            objText.skipline

            Else

                varValue = Split(objText.ReadLine, vbTab)         '텍스트파일의 한 행의 값을 탭으로 분리해서 가져온다

                Cells(Rows.Count, 1).End(3)(2).Resize(, 1) = varValue(1)        '셀에 텍스트파일 값을 넣기      '

            End If

            End If

        Next i

    End If

        objText.Close

  '(a2:a99999) 값은 평균 낼 데이터를 포함하는 범위

        Cells(2, 5).value = "=average(a2:a99999)"                'average 함수식을 셀(E5)에 집어넣는다

        Cells(2, 5).value = Cells(2, 5).value                         '출력된 함수값을 일반 형식의 값으로 바꾼다.

        Range("a2:a99999").Value = ""                                 '텍스트파일에서 추출한 데이터를 삭제한다

    Set objText = Nothing

    

End Sub


초록색으로 표시된 부분이 추가된 부분입니다.


특정 셀에 함수식을 넣는 것만으로 함수식의 결과값을 얻어낼 수 있습니다.


average 함수 뿐만 아니라 엑셀의 모든 함수를 사용할 수 있습니다.


하지만 편법이다 보니 광범위하게 사용하기는 힘듭니다.


이런 방법도 있구나.. 하고 알아두시면 됩니다.


Worksheetfunction에 대한 내용은 추후에 엑셀 기초강의에서 다루도록 하겠습니다.











Posted by Simon K
:


[엑셀 VBA #7] SELECT CASE 조건문 활용하기



이번 시간에는 조건이 많을 경우 사용되는 SELECT CASE 조건문에 대해 알아보겠습니다.

조건문을 처음 접하시는 분은 저번 포스팅(if~else 조건문)을 먼저 읽어 보시고 시작해주세요.


늘 그렇듯이 예제와 함께 시작하겠습니다.

숨겨진 시트에 과거 포스팅 내용들이 담겨있습니다.







이번 예제는 지난번 예제와 비슷합니다.

학생의 점수 구간 별로 등급을 매기는 엑셀 VBA입니다.


SELECT CASE 조건문의 구조는 아래와 같습니다.


Select case 변수


case n1


명령


case n2


명령2


...


End Select


즉, 변수의 값을 케이스별로 구분해서 명령을 내린다는 뜻입니다.


예제를 살펴보겠습니다.


Dim i As Byte

Dim p As Byte


For i = 3 To 17 Step 1

p = Sheet6.Cells(i,2).Value


Select Case p

Case Is >= 90

Sheet6.Cells(i, 3).Value = "A"

Case Is >= 70

Sheet6.Cells(i, 3).Value = "B"

Case Is >= 50

Sheet6.Cells(i, 3).Value = "C"

Case Is >= 30

Sheet6.Cells(i, 3).Value = "D"

Case Is < 30

Sheet6.Cells(i, 3).Value = "F"


End Select


Next i


조건이 단순한 값인 경우에는 'Case a' 처럼 쓸 수 있지만,


조건을 범위로 둘 경우, 'Case is ~~'라고 작성해야 합니다.


또 한가지 주의해야 할 점으로, Select Case 문 역시 여타 엑셀 VBA 문법처럼 위에서 아래로 내려가는 실행 구조를 갖고 있습니다.


따라서 If~Else문과 같이, 합집합의 범위가 가장 작은 조건부터 작성해야 합니다.


간단하게 오류가 나는 예를 들어보겠습니다.


Dim i As Byte

Dim p As Byte


For i = 3 To 17 Step 1

p = Sheet6.Cells(i, 2).Value


Select Case p

Case Is < 30

Sheet6.Cells(i, 3).Value = "F"

Case Is >= 30

Sheet6.Cells(i, 3).Value = "D"

Case Is >= 50

Sheet6.Cells(i, 3).Value = "C"

Case Is >= 70

Sheet6.Cells(i, 3).Value = "B"

Case Is >= 90

Sheet6.Cells(i, 3).Value = "A"


End Select


Next i


위 예제가 앞서 보여드린 예제와 다른 점은 조건의 순서가 바뀐 것입니다.


이 예제에는 30보다 크거나 같은 조건을 앞에다 위치시켰습니다.


이런 경우에는 30보다 큰 모든 값이 D로 표시되게 됩니다.


F8을 눌러서 순차적으로 실행해 보면 알 수 있겠지만, Select Case문 같은 경우, 조건에 맞는 Case를 찾게 되면 명령을 실행한 후 바로 End Select로 넘어가게 됩니다.


따라서 각 조건의 관계는 아래 그림과 같이 형성되야 합니다.

A에서 D까지의 순서로 조건을 지정해 주어야 오류를 방지할 수 있습니다.


A의 조건을 먼저 실행하고 나면 그 다음 B 조건의 실제 범위는 A를 포함하지 않는 B의 범위가 됩니다.


따라서 조건이 서로 겹치지 않게 됩니다.





엑셀 VBA에서 가장 중요하고 기초가 되는 문법이 조건문과 반복문입니다.


꼭! 이해하고 넘어가 주세요.


다음 포스팅부터는 아주 조금 난이도를 높혀서 진행하도록 하겠습니다.













Posted by Simon K
:


[엑셀 VBA #6] IF~ELSE 조건문 활용하기




엑셀 VBA의 조건문은 두 가지로 분류될 수 있습니다.

첫째는 IF~ELSE문, 둘째는 CASE 문 입니다.

이번 포스팅에서는 조건문 중 하나인 IF~ELSE문에 대해 알아보도록 하겠습니다.


이번에도 마찬가지로 예제와 함께 시작하겠습니다.

시트 숨김을 해제하시면 이전 예제들도 확인할 수 있습니다.






이번 예제는 조건에 맞는 셀에 색상을 입히는 엑셀 VBA입니다.


위 예제는 조건문과 반복문이 같이 응용된 구조입니다.


IF~ELSE 조건문은 일반적으로 아래와 같이 구성됩니다.


If 조건1 and 조건2 ... 조건n


명령


else


명령


end if


상황에 따라 여러가지 조건을 부여할 수 있습니다.

조건식은 논리연산식을 기초로 합니다.


엑셀 VBA의 IF~ELSE 조건문은 엑셀 자체의 함수와 비슷합니다.

다만 단순 연산이 아닌 명령을 실행하는 데에 엑셀 자체 기능은 한계가 있기 때문에 그런 경우에 엑셀 VBA로 사용합니다.


예제의 코드를 살펴보겠습니다.


Dim i As Byte


For i = 3 To 10 Step 1           '3번째 행부터 10번째 행까지 색을 입혀야 하기 때문에 행을 i 로 하는 반복문을 만듭니다.


If Sheet5.Cells(i, 2).Value <= 60 Then                '셀의 값이 60보다 작거나 같을 경우

Sheet5.Cells(i, 1).Interior.Color = RGB(100,100,100)                '왼쪽 셀의 색깔을 RGB(100,100,100)으로 바꿉니다.

Else                   '60보다 같거나 작은 경우, 60보다 큰 경우, 두 가지뿐이 없기 때문에 Else 이하 명령은 생략합니다.

End If


Next i








두 번째 예제는 엑셀 VBA의 IF~ELSE 문을 활용한 다중조건문입니다.

엑셀 자체의 IF 함수에 다중 조건문을 형성할 수 있는 것처럼, 엑셀 VBA의 IF~ELSE 조건문도 다중으로 구성할 수 있습니다.


Dim i As Byte


For i = 14 To 21 Step 1


    If Sheet5.Cells(i, 2).Value = 0 Then

    Sheet5.Cells(i, 1).Interior.Color = RGB(100, 10, 10)


    Else

    

        If Sheet5.Cells(i, 2).Value = 100 Then

        Sheet5.Cells(i, 1).Interior.Color = RGB(200, 200, 200)

        

        Else

            If Sheet5.Cells(i, 2).Value <= 60 Then

            Sheet5.Cells(i, 1).Interior.Color = RGB(100, 100, 100)

            Else

            End If

        End If

    

    End If

        

Next i


잘 보시면 위의 식과 순서가 바뀌어있습니다.

값이 60보다 작거나 같을 경우를 가장 아래에 놓은 이유는, 0 또한 60보다 작거나 같을 경우에 해당하기 때문입니다.

따라서 조건이 가장 작고 다른 조건과 교집합이 존재하지 않는 조건을 가장 앞에 둬야 합니다.




사실 엑셀 VBA의 IF~ELSE문은 조건이 여러개일 경우 적합하지 않습니다.

식도 길어지고 제한이 많이 있습니다.

따라서 조건이 여러개일 경우에는 CASE문을 사용하는 것이 알맞습니다.


다음 포스팅은 CASE 조건문을 사용한 다중 조건문에 대해 알아보겠습니다.








Posted by Simon K
:


[엑셀 VBA #5] FOR~NEXT 반복문 응용하기



지난번 엑셀 VBA 포스팅에선 DO~LOOP문을 이용한 반복문에 대해서 배웠습니다.

이번 포스팅은 비슷하지만 다른 FOR~NEXT 문을 이용한 반복문에 대해 배워보겠습니다.


DO~LOOP 반복문은 변수를 여러개 지정해서 다소 복잡한 반복문을 작성하기에 적합하고,

FOR~NEXT 반복문은 변수를 한개만 사용하는 반복문에 적합합니다.

보통의 경우엔, 두 반복문 모두 같은 상황에 사욜할 수 있습니다.


이번에도 예제를 통해 알아보겠습니다.

난이도가 어렵지 않은 만큼, 이번 포스팅은 비교적 짧습니다.



예제3파일과 함께 따라와주세요.

이전과 같이 시트 숨김을 해제하시면 과거 내용들도 확인하실 수 있습니다.






이번 예제는 숫자가 1부터 2배의 등비급수로 증가한다고 할 때 100번 증가했을때의 값을 구하는 엑셀 VBA입니다.


쉽게 말하면, 1, 2, 4, 8, 16, 32, 64, 128, 256 ....  이런 식으로 숫자가 증가한다고 했을 시, 100번째 숫자를 구하는 방법입니다.


FOR~NEXT 반복문은 아래와 같이 구성되어 있습니다.



FOR i = 1 to 100 Step 1



명령


NEXT i



예제를 바로 살펴보겠습니다.


Dim i As Byte

Dim a As Double            '숫자가 얼마나 커질지 모르니 DOUBLE을 선언합니다.


a = 1


FOR i = 1 To 100 Step 1            'step 뒤 숫자는 i 가 1씩 증가한다는 의미


a = a * 2


NEXT i


Sheet4.cells(3, 2).value = a            '지정 셀에 값을 출력

MsgBox "FOR~NEXT문을 이용한 결과값은" & a & "입니다."            '팝업창 생성



정말 간단합니다.


FOR과 NEXT 코드 사이에

반복될 명령을 넣어주면 됩니다.


DO~LOOP문과의 차이점을 알아보기 위해, DO~LOOP문으로 똑같은 값을 출력하는 코드를 작성해 보겠습니다.


Dim i As Byte

Dim a As Double


a = 1

i = 1


DO

a = a * 2

i = i + 1

LOOP WHILE i <= 100


Sheet4.cells(3, 3).value = a

MsgBox "DO~LOOP문을 이용한 결과값은 "& a & "입니다."








엑셀 VBA에 있어, 반복문의 응용법은 무궁무진합니다.


그만큼 사용도가 높고 꼭 이해를 하고 넘어가야 하는 코드입니다.


이후의 엑셀 VBA 포스팅은 기본적으로 반복문이 들어가게 되니 확실히 이해를 하고 넘어가세요.


다음 포스팅은 조건문에 대해 알아보도록 하겠습니다.






Posted by Simon K
:

이전 포스팅 바로가기

[엑셀 VBA #3] 변수 종류와 선언, 활용법


[엑셀 VBA #4] 변수를 이용한 DO~LOOP 반복문 응용






반복문은 엑셀 VBA의 기본중의 기본이라고 할 수 있습니다.

이번 포스팅에서는 DO~LOOP문을 사용한 반복문에 대해 알아보겠습니다.

저번 포스팅과 같이 예제2 파일을 받고 따라와 주세요.

예제속에 있는 코드를 먼저 분석해 보시고 공부하시면 이해하기 훨씬 수월합니다.

예제 파일 속에는 지난 예제들이 모두 수록되있습니다. (숨김 해제하시면 됩니다.)



예제2.xlsm





DO는 '하다', LOOP는 '반복'을 의미합니다.

DO~LOOP 반복문은 아래와 같이 구성되어 있습니다.


DO

명령1

명령2

명령3

.....

변수 = 변수 +(-) X

LOOP WHILE 조건


즉, 아래에 있는 조건에 부합할 때에, DO 아래, LOOP 위에 있는 명령을 반복 시행한다는 의미입니다.

하지만 DO~LOOP 반복문은 조건문과 비슷해 보이지만 대체할 수 없습니다.

엑셀 VBA는 기본적으로 위에서 아래로 순차적으로 명령을 수행합니다.

따라서 조건에 부합하지 않더라도, LOOP 문이 읽히기 전에는 DO 문 아래에 위치한 명령이 최소 1회는 실행되게 됩니다.


예를 들어, 아래와 같은 코드를 실행했을 경우,



Sub test()


x = 110


DO

msgbox "x는 100보다 큽니다."            'msgbox문은 화면에 팝업창을 띄우는 코드입니다.

x = x - 1

LOOP WHILE X > 100


End Sub


x의 기본값은 110이고, LOOP WHILE 뒤에 붙은 조건은 X > 100 이기때문에,

"x는 100보다 큽니다." 라는 팝업이 10번 생성됩니다.

하지만 코드가 아래와 같다면 어떨까요?


Sub text ()


x = 99


DO

msgbox "x는 100보다 큽니다."

x = x - 1

LOOP WHILE X > 100


End Sub


위 코드의 경우, x의 기본값 자체가 99이고 LOOP WHILE 뒤에 붙은 조건에 부합하지 않습니다.

하지만 코드를 실행했을 경우, 조건에 부합하지 않음에도 불구하고 팝업창이 한번 뜨게 됩니다.

따라서 DO~LOOP문은, 명령을 일단 한번 실행한 후, 조건에 맞는 경우 코드를 반복하는 문법이라고 생각하면 됩니다.


VBA 실행창에서 F8을 눌러서 순차적으로 코드를 실행해보세요.






DO~LOOP문을 이용한 반복문 이중구조


엑셀 VBA 코드를 작성하다 보면 한 개의 반복문만으로 부족한 경우가 생기게 됩니다.

이러한 경우에 DO~LOOP문 밖에 DO~LOOP문을 한번 더 사용하여, 반복문 이중구조를 구성할 수 있습니다.

예제2 속의 예제가 반복문 이중구조의 대표적인 예입니다.




예제는 위에 보이는 버튼을 누르면 우측 상자에 좌측 상자와 같이 피라미드식으로 숫자 열이 생성되는 로직입니다.


예제의 로직을 차근차근 살펴보겠습니다.




1. 변수 선언


먼저 Dim 문을 사용해 사용할 변수를 선언합니다.

255가 넘어갈 수 없는 숫자기이 때문에 메모리 용량이 가작 작은 Byte로 선언했습니다.


위 반복문을 실행하기 전에 사용해야 할 변수는 총 몇개일까요?

변수란 말 그대로 '변하는 수'입니다.

따라서 로직 속에서 변하는 수를 생각하면 쉽게 구할 수 있습니다.


1. 각 숫자가 위치해야할 행 i

2. 각 숫자가 위치해야할 열 p

3. 각 행에 들어가야할 숫자 개수 x

4. 입력되야하는 값 y

5. 반복 수 i (1번과 같은 값을 사용합니다)


Sub example_2


Dim i As Byte

Dim p As Byte

Dim x As Byte

Dim y As Byte


따라서 위와 같이 변수 선언을 합니다.





2. 기본 값 설정


반복문을 실행하기 전에 반복문이 실행되는 위치와, 출력할 첫 번째 값을 설정해야 합니다.

위의 예제 속에서 처음 값이 출력되야 하는 위치는 K2셀이고, 이를 좌표로 환산하면 (2, 11)입니다.

따라서 행값 i 는 2, 열값 p 는 11을 줍니다.

그리고 첫 행에 한 개의 숫자가 들어가기 때문에 숫자 개수값 x는 1이 되고, 첫 항에 들어가는 값이 1이기 때문에 값 y 또한 1이 됩니다.


i = 2

p = 11

x = 1

y = 1



이제 첫 항을 설정 했으니, 본격적으로 DO~LOOP 반복문을 집어넣습니다.





3. 매 행에 적정 개수의 수를 입력하는 DO~LOOP문 입력


위에 설명했듯이, 이번 예제는 DO~LOOP 이중구조를 갖고 있습니다.

따라서 DO~LOOP문 안에 또 다른 DO~LOOP문이 들어가는 구조를 형성합니다.


먼저 안쪽에 들어가는 반복문을 작성합니다.


Do

Sheet3.cells(i, p).Value = y

p = p + 1

y = y + 1

x = x + 1

Loop While x<i





4. 다음 행으로 넘어가는 DO~LOOP문 입력


위 반복문 밖에 다음 행으로 진행시키는 반복문을 작성합니다.


Do

i = i + 1        '다음 행으로 진행시키는 코드

y = 1        '출력 값 초기화 (행이 바뀌면 1부터 다시 시작해야하기 때문)

p = 11        '출력 열 위치 초기화 (첫 열부터 다시 입력해야하기 때문)

x = 1        '반복 횟수 초기화

Loop While i < 11        '10번째 행까지만 입력하도록 제한





5. 반복문 합치기


두 반복문을 합쳐줍니다.


Do


Do

Sheet3.cells(i, p).Value = y

p = p + 1

y = y + 1

x = x + 1

Loop While x < i


i = i + 1

y = 1

p = 11

x = 1

Loop while i < 11






6. 코드 완성

Sub example_2()

Dim i As Byte

Dim p As Byte

Dim x As Byte

Dim y As Byte

i = 2             

p = 11         

x = 1            

y = 1            


Do                                   

            Do                        

            Sheet3.Cells(i, p).Value = y

            p = p + 1

            y = y + 1

            x = x + 1

            Loop While x < i


i = i + 1            

y = 1                   

p = 11                

x = 1

Loop While i < 11            

End Sub











DO~LOOP 반복문은 정말 간단하지만, 이중구조로 되어있을 경우 사뭇 복잡해 보입니다.

예제 코드를 연구해 보시고, 숫자를 바꿔서 여러번 시도해 보세요.

그리고 자신만의 코드를 구상해서 반복문을 구현해 보시면 확실히 이해하실 수 있을겁니다.

궁금한 점이나 질문은 댓글로 남겨주시기 바랍니다.












Posted by Simon K
:

[엑셀 VBA #3] 변수 종류와 선언, 활용법




이번 포스팅에선 엑셀 VBA에서 사용되는 변수 종류와 선언, 활용법에 대해 알아보겠습니다.

시작에 앞서 아래 파일을 클릭해서 예제1 파일을 받고 차근차근 따라와 주세요.



예제1.xlsm


변수는 프로그래밍에서 빠질 수 없는 요소로써, 엑셀 VBA를 시작하는 단계에서 확실히 잡고 넘어가야 합니다.

변수의 종류와 성격에 대해 간략하게 표로 만들어봤습니다.






   ※파일에 엑셀 형식으로 저장되어 있습니다.




엑셀 VBA에서 변수를 선언하는 이유


위의 표에서 알 수 있듯이, 각 변수에는 할당된 메모리 용량이 있습니다.

Byte의 경우 1바이트의 용량을 할당받지만, Variant의 경우 무려 16바이트의 용량을 할당받습니다.

변수 설정을 하지 않는 경우에는 Variant 변수로 설정이 됩니다.

엑셀 VBA 프로젝트를 교실로 비유한다면, 변수는 학생들의 책상과 같습니다.

마른 학생도 있고 뚱뚱한 학생들도 있겠죠?

교실에 가장 많은 학생을 수용하려면 마른 학생에겐 작은 의자를, 뚱뚱한 학생에겐 넓은 의자를 배정해주어야 합니다.

따라서 1, 33, 45, 100 과 같이 0과 255 사이의 숫자가 변수로 예상될 때에는, 작은 의자에 해당되는 Byte 변수로 지정해 주면 되는것입니다.

즉, 메모리 활용을 효율적으로 하기 위해 변수 선언은 꼭 필요합니다.


또한, 변수간의 혼동 예방, 숫자 연산의 정확성 등등 여러 이유로 변수 선언은 엑셀 VBA 작성에 앞서서 필히 행해져야 하는 과정입니다.




엑셀 VBA 변수 선언 방법



예제1 파일에서 ALT + F11로 VBA 관리자 화면에 접근하시면 코드를 확인하실 수 있습니다.

변수 선언의 기본적인 방법은 아래와 같습니다.


Dim 변수이름 As 변수종류





각 변수가 출력하는 값의 형식


a라는 변수에 똑같이 숫자 1을 값으로 지정해 준다고 하여도, 변수 타입을 어떻게 지정해주었는지에 따라 출력되는 값이 바뀌게 됩니다.

예제1 파일에서 설정 값을 0으로 주고 각 변수 종류별 출력 값을 알아보겠습니다.







위의 예제에서 알 수 있듯이, 똑같이 '0'을 값으로 지정해 주었지만, 출력되는 값은 상이합니다.

범위를 초과하는 값을 지정할 경우 할당된 메모리 용량을 벗어나게 되고, 에러가 발생하게 됩니다.

예제를 활용하여 여러 값을 지정해 보고 출력되는 값을 알아보세요.




숫자와 관련된 변수 종류(Byte, Integer, Long, Single, Double, Currency)


숫자와 관련된 변수를 사용할 때에는, 기본적으로 각 변수 형식이 허용하는 범위만 유념하면 됩니다.

일반적으로 Integer, Double 변수가 많이 사용됩니다.





문자와 관련된 변수 String


문자를 변수로 지정하려면 String으로 변수를 선언해야 합니다.

숫자를 String으로 지정하면 숫자를 문자로 인식합니다.

a라는 변수를 String으로 선언하고 값을 1으로 지정했을 때 , a + a 라는 연산을 수행하게 되면 출력되는 값은 2가 아닌 11입니다.




논리값 변수 형식 Boolean


변수를 Boolean으로 선언하게 되면 True, False 두 가지 값만 출력하게 됩니다.

기본 값은 False이며, 0을 제외한 모든 숫자를 값으로 지정할 경우 True를 출력합니다.





날짜 및 시간 변수 형식 Date


Date 형식은 사무용 엑셀을 만들 때 가장 많이 쓰는 형식 중 하나입니다.

0부터 2958465까지의 숫자와 1900년 1월 1일부터 9999년 12월 31일까지의 날짜가 1:1 대응합니다.

따라서 날짜와 숫자간의 연산이 가능합니다.

예를 들어 1900-01-01 에 1을 더하면 1900-01-02가 됩니다.





개체변수 Object 변수


엑셀 VBA를 사용하다 보면 범위, 워크시트 등을 변수로 지정해야 하는 상황이 옵니다.

예를 들어 개체의 위치 Workbook("예제1).Worksheets("예제1").range("A1") 를 변수 a라고 지정하고 Object로 선언하게 되면,

a.value 는 workbook("예제1").worksheets("예제1").range("A1").value과 같은 값을 갖게 됩니다.

코드가 어느정도 복잡해 지면 로딩시 속도가 현저히 느려지게 되는데, Object 변수를 잘 활용하면 속도 저하를 방지할 수 있습니다.





변수 선언은 엑셀 VBA에 있어 기초가 되는 과정입니다.

단순한 숫자나 문자는 굳이 선언이 필요 없지만(자동으로 Variant로 지정되기 때문에), 적당한 변수 선언을 하는 습관을 길러야 나중에 메모리 부족으로 인한 불상사를 방지할 수 있습니다.


다음 포스팅은 본격적으로 변수를 활용하는 반복문에 대해 알아보도록 하겠습니다.

엑셀 예제1의 VBA 관리자에 반복문에 대한 힌트를 수록하였으니 확인해보세요.









Icon made by Freepik from www.flaticon.com






Posted by Simon K
:


조립식 컴퓨터 구매, 현명하게 하는 팁.

조립식 컴퓨터가 대중에게 친숙해 지면서 대기업 컴퓨터는 일반 소비자 시장에서 설 자리를 잃었다

하지만 컴퓨터를 많이 다뤄본 사람이 아닌 이상 어떤 부품을, 어디에서 사야 하는지 결정하기 쉽지 않은 것이 현실이다.

본 포스팅에서는 초보자도 이해할 수 있도록 조립식 컴퓨터 구매를 현명하게 하는 팁에 대해 설명하겠다.





1. 컴퓨터를 사려는 목적을 확인하자.


아무리 좋은 컴퓨터를 시세보다 낮은 가격에 맞췄다고 하더라도, 용도에 맞지 않는 제품을 샀다면 낭비가 된다.

컴퓨터는 절대로 고사양일수록 무조건 좋다고 할 수 없다.

일반적으로 컴퓨터의 성능이 높아질 수록, 컴퓨터의 전력 소비량과 발열량, 소음 또한 커지게 된다.


예를 들어서, 필자는 한창 게임을 자주할 때 그래픽카드를 20만원이 넘는 라데온 r9 280x를 사용했으나, 점점 게임을 안하게 되고 원래 쓰던 280x를 팔고 4만원에 지포스 GTX650을 구매해서 쓰고 있다.


만약 20만원이 넘는 라데온 r9 280x가 나중에 구매한 4만원짜리 GTX650과 단순히 16만원어치의 성능 차이만을 보여준다면, 돈이 모자라지 않는 이상, 굳이 저렴한 모델로 바꿀 필요는 없다.


하지만 성능 이외의 요소를 비교해 보자.



 

 최대 소비 전력

IDLE 온도 

풀로드 온도 

팬 소음 

고주파 소음 

코일 떨림 소음 

 라데온 r9 280x

 200W

 40℃

 80℃

 대체적으로 큼

 대체적으로 있는 편

 대체적으로 있는 편

 지포스 GTX 650

 70W

 32℃

 60℃

 거의 없음

 거의 없음

 거의 없음

※ 위의 모든 사항은 시스템 구성에 따라 다를 수 있다.


물론 r9 280x의 성능은 GTX650의 그것과는 비교 대상이 되지 않는다.

하지만 성능 이외의 부분은 오히려 저렴한 저가형 모델이 앞서고 있는 것을 알 수 있다.


따라서, 용도에 맞지 않는 제품을 구매했을 경우, 컴퓨터가 '비싼 쓰레기'로 전락해 버릴 수 있다는 점을 유념해야 한다.

오버클럭을 하지도 않을거면서 오버클럭에 특화된 메인보드와 CPU를 구매하거나, 고사양 게임을 하지도 않는데 비싼 그래픽카드를 구매하는 등의 행위가 이에 해당한다.


따라서 자신이 컴퓨터를 사용하는 목적을 확인하고, 검색을 하던지 지인에게 물어보던지 해서 적절한 사양의 컴퓨터를 구매하는 것이 현명하다.





2. 고성능일수록 좋다? 절대 아니다.






 

위 내용의 확장이긴 하지만, 두 번 얘기하는 만큼 이 점은 굉장히 중요하다.

고성능 피씨일수록 소음과 발열이 심할 확률이 높아지게 된다.

소음에 민감한 사람이라면 위 동영상과 같은 소음은 견딜수가 없다.


고사양 그래픽카드일수록 고주파음, 코일떨림음 증상을 나타내기 쉽다.

고사양 부품일수록 설계가 복잡하고 전력 소모가 많아지게 되며, 어느정도의 소음은 당연히 발생하게 된다.

두 번 강조하는 만큼, 단순히 성능만으로 컴퓨터 구매를 판단하면 안된다.


하지만, 성능이 같다면 일반적으로 가격이 높은 제품이 소음, 발열, 기타 요소 등에서 더 나은 제품이긴 하다.


이제 본격적으로 조립식 컴퓨터 구매시 각 부품별로 유의해야할 점에 대해 살펴보겠다.





3. 조립식 컴퓨터 구매시 부품 별 유의사항




1. 파워서플라이


파워서플라이는 인체로 따지면 심장이라고 할 수 있다. 그 만큼 중요한 부품이다.


① 정격 출력량과 효율


파워 구매시 가장 중요하게 고려해야할 요소는 당연히 정격 출력량이다.

표기 출력량과 정격 출력량은 다르다.

표기 출력량은 말장난에 불과하다.

꼭 정격 출력량을 확인해야 한다.

하지만 파워에는 효율이라는 것이 있다.

똑같은 정격 500W짜리 파워여도 전력 대비 효율이 상이하다.

파워 효율은 브론즈, 실버, 골드 등등의 등급 순으로 높은 효율을 보여주는데, 브론즈 등급만 되어도 충분히 좋은 파워이다.

일반 가정 사용자의 경우 500W 브론즈만 사용해도 무방하다.

파워 효율과 파워의 성능(출력 능력)은 큰 상관이 없다.

80% 효율의 파워는 500W의 출력을 내기 위해 625W의 전력이 필요하고,

90% 효율의 파워는 동일 출력을 내기 위해 556W의 전력이 필요하다.

효율의 의미는 그 이상 그 이하도 아니다.


사실, 일반 사용자라면 체감할 만한 전력 차이는 아니다.



② APFC가 장착되어 있는 제품인지 확인하자.


APFC는 액티브 PFC라고도 불리고, 패시브 PFC와 비교된다.

요즘 나오는 제품은 대부분 APFC를 사용하고 있다.

APFC를 채용하게 되면 회로단에 비교적 고급의 부품을 사용할 수 밖에 없다.

따라서 단순히 액티브 PFC인지, 패시브 PFC인지만 따져도 어느정도 괜찮은 제품인지 확인할 수 있다.

패시브 PFC 제품은 피하자.


2. 메인보드(마더보드)


메인보드(마더보드)는 인체로 따지면 골격에 가깝다.


① 자신이 사용하는 부품을 수용할 수 있는지 확인하자


보통 메인보드는 소형 사이즈인 m-ATX와 일반 사이즈인 ATX 사이즈 두 가지로 출시된다.

소형 사이즈 메인보드는 보통 2 개의 램 슬롯만 지원하며, ATX 사이즈에 비해 제한된 기능을 제공한다.

다만, 일반 사용자의 경우 케이스가 크더라도 m-ATX 사이즈의 메인보드를 구매해도 무방하다.


또한 CPU 소켓이 자신이 구매하는 CPU의 소켓과 일치하는지 확인해야 한다.

외장 랜카드나 사운드 카드를 사용한다면 여유분 PCI 슬롯이 있는지, 자신이 PS/2 방식의 키보드와 마우스를 사용한다면.

2개의 PS/2 단자를 지원하는지. 꼼꼼히 확인해야 한다.


② 오버클럭을 지원하는지, 크로스파이어/SLI를 지원하는지 확인하자.


보통 씨피유는 인텔 기준으로 오버클럭을 지원하는 모델인 k 버전과 오버클럭을 지원하지 않는 non-k 버전이 있다.

자신이 오버클럭을 지원하는 CPU를 사용하며, 오버클럭을 하고싶은 경우 필히 지원하는 메인보드를 구매해야 한다.

그래픽카드를 두 개 연결해서 사용하는 크로스파이어와 SLI도 마찬가지다. PCI-E 슬롯을 두 개 이상 지원하는 보드를 찾아야 한다.


이런 기능을 사용하는 사용자라면 어느정도 관련 지식은 있을 것이라 생각하고 이에 대한 자세한 설명은 생략하겠다.


3. CPU와 쿨러


CPU는 두뇌와 같다. PC 성능에 가장 큰 영향을 미친다.


① CPU 소켓이 메인보드 소켓과 일치하는지 확인하자.


위 메인보드 편에서도 말했듯이, 소켓이 일치하지 않으면 아무리 좋은 CPU여도 사용 자체가 불가능하다.


② 굳이 최상위 모델을 구매할 필요는 없다.


린필드 이후로 샌디브릿지, 아이비브릿지, 하스웰, 하스웰 리프레시, 스카이레이크의 성능 격차는 그렇게 크지 않다.

일반 사용자의 경우 샌디브릿지 i5-2500정도만 써도 충분하다.

또한 동일 라인업의 경우에도 여러 모델이 있는데,

하스웰의 경우 i5-4460, i5-4570의 성능 격차는 생각처럼 크지 않다.

일반 사용자가 체감을 느끼기 힘든 수준이다.

따라서 전문가가 아니라면 굳이 최상위 제품을 살 필요가 없다.


하지만 인텔 기준으로 팬티엄 G, i3, i5, i7 의 격차는 확연하게 존재한다.

알기 쉽게 얘기하자면 순서대로 경차, 준중형차, 중형차, 대형차와 비슷한데,

요즘 나오는 경차도 성능이 좋은 것처럼, 요즘 나오는 팬티엄 G 시리즈도 사무용 사용자에겐 충분한 성능을 제공하고 있다.

다만 고사양 게임을 어느정도 플레이한다면 i3 이상을 가주셔야 하고, i7는 전문가가 아닌 이상 전혀 필요 없다.


③ 오버클럭만 안한다면 기본 정품 쿨러도 충분하다.


굳이 쿨러에 돈 쓸 필요 없다.

하지만 발열에 민감한 사용자라면 사제 쿨러를 사용하는 것도 좋은 선택이다.

하지만 사제 쿨러를 장착하는 것 또한 관련 지식이 없는 사람에겐 쉽지 않다.

자신이 오버클럭을 안하고, 발열에 엄청 민감하지 않다면, 인텔 정품 쿨러만 사용해도 무방하다.


4. 메모리카드(램, RAM)


램에 대해선 자세한 설명은 생략하겠다.

다다익램이라는 말이 있듯이, 일반 사용자에게 램은 용량이 높으면 장땡이다.


소켓이 맞는 소켓인지, 메인보드가 지원하는 라인업인지만 확인하면 된다.


하지만 다중 램을 구성할 때에는, 짝수를 맞춰서 같은 모델을 사용하는 것이 효율면에서 좋다. 큰 차이는 없다.


5. 저장장치 (하드디스크, SSD)


①하드디스크와 SSD를 비교해보자.


하드디스크와 SSD는 대표적인 컴퓨터 저장장치이지만, 두 부품은 완전 다른 부품이라 해도 무방하다.

데이터를 저장한다는 점은 같지만, 모양도, 성능도 확실한 구분이 있다.


가격대비 용량 면에서는 하드디스크가 우수하지만, SSD의 속도는 조금도 따라올 수 없다.

부품을 교체했을 때 가장 체감을 많이 느끼는 부품이 SSD라고 봐도 무방할 정도로 하드디스크와 SSD의 차이는 극명하다.


따라서 윈도우를 부팅하는 C드라이브만큼은 SSD를 사용하는 것이 좋다.



②SSD의 종류를 확인하자.


SSD의 종류는 다양하다. 제조사를 막론하고 대표적으로 TLC, MLC, SLC 세 가지 종류가 있다.

성능은 SLC가 가장 우수하고 TLC가 가장 저가형이다.


SLC는 가격이 너무 쎄서 일반 사용자가 사용하기에는 부적합하고, TLC는 사용해도 무방하지만 안정적이지 못하다.

솔직히 일반 사용자라면 TLC를 사용해도 상관 없지만 필자는 MLC를 사용하는 것을 추천한다.


TLC와 MLC, SLC의 세부적인 차이는 따로 설명하지 않겠다.


③SSD 컨트롤러를 확인하자.


SSD 컨트롤러는 대표적으로 인텔, 삼성, 마벨, 샌드포스, SMI등이 있는데, 마벨과 샌드포스가 많이 알려져있다.

마벨이 역사도 오래된 만큼 가장 안정적이라고 평가받고 있다.

마벨 컨트롤러가 탑재된 부품을 추천한다.


6. 그래픽카드(VGA)


게임, 그래픽작업을 전혀 하지 않는다면 요즘 나오는 CPU의 내장 그래픽 만으로도 충분하다.


①용도를 확인하자.


게임, 그래픽작업을 하지 않는 사용자는 그래픽카드가 필요 없다. CPU 내장 그래픽 만으로도 충분하다.

하지만 가끔 어느정도의 게임은 다들 하고 있기 때문에, 일반 사용자는 10만원 이내의 그래픽카드를 사용해도 충분하다.


그래픽카드는 컴퓨터 부품 중 소음과 발열이 가장 큰 부품이다.

위에도 말했듯이 성능이 높아질 수록 소음과 발열은 당연히 높아지게 된다.

자신의 용도에 맞는 적당한 그래픽카드를 구매하는 것이 가장 현명하다.


②NVIDIA와 AMD 라데온


예전에는 NVIDIA와 라데온이 인텔과 AMD cpu 만큼의 평가 차이를 보여준 적이 있었지만,

지금은 거의 대등한 상대로 평가되고 있다.


일반적으로 단순히 벤치마크 성능만 따진다면 가격대비 성능은 AMD 라데온이 우월하다.

하지만 각종 게임 최적화와 안정성은 아직은 NVIDIA가 조금 우세하다. (큰 차이는 없다.)


③성능만 중요한게 아니다.


그래픽카드를 구매할 때, 벤치마크 성능이 가장 중요한 지표로 사용되고 있다.

하지만 같은 성능의 그래픽카드여도 제품마다 어느정도의 가격 차이를 보이고 있다. 왜일까?

벤치마크 성능 뿐만 아니라, 소비전력, 소음억제성능, 쿨링성능, 디자인도 가격을 결정하고, 구매를 결정하는 큰 요소이다.

아무리 성능이 좋고 고사양 게임을 돌릴 수 있다고 하더라도, 컴퓨터에서 참을 수 없는 소리가 나면 말짱 도루묵이다.

실제로 성능이 비슷한 라데온 280x와 지포스 960gt는 거의 두배 가까이의 전력 소비차를 보여주고 있다.


따라서 조립식 컴퓨터 구매시 자신의 성향(소음, 발열에 민감한지)과 주변 환경(통풍이 잘되는지, 소음이 문제가 없는 환경인지)를 고려하고 선택해야 한다.






4. 결론


조립식 컴퓨터 구매에 있어 무엇보다 가장 중요한 것은 자신이 사용하는 용도에 맞는 컴퓨터를 구매하는 것이다.

돼지목에 진주목걸이란 말이 있듯이, 일반 사용자에게 100만원이 넘어가는 컴퓨터는 무의미하다.

가장 쉬운 방법은 컴퓨터를 잘 아는 지인에게 물어보는 것이다.

쿨앤조이와 플레이웨어즈 같은 컴퓨터 부품 관련 커뮤니티를 이용하는 것도 좋은 방법 중 하나이다.










본 포스팅에 사용된 아이콘 이미지는 www.flaticon.comFreepik에 의하여 제작되었습니다.

Icon made by Freepik from www.flaticon.com

'IT정보' 카테고리의 다른 글

[내 컴퓨터 진단하기] 컴퓨터가 느려졌을 때  (2) 2015.11.19
Posted by Simon K
: