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



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

Excel과 AutoCAD연결(3)

여전히 extattr.xls의 모듈에 있는 Extract()함수 소스를 보고 시작하도록 하겠습니다. "Attributes"라는 sheet를 활성화(Activate)시키는 곳 까지 설명 했습니다. 오늘은 그 다음줄부터 보기로 하겠습니다.

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
    
    ...이하생략...

set excelsheet=excel.ActiveWorkbook.Sheets("Attributes") 라고 되어있습니다. 개체(object)변수에 할당하기 위해서 set을 사용했습니다. excelsheet라는 변수에 attributes라는 sheet를 할당하겠다는 것이죠. attributes쉬트는 Excel.activeworkbook의 개체이기 때문에 excel.activeworkbook.sheets()를 이용해서 접근했습니다.

다음줄은 excelsheet.range(cells(1,1),cells(1000,100)).clear입니다. excelsheet에 있는 ragne()을 clear하겠다는 것인가봅니다. clear라는 메서드가 아마도 있는 모양이지요? 이렇게 지레짐작으로 clear메서드는 대상 range를 지워주는 메서드이구나.. 라고 예측이 가능하지요. oop프로그램은 object가 가지고 있는 속성,메서드를 다 외울 수는 없기 때문에 이렇게 예제를 보거나 남이 만들어둔 프로그램을 읽어보며 속성,메서드를 익혀야 될 필요성이 있을 것 같습니다. 귀동냥이 중요하다는 이야기겟지요?

그 아래줄에 보면 set acad = nothing이라고 되어있습니다. acad는 object형 변수인데 거기에다 아무것도 넣지 않겠다. 즉 비워놓겠다는 것입니다. nothing을 이용하였습니다.

다음줄이 On Error Resume Next라고 되어있는데, 이런 코드를 에러핸들러라고 합니다. 대부분의 프로그램들은 에러를 내포할 수 있습니다. 물론 프로그램 자체는 에러가 없지만 사용중에 없는 파일을 선택했다든가, 0으로 나누었다든가 그런것은 프로그램을 만들때는 일어날 수 없는 에러이고 사용중에 발생하는 에러입니다. 이러한 에러들을 감지하고 대응하는 것도 프로그래머의 몫이 되는 것입니다.

On Error Resume Next는 "앞으로 에러가 나면 그 다음줄로 넘어가라.."라는 뜻입니다. 또달리 말하면 "앞으로는 에러가 발생하면 멈추지 말고 계속진행하라"라고 하는 것입니다. 아마도 다음문장이 에러가 발생할 수 있는 문장이라는 것을 알 수 있습니다. 다음문장을 한번 보도록하지요.

Set acad = GetObject(, "AutoCAD.Application") 아.. 드디어 AutoCAD와 연결되는 순간입니다. 윗줄에서 엑셀을 excel변수에 담았던 것처럼 acad도 acad변수에다 담았습니다. 역시 object를 할당하기 위해서 set명령어를 사용하였구요. AutoCAD 를 잡아내기 위해 getobject함수를 사용하였습니다. 이제 acad라는 변수를 통해서 AutoCAD의 모든 개체에 접근할 수 있는 것입니다. 개체에 접근만하면 그 개체가 지원하는 하위개체, 속성, 메서드들을 사용할 수가 있겠죠?

여기까지의 코드중 가장중요한 부분은 Set excel = GetObject(, "Excel.Application")라는 줄과 Set acad = CreateObject("AutoCAD.Application")이겠지요? 이 두줄만 알고 있으면 연결은 끝난것이라고 하겠습니다.

이런 오늘도 점심시간이 다 되었습니다. 지금까지 AutoCAD로 연결하는 단계였고 내일부터는 AutoCAD개체 아래에 있는 도면,line,circle,text에 접근하여 만들고 수정하는 방법을 설명해나아가도록 하겠습니다. 그럼 좋은 날 되시고 다음에 뵙겠습니다.



dolljong@dreamwiz.com