엑셀개체를 생성 후 프로세스가 종료되지 않고 작업관리자에 그대로 남아 있는 경우가 있을 것입니다.
틀림없이 워크북은 닫혔는데도 excel 자체는 종료하지 않고 남아 있는 경우가 있습니다.
엑셀개체가 종료되지 않아 자유게시판에도 질문을 드렸고 비슷한 내용의 글도 참고로 했지만 닫히지 않더군요
작업관리자에서 엑셀과 관련된 프로세서를 모두 종료시키는 코드를 api로 만들어서 하는 방법이 있지만 그것은 어떤 때는 문제를 일으키더군요
또한,워크시트를 닫은 후 워크북과 엑셀자체를 set ~ nothing 해주면 된다고 하던데 그것도 어떻게 코딩을 했느냐에 따라 다르더군요
자료와 도움을 주신분들의 글을 참고해서 몇 시간이 걸려서 해결했습니다.
엑셀개체가 종료안되는 이유는 의외로 간단한 곳에 있더군요
밑의 것을 실행했을 때 엑셀개체가 종료된다는 분도 있는데 저는 안되던데요
문제가 있는 부분을 파란색으로 다시 코딩하니 잘 되더군요
밑의 처럼 코딩하는 분들은 드물수 있지만 엑셀의 매크로 코드를 참고할 때는 가끔 실수를 할 때가 있으므로 한 번쯤 살펴보세요
대부분은 잘 아시는 부분이겠지만,모르시는 분들은 이런 경우가 있으면 참고하세요
너무나 생고생을 해서 찾은 것이라 두번 다시 이런 것으로 고생하는 분들이 없었으면 합니다.
set으로 정의한 것은 반드시 set으로 사용하고 set을 종료시켜주면 됩니다.
밑에서 파란색 부분을 잘 보면 아시겠지만,set로 정의해준대로 사용을 해야 됩니다.
엑셀에서 매크로 코드를 만들어서 vb에 다시 붙여넣어 사용하다 보면 어떤 부분은 set으로 정의해준대로 하지 않아도 정상적으로 작동하는 것을 볼 수 있습니다.
그래서 ActiveSheet.Name = "자료" 것처럼 set에서 정의해준 xlwb를 사용하지 않아도 작동은 합니다.
하지만,이런 것이 엑셀개체를 정상적으로 종료시켜주지 못하는 원인이 됩니다.
당연히 엑셀개체를 로드한 후므로 ActiveSheet.Name = "자료" 것을 사용하면 엑셀에서는 또다른 것을 생성한 것으로 인식하는 것 같습니다.
특히,차트의 제목 위치를 이동하는 부분에서 Selection.Left = 26을 그대로 사용하면 엑셀개체는 닫히지 않습니다.
이것도 set으로 정의해 준대로 하거나 제거를 해야합니다.
set으로 정의한 xlwb나 xlsh으로 코딩을 하지 않은 부분이 한 군데라도 있는지 찾아서 xlwb나 xlsh을 사용해서 코딩하는 것으로 바꾸면 해결됩니다.
Dim xl As Excel.Application
Dim xlwb As Excel.Workbook
Dim xlsh As Excel.Worksheet
On Error Resume Next ' 오류를 무시합니다.
Set xl = GetObject(, "Excel.Application") ' 실행된 엑셀이 있으면 가져온다
If Err.Number <> 0 Then ' Excel가 실행되고 있지 않았다면
Set xl = CreateObject("Excel.Application") ' Excel 객체를 로드한다.
ExcelWasNotRunning = True
End If
On Error GoTo 0 ' 정상적인 오류 처리
Set xlwb = xl.Workbooks.Add '// 워크북 하나를 추가한다.
Sheets.Add '기본양식 입력할 시트 추가(데이터 자료 입력할 시트)=>xlwb.Sheets.Add
ActiveSheet.Name = "자료" '/시트이름 변경=>xlwb.ActiveSheet.Name = "자료"
Set xlsh = xlwb.Sheets.Add '/ 시트를 하나 추가한다.(그래프 그릴 시트)
ActiveSheet.Name = "그래프" '/시트이름 변경=>xlwb.ActiveSheet.Name = "그래프"
'차트를 그릴 데이터 범위를 선택한다.
Sheets("그래프").Select '그래프 시트 선택=>xlwb.Sheets("그래프").Select
xlwb.Charts.Add '차트를 추가한다.
xlwb.ActiveChart.ChartType = xlLineMarkers '차트 종류
xlwb.ActiveChart.SetSourceData Source:=Sheets("데이터자료").Range("A" & i & ":" & colstr & i), PlotBy:=xlRows
xlwb.ActiveChart.Location Where:=xlLocationAsObject, Name:=xlsh.Name
xlwb.ActiveChart.ApplyDataLabels Type:=xlDataLabelsShowValue, LegendKey:=False
xlwb.ActiveChart.HasLegend = False
'차트 제목 입력부분
With xlwb.ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = grpstr(i)
.ChartTitle.Select
Selection.Left = 26 '차트 제목 위치=>Selection.Left = 26=>이런 경우도 엑셀개체가 종료가 안되는 원인입니다.(코딩을 안함? 다른 방법?)
.Axes(xlValue).HasTitle = True
.Axes(xlValue).AxisTitle.Characters.Text = "정보"
With .Axes(xlCategory) 'x축 눈금선 조정
.CrossesAt = 1
.TickLabelSpacing = 1
.TickMarkSpacing = 1
.AxisBetweenCategories = True
.ReversePlotOrder = False
End With
With .Axes(xlValue) 'y축 눈금선 조정
.MinimumScale = 0
.MaximumScale = sty
.MajorUnit = 1
End With
End With
xlwb.ActiveSheet.Shapes("Chart " & i).ScaleWidth linewidth, msofalse, msoScaleFromTopLeft '차트 크기
xlwb.ActiveSheet.Shapes("Chart " & i).IncrementLeft -99.6 '차트 왼쪽 위치
xlwb.ActiveSheet.Shapes("Chart " & i).IncrementTop i * y
'workbooks(1).saveas "c:\테스트.xls"=>이렇게 코딩하는 것도 엑셀개체를 정상적으로 닫히지 않게 하는 이유가 됩니다.(set으로 정의해준대로 코딩해야 합니다.)
xlwb.SaveAs "c:\테스트.xls"
xl.Quit
Set xlsh = Nothing
'xlwb.Close
Set xlwb = Nothing
Excel report하다보니.. 별일이 다 있더군뇨..
말씀하신데루 실행해두 어떤때는 되구 아니될때가 있더라구요...
아무래두 Excel의 문제점이 아닐지..
전 그냥 프로세스로 제거했는데 깔끔하더군뇨..
Public Sub Process_Kill(ByVal strXL As String)
Dim Xhwnd As Long
Dim HProcess As Long
Dim PID As Long
Dim TID As Long
Xhwnd = FindWindow("XLMAIN", "MicroSoft Excel - " & strXL & ".xls")
TID = GetWindowThreadProcessId(Xhwnd, PID)
HProcess = OpenProcess(SYNCHRONIZE Or PROCESS_TERMINATE, 0&, PID)
Call TerminateProcess(HProcess, 0&)
DoEvents
Call CloseHandle(HProcess)
End Sub
감사합니다.
아주 잘 종료되네요. ㅎㅎ
종료문제로 인하여 편법으로 엑셀개체를 재활용 하다가,
꼭 새개체를 사용해야하는 이유가 생겨서, 이 문제로 반나절을 고민했습니다.
Range 나 Activecell 들을 set 에 정의한 개체로 사용하지 않고 쓰면
종료가 안되네요.
다른분들은 제발 고생 안하셨으면.. ㅜㅜ
덧붙이자면... Selection 도 개체를 앞에 넣어주면 정상적으로 사용 가능하네요 ^^
'워드프로세스 > VBA' 카테고리의 다른 글
VBA 매크로를 Word 추가 기능으로 (0) | 2008.12.16 |
---|---|
VBA 매크로 코드사인(codesign) (0) | 2008.04.24 |
모질라/파이어폭스 XPI signing (0) | 2008.03.20 |