현재 거의 모든 윈도우는 64bit로 MS-Office 설치시 32bit가 깔려 Excel ODBC Driver가 설치 안된경우가 있습니다.

그경우 아래 사이트에서  추가로  Microsoft Access Database Engine 2016를 설치후 사용가능

   ▶ MS Office 설치후 64 bit ODBC 확인방법

        1) 64bit odbc 실행

64bit odbc 열기

    2) 설치 드라이버 확인

64bit 엑셀 ODBC 설치 확인

       ※ 없으면 하단 프로그램 설치후 확인하면 추가 생김

 

   ▶ 64bit MS OFFICE ODBC 설치경로 : https://www.microsoft.com/ko-KR/download/details.aspx?id=54920 

 

Download Microsoft Access Database Engine 2016 재배포 가능 패키지 from Official Microsoft Download Center

중요! 아래에서 언어를 선택하면 전체 페이지 내용이 해당 언어로 신속하게 변경됩니다. 그리스어네덜란드어노르웨이어(복말)덴마크어독일어라트비아어러시아어루마니아어리투아니아어불가

www.microsoft.com

 

 

이전에 늘 무식하게 날짜  변경을 한듯 

 

1) 과거 처리 방법(무식하게 짜르고 하이픈(-) 붙이고 해서 날짜 타입을 만듬)

 

2) 현재 사용방법(텍스트 나누기 방법으로 사용)

    ※ 단계는 좀 있긴 한데 열별로 변환시 유용함

   - 데이터열을 선택 ->텍스트 나누기(한열씩 작업하여 다음열에 영향을 주지 않도록 해야됨 아니면 나눌때부터 처리) 

 

- 다음 후 텍스트 마법사  3단계중 3단계에서 -> 날짜를 선택하면 됨

- 최종 변경후 모습

run.vbs 파일  생성 

 

Dim Arg, var1, var2
Set Arg = WScript.arguments
var1 = Arg(0)
'var2 = Arg(1)  ==> 주석
msgbox var1

Set WshShell = CreateObject("WScript.Shell")
'WshShell.Run chr(34) & "C:\Windows\notepad.exe"  "D:\aaa.txt" & Chr(34),1     ==>주석 
WshShell.Run "notepad.exe " & var1       ==> chr(34)를 빼고 하니 됨
Set WshShell = Nothing

VB 참고 사이트

- 기본적인 문법이 잘되어 있음

https://docs.microsoft.com/ko-kr/dotnet/visual-basic/language-reference/

 

엑셀에서 다른 특이한거 하나는 행동을 코딩으로 나오는 매크로라 생각되어 진다.

행동을 기록하여 코딩으로 나온 소스를 보고 이해하고 이용하는것

엑셀도 하나의 좋은 DataBase 이다 .

엑셀파일을 DataBase 에 스키마와 동급이다

엑셀시트는 각각에 해당 테이블과 동급이다

그렇다면 엑셀시트를 query를 사용하여 쓸수 있을까? 쓸수 있다

사이트에서 일하다보면 엑셀로 무수히 많은 엑셀자료를 만들기는 하는데 이걸 참조해서 개발하는 개발자는 너무많은 자료에 치여사는경우가 많다 그래서 생각한것이 하나의 만들어놓은 엑셀에서 관련되어 있는 엑셀을 query를 실행하여 조회하는 메크로를 작성해보았다

전에 Database를 사용하기 위해서는 ODBC드라이버가 있어야된다고 했는데 ODBC드라이버를 확인해보자

 

1) ODBC설치 확인(기본으로 OFFICE를 설치하면 설치된는것을 알수 있다)

2) 참조에 Microsoft ActiveX DataObject 2.8 Library를 추가 : ADODB 객체를 사용하려구 

3) 일단 엑셀을 sql로 조회하기 위한 엑셀을 하나 준비한다

 

 

4) 엑셀을 DataBase처럼 Connection을 실행해서 잘 연결되는지 확인해보자

    특이하게 Provider를 사용하여 쓰고 뒤에 Properties가 더 붙는다

Public dbcon As ADODB.Connection

Public dbcon As ADODB.Connection 

Public Sub ExcelCon()    '=>실행시 문제가 없는지 확인

    Dim strCon  As String '연결String
    Dim driver, dsrc
   
    dsrc = "D:\엑셀DB테스트.xlsx"    '파일명
    
    '엑셀파일을 DataBase처럼 연결
    strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dsrc & ";Extended Properties=Excel 12.0;"
    Set dbcon = New ADODB.Connection
   
    dbcon.Open strCon      '연결

