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



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

Excel과 AutoCAD연결(2)

일단 어제 보더 extattr.xls의 모듈에 있는 extract()함수 소스를 보고 시작하도록 하겠습니다. 어제 object를 변수에 넣기 위해서는 set을 사용한다는 것을 말씀드렸습니다.

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명령으로 변수에다 개체를 잡아넣습니다. getobject가 개체를 잡아 넣는 것인데요. oop개념에서의 개체는 프로그램에도 해당됩니다. 말하자면 엑셀이란 프로그램도 하나의 개체라는 것이지요. excel이란 프로그램의 개체 밑에는 자식개체들이 있는데, 예를 들어서 sheet1, sheet2 같은 것들이 자식개체가 되는 것입니다. 또한 sheet1아래에 "A1","B1"과 같은 range개체가 자식개체로 존재하는 것입니다. excel이란 프로그램을 개체로 잡기 위해서 getobject라는 명령을 사용하는 것입니다. 비슷한 명령으로 createobject라는 것이 있는데 이것은 프로그램을 실행시키는 명령입니다.

첫번째 줄에 Set excel = GetObject(, "Excel.Application")라고 썼기 때문에 앞으로는 excel이란 프로그램에 접근하려면 또는 excel아래의 어떤 쉬트나 cell에 접근하기 위해서 excel을 이용합니다. 예를 들어서 현재 실행되어있는 excel의 현재 쉬트에 접근하기 위해서는 excel.activesheet라고 하면 되겟죠? 또한 현재 쉬트의 "A1"셀에 접근하려면 excel.activesheet.range("a1")하면 되겠지요?

간단하게 몇가지 테스트를 해볼까요? 백문이 불여일런이라..일단 한번 해보는 것이 무엇보다 중요하겠지요? 아래와 같이 코딩을 한다음에 run을 눌러보면 메시지ㅣ 박스에 sheet1이나 sheet2같이 현재 선택된 쉬트이름을 보여줄 것입니다.

Public excel As Object
Sub test()
 Dim excel As Object
 Set excel = GetObject(, "Excel.Application")
 MsgBox excel.ActiveSheet.Name
End Sub

또한 아래와 같이 A1에다 123을 입력한 다음에 아래와 같이 코딩해서 run을 해보면 123일라고 보여줍니다.

Public excel As Object
Sub test()
 Dim excel As Object
 Set excel = GetObject(, "Excel.Application")
 MsgBox excel.ActiveSheet.range("a1")
End Sub

이렇게 VBA를 지원하는 어떤 프로그램도 getobject로 프로그램은 선택하여 그 아래에 있는 모든 개체 모든 속성에 접근이 가능한 것입니다. 사실 위의 코드중에서 Set excel = GetObject(, "Excel.Application")라는 줄 없이 아래와 같이 코딩해도 결과는 같습니다. 하지만 왜 excel이란 object형 변수에 excel.application을 지정해서 사용하였을까요? 그것은 VBA가 여러프로그램들을 왔다 갔다하면서 실행이 되기 때문입니다. 예를 들어 캐드와 연결된 EXcel VBA라면 Excel에서 작업하다 CAD로 같다가 다시 excel로 돌아와야 하는데 이런 작업들을 하기 위해서는 Excel이라나 개체를 지정해두어야 하기 때문입니다. 현재 excel에서의 모듈이기 때문에 excel을 지정하지 않아도 당연히 현재 프로그램이 excel이란 것을 알고 있기 때문에 activesheet만으로도 접근이 가능한 것입니다.

Sub test()
 MsgBox ActiveSheet.Name
End Sub

다음줄로 넘어가보도록 할까요? 다음줄은 Worksheets("Attributes").Activate라고 되어있습니다. 대입하는 등호(=)도 없는 걸보니 activate란 녀석이 메서드라는 것을 알 수 있습니다. worksheets("attributes")는 개체이겠죠? Excel의 sheet들(worksheets)중에서 "attributes"라는 이름을 가진 녀석을 지칭하는 것입니다. 그녀석을 activate라는 뜻인데..activate는 저번.. 강의에서 설명드렸듯이 활성화 시키라는 뜻입니다. 즉 앞으로 attributes라는 sheet에서작업을 할테니 활성화를 시켜라..또는 선택해라.. 라는 뜻이겠지요?

오늘도 욕심만큼 진도를 나가지 못했습니다. 앞부분이 사실상 VBA의 중요한 부분이기 때문에 이부분은 진도를 천천히 나가려고 합니다. 사실 Excel과 캐드를 연결하는 중요한 코드들이기 때문입니다. 일단 연결하는 부분만 지나면 그 다음은 일반 VB 프로그램 같기 때문입니다.

그럼 좋은 날 되시고 다음에 뵙겠습니다.



dolljong@dreamwiz.com