지식은 공유되었을 때 그 힘을 발휘한다.



Excel VBA, AutoCAD ActiveX 맛보기 강좌(16)

Excel과 AutoCAD연결(1)
제가 처음 ActiveX를 공부하면서 뜯어보았던 프로그램이 r14버젼의 예제 파일로 따라왔던 프로그램입니다. 캐드의 attribute를 읽어서 Excel쉬트에 뿌려주는 프로그램이었습니다. Uno21님의 "Excel로 배우는 VB"강좌를 몇번 읽어본 걸 빼고서는 Excel에서 프로그램을 만들어본 적이 없었고, 만들 필요성도 느끼지 못하던 차에, Excel과 AutoCAD의 연결은 정말 놀라운 일이었습니다.

그 파일은 r14에도 있었지만 2000에도 있더군요. sample방의 activex방에 세개정도의 예제 디렉토리가 있는데 그중 하나가 Excel파일로 되어있는 프로그램입니다. Extattr.xls로 되어있습니다. 이 엑셀파일을 띄워보도록 하겠습니다. 아무래도 AutoCAD에서 제공하는 프로그램이니 정확한 문법을 구사하고 있을 것 같아 이 프로그램으로 AutoCAD와의 연결에 대해서 이야기 해보도록 하겠습니다.

우선 프로그램을 한번 살짝 볼까요? 무지 긴것 같지만 모든 프로그램은 순서대로 읽거나 함수별로 또는 기능별로 나눠져 있기 마련이지요. 부분부분을 이해하고 나면 전체적인 흐름이 보일 것 입니다. 아래는 extattr.xls의 모듈에 들어있는 코드의 앞부분입니다.

Public acad As Object
Public mspace As Object
Public excel As Object
Public AcadRunning As Integer
Public excelSheet As Object
Sub Extract()
    Dim sheet As Object
    Dim shapes As Object
    Dim elem As Object
    Dim excel As Object
    Dim Max As Integer
    Dim Min As Integer
    Dim NoOfIndices As Integer
    Dim excelSheet As Object
    Dim RowNum As Integer
    Dim Array1 As Variant
    Dim Count As Integer
     
    Set excel = GetObject(, "Excel.Application")
    Worksheets("Attributes").Activate
    Set excelSheet = excel.ActiveWorkbook.Sheets("Attributes")
    excelSheet.Range(Cells(1, 1), Cells(1000, 100)).Clear
    excelSheet.Range(Cells(1, 1), Cells(1, 100)).Font.Bold = True
    Set acad = Nothing
    On Error Resume Next
    Set acad = GetObject(, "AutoCAD.Application")
    If Err <> 0 Then
        Set acad = CreateObject("AutoCAD.Application")
        MsgBox "Open the drawing file first and then rexecute!"
        Exit Sub
    End If
'    acad.Visible = True
    Set doc = acad.ActiveDocument
    Set mspace = doc.ModelSpace
    
    ...이하생략...

음.. 좀 길군요. 하지만 대부분 비슷한 것들이 반복되어있기 때문에 길어보일 뿐입니다. 정작 중요한 줄은 몇줄 안됩니다. 물론 모든 줄이 있어야 프로그램이 돌아가겠지만, 제가 중요하다고 말한 부분은 우리의 화두인 AutoCAD와 Excel의 연결하는 방법이겠죠.

우선 앞부분 부터 보도록 하겠습니다. 첫줄에 Public acad as object라고 나와있습니다. 변수를 선언하는 부분입니다. 사실 이 강좌를 진행하면서 조금 걱정되는 부분이 제가 VB 전체를 강좌해드릴 수 없다는 것입니다. 기본적으로 VB에 대해서 어느정도 알고 있어야 하는데.. 암튼 전 여러분이 어느정도 VB에 대해서 알고 있다는 전제하에 강좌를 진행하고 있습니다. public으로 정의하면 전역변수가 되는 것이지요. 이하 모든 sub이나 function에서 이 변수의 값을 참조할 수가 있습니다. 암튼 public acad as object라고 acad라는 변수를 정의했는데, as integer나 as double등은 많이 보아온 형식인데 object는 좀 생소할 수 있을 것 같습니다. 언젠가 제가 oop에 대해서 말씀드렸는데 개체,메소드,속성이 있다고 했죠? 바로 acad라는 변수는 개체형태라는 것을 정의해주는 것입니다.

개체형으로 정의되는 변수가 몇개 있는 것을 볼 수 있습니다. acad도 그렇고, mspace라는 뭔지 모르는 것 그렇고, Excel과 Excelsheet라는 녀석도 모두 개체형으로 정의되었습니다. 이렇게 정의를 할 때까지는 acad, excel, excelsheet변수에 아무것도 들어가지 않습니다. 그냥 이것들은 개체를 저장하는 변수들이다.. 라고 정의만 하는 것이지요.. 선언한다고도 합니다.

object형의 변수들을 정의하고 나서는 어떤 것을 할까요? 바로 sub Extract()로 바로 프로그램으로 들어갑니다. 역시 또 몇개의 object형과 inger그리고 Variant형의 변수들을 정의해줍니다. 나중에 이런 것들을 프로그램에서 사용하겠지요? 암튼 지금은 이렇게 정의된다는 것만 알고 넘어가도록 하겠습니다. 우리가 관심이 있는 것은 다음에 이 변수들을 통해 어떻게 AutoCAD에 접근하느냐이니까요.

dim문들이 끝나고 나서 첫줄이 바로 Set Excel=GetObject(,"Excel.Application")이란 줄입니다. 무엇이가 중요한 역할을 하고 있는 것 같이보입니다. 그런데 Excel=앞의 set은 무엇일까요? 보통 변수에 뭔가를 대입할 때는 그냥 등호만 써주면 되는 것으로 알고 있었는데.. set은 왜 섰을까요? 저 또한 처음에 activex프로그램을 공부하면서 그런 의문점을 가졌는데요. 일단 object형의 변수에 무엇인가를 대입할 때는 반드시 set을 사용해야된다는 것을 알고 계셔야 합니다. 아래쪽을 쭈욱 훑어보아도 알수 있듯이 object로 선언된 변수에 무엇인가를 할당할 때는 모두 set을 이용한 것을 볼 수 있습니다.

앗.. 오늘도 점심시간이... 쩝.. 뭔 이야기가 좀 풀릴려고 하면 점심시간이 끝나버리네요.. 마치 연속극처럼...
그럼 내일 또 계속하겠습니다.



dolljong@dreamwiz.com