End Sub

 

5) 연결이 잘되었으면 RecordSet으로 받아 엑셀에 출력을 해보자

Public Sub getExcelEtcSel()

    Dim rs, sql, colCnt, wRow, i
   
    ExcelCon     
    sql = "select * from [Sheet2$] "  '->조건없이 전부 조회
    Debug.Print sql
   
    'Set rs = CreateObject("ADODB.RecordSet")
    Set rs = New ADODB.Recordset
   
    rs.Open sql, dbcon
   
    wRow = ActiveSheet.Range("B4")  '작성시작 row
    colCnt = rs.Fields.Count
    '컬럼에 head를 시작에 달아줌
      For i = 0 To colCnt - 1
          ActiveSheet.Cells(wRow, i + 1) = rs.Fields(i).Name
      Next
      setHeaderStyle wRow     'header 스타일 적용
      wRow = wRow + 1
   
    If rs.EOF = False Then
   

        Do While rs.EOF = False
       
            For i = 0 To colCnt - 1
                ActiveSheet.Cells(wRow, i + 1) = rs(rs.Fields(i).Name)    '레코드셋에 이름으로 매핑하여 표시
            Next
           
            wRow = wRow + 1
            rs.MoveNext
        Loop
    End If

End Sub

 

6) 엑셀에 특정영역중에 query를 사용할경우와 컬럼명을 기술할때 일반 query와 상이함

 sql = "select [컬럼1],[컬럼2] from [Sheet2$A2:G5] "

- 시트전체조회시 [시트명$]

- 시트에일부영역시 [Sheet2$A2:G5] -> sheet2에 A2:G5 영역중 조회

- 컬럼은 위처럼 중괄호를 해야되고 중복된 컬럼명이 있으면 임의로 넘버링을 붙임

 

중복컬럼이 있는경우

조회결과

 

엑셀에서 중요한 기능중 하나가 파일을 READ 하고 WRITE하고 이긴 한데

단독적으로 쓸일은 많지는 않았다 그보다 현재 많은 정보들이 있다보니 각종 소스들에 대해서 목록으로 처리해야될일이 많아졌다 생각 되어진다.

프로젝트에서 말하자면 현황파악

제일먼저 특정경로에 소스를 가져왔을때 해당 소스하위까지 포함하여 폴더에 목록을 엑셀로 작성해보자

 

1) 엑셀시트 화면 구성 

   B1에는 검색하려는 기본경로 기입

   B2에는 기존 목록을 삭제하고 다시 작성할건지 여부

   B3에는 전체작성된 건수를 엑셀함수를 써서 기입 =COUNT(A9:A1048576)

 

2) 소스작성

   먼저 파일을 사용하기 위해 참조를 하자

   직접 CreationObject를 사용하여도 되지만 ctrl+space로 자동완성기능을 사용하기 위하여

   참조를 통하여 객체를 넣는 작업을 한다

 

 

 

다음은 엑셀 코딩을 하자

Option Explicit   '명시적으로 항상 어떤변수를 사용했는지 확인하는게 신상에좋다

Dim wRow        '파일을 엑셀시트에 저장하기 위해 선언==> 말하자면 전역변수선언

Public Sub getFileList()   '==>실행하는 함수
    Dim rc
   
    wRow = 9        '기본은 9부터
    If ActiveSheet.Range("B2") = "Y" Then    '삭제여부를 보고 삭제작업
        rc = MsgBox("삭제해도 될까요?", vbYesNo, "삭제경고")
        If rc = vbYes Then
            Rows(wRow & ":" & wRow).Select
            Range(Selection, Selection.End(xlDown)).Select
            Range(Selection, Selection.End(xlDown)).Select
            Selection.Delete Shift:=xlUp
        Else
            Exit Sub
        End If

        '타이틀을 작성한다
        ActiveSheet.Cells(wRow, 1) = "NO"
        ActiveSheet.Cells(wRow, 2) = "파일명"
        ActiveSheet.Cells(wRow, 3) = "경로"
        ActiveSheet.Cells(wRow, 4) = "타입"
        ActiveSheet.Cells(wRow, 5) = "Size"
        ActiveSheet.Cells(wRow, 6) = "비고"
       
        '이건별도 나만에 함수로 생략 setHeaderStyle wRow     'header 스타일 적용
        wRow = wRow + 1
    Else
        wRow = ActiveSheet.Range("B3") + 10 '삭제를 안하고 추가하는경우 헤더포함하여 다음써야될행

    End If
    
    'b1에 입력된 기본 경로하위 폴더 및 파일목록을 작성시작
    FolderFile ActiveSheet.Range("B1")
   
End Sub


Function FolderFile(fn As String)


 Dim fs As FileSystemObject
 Set fs = New FileSystemObject

 Dim foldeer As Folder
 Dim fileinfo
 Dim Filnavn() As String
 Set foldeer = fs.GetFolder(fn)

 '해당폴더에 파일이 있는경우
 For Each fileinfo In foldeer.Files

        ActiveSheet.Cells(wRow, 1) = wRow - 9  '기본자릿수
        ActiveSheet.Cells(wRow, 2) = fileinfo.Name  '파일명
        ActiveSheet.Cells(wRow, 3) = Mid(fileinfo.path, 1, Len(fileinfo.path) - Len(fileinfo.Name)) 'path에 파일명까지 같이 들어오므로 파일명 길이만큼 잘라path만입력
        ActiveSheet.Cells(wRow, 4) = fileinfo.Type
        ActiveSheet.Cells(wRow, 5) = fileinfo.Size
        wRow = wRow + 1   '작성후 다음위치 + 1
        Debug.Print "F " & fileinfo
 Next

 For Each Folder In foldeer.SubFolders  'sub폴더가 있는경우

        Debug.Print "D " & Folder
        FolderFile (Folder)             '재귀함수로 자신을 다시 부름
 Next

End Function 

파일처리 목록완성 예시

 

3) 하이퍼링크를 활용하여 클릭시 자동열리게 하자

   요즘은 하도 참조하는 문서가 많아 헷갈리는경우가 많다 저같은경우 목록을 작성하고

뒤에 비고란에 확인한 내용 및 주요 참고내용등을 적어놓고 다시 열때는 클리하여 자동열기를 주로 사용하고 있다

파일을 write할때 하이퍼링크 코딩을 넣어주면 된다.

 

'#하이퍼 링크 추가
ActiveSheet.Cells(wRow, 2).Select     '해당위치를 select
'address에는 전체파일명포함 경로, textToDisplay는 파일명
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=fileinfo.path, TextToDisplay:=fileinfo.Name 

 

추가하고 처리시 하이퍼링크건은 파란색 밑줄로 표시가 되고 클리하면 해당소스를 바로 읽게 됨

 

 

버튼 생성

개발도구->삽입->버튼

 

매크로를 매번 실행시 Viaul Basic 에디터에서 실행하기 귀찮기 때문에 실행버튼이 필요한 경우 있다

최초 버튼 생성시

만들고 버튼에 매크로를 변경시(마우스를 이름에 한번클릭시 이름변경가능)

버튼 생성

매크로 지정화면 : 매크로 지정후 확인하면 앞으로 해당 매크로 실행됨

매크로 연결

 

ㅁ 이름정의

    영역을 선택하고 왼쪽 상단에 정의할 이름을 정의함

 

이름정의 방법

ㅁ 이름정의 활용

    1) 엑셀에 콤보 만들기

   

엑셀콤보

             왼쪽에 콤보를 만들 셀을 선택하고 데이터 유효성 검사 선택

            해당 콤보내용이 나옴

      2) VBA userForm에서 활용

          폼에 콤보 생성

       폼에 이름정의

                         

 

 

각 DataBase별 환경설정 부분은 dicws.tistory.com/62 앞에서 확인하시고

 

이번에는 엑셀에서 해당 테이블을 가져오기 위해 추가설정부분에 대한 얘기를 하고자 합니다.

엑셀만 그렇지는 않고 보통 개발하다 보면 라이브러리가 필요로 할때가 많습니다. 그리고 많은 라이브러리들을 추가해주고 설정해야됩니다. 이런과정이 VBA에도 있습니다.

 

데이터 연결방법 두가지

    윈도우즈 각 드라이버를 설치하고,

       첫번째는 윈도우드ODBC에서 연결을 하고 연결된 ODB를 통하여 데이터 연결하는 방법

       두번째는 윈도우에 각 드라이버 직접접속 하여 데이터 연결하는 방법 

           두번째는 CreationObject를 통하여 각 DataBase 종류별로 Connection 스트링을 맞춰 직접 연결

           첫번째는 OLBC에서 미리 접속연결하고 동일한 Connection 스트링으로 연결하면 됩니다.

 

일단 라이브러리 추가 -> 데이터 베이스 연결을 해보겠습니다.

▶ 라이브러리 추가

   VBA에서 DataBase를 연결하기위해 또는 일반 파일을 엑세스 하기위해 라이브러리를 추가해야됩니다.

   먼저 DataBase를 연결하기 위한 라이브러리를 추가합니다.

    메뉴에서 도구->참조

라이브러리 추가 메뉴

 

 

Microsoft ActiveX Data Object Library를 선택 버전은 여러개 있는데 2.0이후부터인데 보통 2.7, 2.8 6.1 선택하시면 됩니다.

Microsoft ActiveX Data Object Library 추가

 

 

▶ DataBase 연결정보 확인

     연결전 드라이버를 확인

      검색->ODBC 입력후-> 64bit선택

내 PC에 저장되어 있는 드라이버

 

 

▶ DataBase 직접연결 방법

Option Explicit                        '명시적 선언
Public dbconn As ADODB.Connection      '추가한 라이브러리 선언

Public Sub DBTest()

    'DataBase 연결 사용하기 위한 변수 설정
    Dim strCon  As String            '연결String ※요게 DataBase마다 다름 
    Dim rs      As ADODB.Recordset   'Variant 형으로 선언해도 됨 
    Dim sql
    
    
    '1-1) Mysql기준으로 Connection String 작성
    strCon = "Driver={MySQL ODBC 8.0 Unicode Driver};SERVER=127.0.0.1;PORT=3306;UID=root;PWD=해당패스워드;DATABASE=mysql;"
    
    '1-2) 커넥션 객체 생성 (객체 연결방법 두가지) 
    'Set dbconn = CreateObject("ADODB.Connection")   '라이브러리를 추가하지 않고 직접생성방법
    Set dbconn = New ADODB.Connection                '라이브러리를 참조로 추가했기 때문에 사용가능
   
    dbconn.Open strCon      '1-3)연결
    
    '2-1) DataBase 접속한후 작업
    'Set rs = CreateObject("ADODB.RecordSet")        'RecordSet이라고 조회후 내용을 담아둘 객체 수기생성 
    Set rs = New ADODB.Recordset                     '참조된 라이브러리로 생성
    
    '2-2) 쿼리 작성
    sql = "select * from db "
    
    '2-3) 쿼리 수행(여기서는 조회쿼리로 RecordSet에 담아서 결과출력)
    rs.Open sql, dbconn                    'Connecton 객체로 sql 수행
   
    While rs.EOF = False
   
        Debug.Print rs.Fields(1)           '조회결과를 index로 출력
        'Debug.Print rs("컬럼명")          '컬럼명을 가지고 출력 
       
        rs.MoveNext                        '다음Record로 전환 
    Wend
    
    rs.close      'RecordSet 객체 닫기 : 자원반납
    dbconn.close  'Connection 객체 닫기: 자원반납  

End Sub

기본적인 연결을 정의해보았고 DataBase별 다른부분을 설명하겠습니다.

다른부분은 DataBase별 StrCon이라고 Connection String이 달라집니다. 

 

DataBase 종류Connection String

   1) Excel

strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=파일경로;Extended Properties=Excel 12.0;"

※ 엑셀도 일반 DataBase처럼 SQL로 조회 수정이 가능합니다.

 

  2) Oracle

strCon = "DRIVER={드라이버명};Uid=사용자ID;Pwd=사용자암호;DBQ=오라클TNS명;DBA=W;"

※ 드라이버명은 위에서 Oracle in instantclient_19_8 입니다.

 

  3) Mysql

strCon = "Driver={드라이버명};SERVER=서버IP;PORT=서버포트;UID=사용자ID;PWD=사용자암호;DATABASE=데이터베이스명;"

※ 드라이버명은 위에서 MySQL ODBC 8.0 Unicode Driver 입니다

 

4) IBM DB2

 

strCon = "Driver={드라이버명};Database=데이터베이스명;Hostname=서버IP;Port=서버포트;Protocol=TCPIP;Uid=사용자ID;Pwd=패스워드;CurrentSchema=스키마명;"

※ 드라이버명은 위에서 IBM DB2 ODBC DRIVER 입니다

 

현재 개발을 하면서 DataBase없이는 개발을 할수 없는 상황입니다. 더군다나 BigData 시대라 불리우는데 DataBase가 없어서는 안될 필요 조건이라 생각됩니다.

 

엑셀에서는 2000년도 사용당시 DataBase는 사용한다는 생각을 안해봤지만 그이후 개발하면서 많은 DataBase에 정보를 수집하고 편집하고 하는 일들이 많았다 생각되어집니다.

그러므로 엑셀을 사용함에 있어 DataBase연결이 필수라 생각되어 지고 또한 연결을 통해 많은 정보들을 가져오기 위해 몇가지 설정들이 있습니다. 이제 이부분에 대한 설명을 하겠습니다.

 

윈도우에는 기본적으로 ODBC가 있습니다(데이터베이스를 연결하기 위한설정)

여기에 해당 드라이버를 설치하고 나면 사용할수 있는 드라이버를 등록되었을경우

엑셀에서는 ODBC를 통하여 DataBase에 연결하여 가져올수 있습니다.

 

윈도우 8이상은 검색에서 odbc를 입력하면 해당 odbc가 나옵니다. -> 현재 윈도우10 (버전수정)

 

os에 따라 64 bit or 32bit 두가지로 나오면 os 처리방식하고 동일한 office bit를 설치하길 권하여 드립니다. 그래야 서로 동일하게 처리할수 있습니다.

 

MS Window에서 ODBC 프로그램 실행 방법

 

해당 odbc를 실행하면 먼저 드라이버 텝에 연결하고자 하는 드라이버가 설치됬는지 확인이 필요합니다.

 

설정가능한 드라이버 확인(Oracle, Mysql, DB2등은 추가 설치가 필요함)

※ 참고로 OLEDB 는 첫번째 드라이버 추가 필수 이고 OLEDB에 시스템 DSN, 사용자 DSN에 Connect을 맺고

   기본적인 OLEDB로 모든 데이터 베이스를 연결할수 있도록 고안된 설정 프로그램임

ODBC연결은 DBMS에 관계없이 드라이버만 설치후 다 사용가능

▶ 엑셀에서 ODBC를 사용하기 위한 Driver 설치 

    ORACLE, MYSQL(마리아도 동일) 드라이버가 설치되어야 됩니다.

 

    1) Mysql or 마리아DB(설치과정 생략) : https://dev.mysql.com/downloads/connector/odbc/

 

  

             다운 파일 mysql-connector-odbc-8.0.13-winx64.msi

            설치후 odbc화면 : odbc가 설치됨을 확인할수 있습니다.

 

 

     2) Oracle  다운로드 및 설치 (odbc 패키지에 odbc_install.exe를 실행)

         ▶ 설치

 

* 아래의 홈페이지에서 아래의 파일을 다운로드한다.
  다운로드 사이트 : http://www.oracle.com/technetwork/topics/winx64soft-089540.html
  다운로드 파일명 
    instantclient-basic-windows.x64-11.2.0.3.0.zip
    instantclient-odbc-windows.x64-11.2.0.3.0.zip
    
* 다운로드 받은 파일의 압축을 해제한다.
  - 압축 해제하면 instantclient_11_2 폴더에 모든 파일이 존재한다.

* instantclient_11_2 를 C:\Oracle 폴더로 복사한다.
  - C:\Oracle 이 없으면 생성한다.

* 관리자 권한으로 DOS 창을 실행한다.
  - C:\Oracle\instantclient_11_2 폴더로 이동한 후, 아래와 같이 명령을 실행한다.
  - ODBC 설치가 정상적으로 되었으면 아래와 같이 성공 메시지가 보여진다.

*설치 실행
C:\Oracle\instantclient_11_2>odbc_install.exe
Oracle ODBC Driver is installed successfully. 

      드라이버 확인

Oracle ODBC 드라이버 설치후 드라이버 확인

    환경변수 등록: 검색에서 ->고급 시스템 설정 -> 환경변수 등록

ORACLE_HOME=C:\Oracle\instantclient_19_8
TNS_ADMIN=c:\Oracle\instantclient_19_8 ( tnsnames.ora 파일이 위치할 폴더 )
NLS_LANG=KOREAN_KOREA.KO16MSWIN949 ( 한글관련 설정 )
         KOREAN_KOREA.AL32UTF8  (이것도 있는듯)
PATH=c:\Oracle\instantclient_19_8 ( 기존 패스에 추가 )

   tnsnames.ora파일 생성 : ORACLE HOME 지정위치에 C:\Oracle\instantclient_19_8

# Generated by Oracle configuration tools.
# ORCL : 서비스 이름 또는 tns name
# DESCRIPTION : 접속하고자 하는 대상 데이터베이스 정보
# ADDRESS : 접속하고자 하는 데이터베이스 서버의 리스너를 호출하기 위한 주소 정보(프로토콜, 호스트, 리스너 포트)
# CONNECT_DATA : SERVICE_NAME 옵션을 이용하여 접속할 리스너 프로세스가 사용하는 서비스 이름을 지정하거나 
#                또는 SID옵션을 이용하여 데이터베이스의 SID명을 지정
# SERVER = DEDICATED : 오라클 서버와 연결시 생성된 프로세스를 전용연결 
                     Dedicated Server(전용 서버) 방식 혹은 Shared Server(공유 서버) 방식으로 운영함
# SERVICE_NAME = MYNAME : 오라클 서버의 리스너(listener.ora)에 기술된 서비스명 
                         / 서버측에 사용자 (DB관리자)가 임의로 작성하여 넣은 이름

ORCL=
(DESCRIPTION=
 (ADDRESS_LIST=
 (ADDRESS=(PROTOCOL=TCP)(HOST=아이피)(PORT=포트))
 )
 (CONNECT_DATA=
 (SERVER=DEDICATED)
 (SERVICE_NAME=xe)
 )
)

     3) DB2 Client 설치 

         다운로드 : http://www-01.ibm.com/support/docview.wss?uid=swg27007053
위 URL 접속하면 아래 화면이 보이는데 원하는 버전을 선택합니다.

 

IBM 다운로드 사이트

 

 

IBM Data Server Client'를 선택


다운로드 

          ※ 압축을 풀고 나면 실행파일 setup.exe 실행하여 제품 설치

 

DB2 Client 설치후 드라이버 확인

 4) SqlLite ODBC 설치

    다운로드 사이트 : www.ch-werner.de/sqliteodbc

 

SQLite ODBC Driver

SQLite ODBC Driver               The SQLite Database Engine provides a lightweight C library to access database files using a large subset of SQL92 without the overhead of RDBMS server processes. In order to use that functionality as a desktop datab

www.ch-werner.de

 

다운로드

    ※ 64bit는 w64.exe를 설치하시면 됩니다.

▶ 설치후 odbc 조회

     

ODBC 설치후 드라이버 추가 확인

 5) Mongo DB ODBC 설치

   다운로드 사이트 : docs.mongodb.com/bi-connector/master/reference/odbc-driver

 

MongoDB ODBC Driver for BI Connector — MongoDB Connector for BI

The 1.0.16 edition of ODBC Manager included with the MongoDB ODBC driver is not compatible with macOS Catalina. If you are on Catalina, download and install the latest version (1.0.19) of ODBC manager.

docs.mongodb.com

주의는 Visual C++ Redistributable For Visual Studio 2005가 설치되어 있어야됨

버전에 맞게 다운로드
ODBC 설치후 드라이버 추가 확인

툴에 기능에 많은것을 알면 좋지만 이정도만 알았으면 하는 기능을 중간정리 해봅시다

엑셀을 도구 만들기 좋은 하나는 천천히 한줄씩 처리하면서 처리과정 및 값들을 볼수 있고

또한 다시 위치를 위로 변경하고 값을 변경해서 디버깅하는 기능이 잘되어 있다고 생각되어 집니다.

이러한 기능을 사용하기 하단 3가지만 잘 사용하여도 됩니다.

 

▶ VBA 툴 사용 팁

    1) 편집: 중간에 툴이 나옴

    2) 직접실행창: 하단에 창이 나옴 특히 프로그램에서

        ex1) Debug.Print에서 값을 출력하면 나옴.

        ex2) 값을 변경할때는 직접실행에서 i=10 하고 Enter를 쓰면 값이 10으로 변경

     3) 조사식 : 마우스 오른쪽을 누르고 해당 변수를 등록해주면 값이나 속성들이 변경됨에 따라 많은 정보가 나옴

 

VBA도구에 주요 사용 메뉴

 

   4) 코딩시 일괄로 주석 처리 및 주석해제 단축키

 

 

여기서는 기본적은 VB의 문법을 소개 하고자 합니다.

엑셀 매크로는 VB의 문법을 사용하고 있고 추가로 엑셀의 함수를 지원하여 VBA라고 불리워 집니다.

 

그러므로 VB문법에 대해 소개 하고자 합니다.

 

▶ 변수선언 방법 두가지 : 명시적/묵시적

    Java 나 C를 해보신분은 변수를 선언하지 않으면 컴파일이 안됩니다 이것을 명시적이라 합니다..  

    VB에서는 기본적으로 변수 선언없이(묵시적) 으로 사용가능하지만, 코딩이 길어질때 오히려 명시적으로 하는것이 좋습니다. 

명시적 변수처리 하겠다 선언

그래서 변수 형이 지정되어 있지 않은 Variant 형이 VB에서만 존재 합니다.

Variant는 변수가 문자가 처음 저장되면 String형, 숫자가 저장되면 Integer로 알아서 내부적으로 적용됩니다.

 

 변수선언  및 타입 확인

 dim 변수명 as 변수타입    : 변수 선언방법
 
 ※ Integer, String,Variant   : 변수타입 종류  

   ※ as 부터 뒤에가 없으면 Variant(형이 없는)으로 선언되면 변수값이 저장될때 형이 지정됩니다.

 

▶ 조건문

if  조건문 then

elseif 조건문  ==> 생략가능

else              ==>생략가능

end if

ex)
If a > 10 Then
   MsgBox("10이상")
ElseIf b > 5 Then
   MsgBox("5이상")
Else
   MsgBox("기타")
End If 

 자바와 기본적으로 다른 문법을 사용합니다.

Java VB 내용
!= <> 조건문 다름
&& and 조건문 그리고
|| or 조건문 또는
== = 비교문 같음

 

 반복문 (For,  Loop)

java

VB

내용

for(int ii=0;ii<10;ii++){

   
break   //for문을 빠져나옴

}

for i=0 to 9 step 1
 exit for  'for문을 빠져나옴
next i

step 는 1씩 증가인데 없으면 자동으로 1씩 증가

next 뒤에 i는 증가할변수를 등록 없으면 알아서 함

  Do While i<9

   exit loop  'loop문을 빠져나옴
  I = I + 1
Loop
i가 9이하일때까지 처리
exit loop는 강제로 루프 빠져 나옴
  While i < 9
   i = i + 1
Wend
 위와 동일한 문법임

 

▶ 활용예시

    자 그럼 활용예로 엑셀시트에 1행부터 10행까지 x 10을 해서 쓰는거 , 쓴것을 읽는것을 한번 해봅시다

 

   1) 쓰기 예제

Public Sub 사용자처리()
 
    For i = 1 To 10
   
      Sheets("sheet1").Cells(i, 1) = i * 10
     
    Next
    
End Sub

   2) 읽기 예제

 For i = 1 To 10
   
     'vba 편집에서 보기->직접실행을 선택하면 하단에 debug.print한 값이 나옴
     '->자바에서는 붙여쓰기를 + 로 하는데 vb는& 로 함 +인경우는 연산자로 인식
     Debug.Print "시트내용:" & Sheets("sheet1").Cells(i, 1)
      
 Next

 

▶ 엑셀시트에 위치 및 셀에 값을 변경하기

Public Sub 사용자처리()
    Sheet("sheet1").Cells(3, 3) = "하하하하"
End Sub

※ 참고
Sheet("시트명") : 특정 시트
Workbooks("파일명").Sheet("시트명") : 해당파일명에 해당 시트명

ActiveWorkbook : 현재 활성화 되어 있는 파일 [("파일명")은 없음]
ActiveSheet    : 현재 활성화 되어 있는 시트 [("시트명")은 없음]

 

▶ 엑셀 시트의 위치를 선택하는 두가지 방법

 Range("C2") 라 직접 쓰는 방식이 있지만 우리가 반복작업을 하기위해 A->B->C를 FOR문이나  lOOP에서 돌리기 어렵기 때문에 Cells(세로줄 라인위치, 가로줄 라인 위치)를 사용합니다.

하단은 ' 로 주석을 하였고 동일한것으로 Cells명령어를 사용하여 작성해보았습니다.

End Sub
    '주석 엑셀 시트에 가져오는 방법
    MsgBox Cells(3, 3)         'Cells(행[y축] 위치, 열[x축] 위치) 표시
    MsgBox Range("C3")         'Range는 열은 영문으로 행은 위치로 표시  
   
End Sub

※ 주석은 ' 작은따옴표 하나이며 작은따옴표 뒤에는 전부 주석됨   

※ 위 두가지 방법은 동일한 결과를 갖게 됨

 

▶ 엑셀 시트쓰기, 엑셀시트에서 값을 사용하기

   등호(=)을 사용하고 오른쪽에 시트에 저장할값을 쓰면됩니다.

 Public Sub 사용자처리()
   
    Cells(3, 3) = "하하하하"                     '=>엑셀시트에 하하하하를 저장
    Range ("C3")= "하하하하"
    
    MsgBox  Range ("C3")                        ' 엑셀시트값을 사용하기
   
End Sub

  처리결과)

C3 또는 3,3에 값을 저장

 

 

Sheets는 일반 Visual Basic(일명 VB)에는 없는 함수로 엑셀에 내장되어 있는 VB로 사람들은 Visual Basic Application(일명 VBA) 라고 합니다. 

 

※ 요약정보

파일함수.시트함수.셀함수

파일함수 : ActiveWorkbook,Workbooks("파일명")
시트함수 : ActiveSheet. WorkSheet("시트명")
셀함수   : ActiveCell, Cell(행 위치, 열 위치), Range( 열 영문, 행위치)
           Range예) Range("D1") 하고 Cells(1,4) 는 동일함
           
※ Cells를 많이 쓰는이유는 For, Loop문으로 코딩하기 위해 많이 사용함

 

번째 기초로 엑셀 시트의 내용을 기본적으로는 가져오고 쓰는 방법에 대해 알아보고자 합니다.

 

가장 기초적이면서 기본적으로 알아야된다고 생각합니다.

 

 

▶ 매크로에서 엑셀데이터 불러오기 예시

    엑셀시트에 해당 내용이 작성됬다고 가정합니다.

엑셀 시트에 데이터 작성

 

이자료의 C3에 있는 엑셀내용을 매크로에서 가져와 메시지로 출력하는 방법

public sub test()                  '사용자 프로시저명(실행하고 끝남)

    MsgBox Range("C3")         'C3열 메시지 출력 
   
End Sub 


해당 커서 위치를 사용자처리함수(프로시저)에 넣고 F5또는 위에 플레이 버튼을 실행시켜 봅시다

아래와 같이 메시지 박스에 C4에 있는 내용이 출력됩니다.

사용자 프로시저를 가지고 메크로 실행예

 

번째 기초로 엑셀 시트의 내용을 기본적으로는 가져오고 쓰는 방법에 대해 알아보고자 합니다.

 

가장 기초적이면서 기본적으로 알아야된다고 생각합니다.

 

 

▶ 매크로에서 엑셀데이터 불러오기 예시

    엑셀시트에 해당 내용이 작성됬다고 가정합니다.

엑셀 시트에 데이터 작성

 

이자료의 C3에 있는 엑셀내용을 매크로에서 가져와 메시지로 출력하는 방법

public sub test()                  '사용자 프로시저명(실행하고 끝남)

    MsgBox Range("C3")         'C3열 메시지 출력 
   
End Sub 


해당 커서 위치를 사용자처리함수(프로시저)에 넣고 F5또는 위에 플레이 버튼을 실행시켜 봅시다

아래와 같이 메시지 박스에 C4에 있는 내용이 출력됩니다.

사용자 프로시저를 가지고 메크로 실행예

 

1997년부터 엑셀을 사용해왔는데 엑셀만한 도구가 없다고 생각되어 집니다.

정식적인 개발은 2000년도부터 시작했고 사용하면서 엑셀이 정말 필요로 하고나 하는 생각이 듭니다.

첫번째 VBA(Visual Basic Application)에 대해 환경설정에 대해 이야기 하고자 합니다.

 

먼저 엑셀 상단에 개발자 도구 텝을 보이게 하기 위하여 설정해봅시다.

▶ 파일-> 옵션 선택

 

 리본사용자 지정-> 우측에 개발도구 선택

개발자 도구 탭 보기

 

▶ 상단에 개발도구 탭이 나옴

 

 Visual Basic 을 선택하면 하단 VBA 매크로를 관리하는 화면이 별도 보임

엑셀 매크로는 .bas 라는 확장자에 모듈을 생성하여 거기에 매크로를 기록하게 되있는데

.bas를 생성을 아래와 같이 하시면 됩니다.

 

▶ (코딩할수있는 모듈 생성)프로젝트 창에서 마우스 오른쪽 -> 삽입->모듈

사용자 모듈 추가방법

 

▶ 작성방법

Sub는 특정처리만 하고 끝, Function 엑셀에 사용자 함수를 만드는거

 

일반 Java와 같이 프로시저단위로 만들게 되어 있습니다. 크게 두가지로

 Sub 프로시저, Function 두개로 나누어 지는데

 

Sub 프로시저는 단지 수행하고 종료

Function는 몇가지 인자를 입력을 받아 Return으로 돌려주게 되어 있습니다.

 

여기서 엑셀에 매크로 기능을 VBA라고 했냐면 기존에 VB개발화면과 동일하고

다만 엑셀에서 사용하는 Mid, Left, Right등의 엑셀에서 사용하는 함수를 추가적으로 사용할수 있습니다.

 

위 사용자 함수를 엑셀시트에서 사용해보겠습니다.

 위에서 만든 함수명에 사용자함수에 인자 두개를 넣고 결과를 함수명으로 주면 엑셀시트에서도

  사용하시는것을 보실수 있습니다.

 

▶ 사용자 함수 사용예

 

Function으로 사용자 함수를 엑셀시트에서 아용하는 예시

 사용결과

사용자 함수 처리결과

 

+ Recent posts