728x90

엑셀개체를 생성 후 프로세스가 종료되지 않고 작업관리자에 그대로 남아 있는 경우가 있을 것입니다.

틀림없이 워크북은 닫혔는데도  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
728x90
((( 준비작업 )))

A. 인증서 신청은
  Netscape Object Signing 인증서를 신청
 또는
  Microsoft Authenticode로 받은 인증서를 Netscape로 변환하여 사용

(일반적으로 사용가능한 Microsoft Authenticode 를 받는 편이 유리)

B. pvkimprt 를 통해 받은 spc , pvk 파일을 레지스트리로 import 시킨다.
pvkimprt 다운로드 : http://www.certkorea.co.kr/pds/pvkimprt.exe


   > pvkimprt -import nine4u.spc nine4u.pvk
   a. 비밀번호를 물어보는 창에서 개인키 비밀번호를 입력한다.
   b. 다음
   c. 인증서 종류 기준으로 인증서 저장소를 자동으로 선택 (default) 에 체크 -> 다음
   d. 마침.
   e. 이상으로 레지스트리에 인증서가 import 된다.
   확인: IE(브라우저) 에서 도구>인터넷옵션>내용>인증서 에서 개인탭을 보시면 발급대상에 추가된 인증서 확인가능


C. 인증서에 이름 부여
  a. IE 의 도구 > 인터넷 옵션 > 내용 > 인증서
  b. 인증서 선택
  c. 보기 > 자세히 > 속성편집
  d. 이름입력 후 확인 (예) nine4uCodeSign


D. pvkimprt 를 통해 pfx 파일로 export 시킨다.
   > pvkimprt -pfx nine4u.spc nine4u.pvk
   a. 비밀번호를 물어보는 창에서 개인키 비밀번호를 입력한다.
   b. 다음
   c. 예, 개인키를 내보냅니다. (default) 에 체크 -> 다음
   d. 가능하면 인증 경로에 있는 인증서 모두 포함 (체크)
      그외 체크 모두 없애고 다음
   e. 암호 , 암호확인 입력 후 다음
   f. 파일이름은 저장할 pfx 파일 이름을 입력합니다. (예: nine4u.pfx) 다음.
   g. 마침.


(참고) http://www.certkorea.co.kr/doc.asp?g_dev_conv


((( 코드사인 시작~~ )))

-------
다음은 윈도우 플랫폼에서 Firefox 플러그인 코드사인 방법입니다.

1. Mozilla FTP 사이트에서 최신의 Network Security Services (NSS) 패키지를 다운 받습니다. :
ftp://ftp.mozilla.org/pub/mozilla.org/security/nss/releases/
윈도우 사용자는 NSS_3_9_RTM/WINNT5.0_OPT.OBJ/ 에서 nss-3.9.zip 을 받습니다.


2. 원하시는 곳에 압축을 풉니다. 예)  C:\Apps\nss-3.9\


3. Mozilla FTP 사이트에서 최신의 Netscape Portable Runtime 을 다운 받습니다. 
http://ftp.mozilla.org/pub/mozilla.org/nspr/releases/
윈도우 사용자는 v4.6/WINNT5.0_OPT.OBJ/ 에서 nspr-4.6.zip 을 받습니다.


4. 압축을 풉니다.  예) C:\Apps\nspr-4.6\


5.  NSS 의 bin , lib, nspr 의 lib 를 시스템 path 에 추가합니다.
   제어판 > 시스템 속성 > 고급 > 환경변수 > 시스템변수 에 추가하거나,
   또는 실행시 마다 설정 하실 수 있습니다.

   윈도우의 경우 몇몇 파일들 (예로, certutil.exe) 은 \widnows\system32\ 에 이미 포함되어 있으니,
   새로 추가된 파일들이 실행되도록 하기 위해 추가될 경로는 기존의 path 앞에 위치 시킵니다.

  설정 예)
          C:\> set PATH=C:\Apps\nss-3.9\bin\;C:\Apps\nss-3.9\lib\;C:\Apps\nspr-4.6\lib\;%PATH%


6. NSS 툴 문서 함 읽어 보시고~ (패스 )


7. 인증서 DB 초기화
  인증서 DB 파일을 위치시킬 폴더를 결정합니다. 다음 명령으로 DB 파일을 생성합니다. ( -d 옵션뒤에 . (마침표) 있음)


  Code:
       C:\Projects\CodeSigning\> certutil -N -d .
  => 현재디렉토리에 인증서 DB 파일을 새로 생성 한다.

  다음 내용과 같이 NSS Certificate database 의 password 를 물어 봅니다.
  (중요) 절대 잊어 버리면 안됩니다.
  뒤에도 비번이 나오는데 NSS 인증서 DB 비번과 , 인증서의 개인키 비번은 별개 입니다. 혼동주의!

   Code:
C:\Projects\CodeSigning\> certutil -N -d .
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.

Enter new password:
Re-enter password:


이후 dir 해보시면
cert8.db , key3.db , secmod.db 파일 3개가 생성되어 있음을 확인 할 수 있습니다.


8. 위에서 준비한 pfx 파일을 NSS cert DB 에 import 시킵니다.

Code:
C:\Projects\CodeSigning> pk12util -i "nine4uCodeSign" -d .
Enter Password or Pin for "NSS Certificate DB":  <- 7번 단계에서 입력한 비밀번호
Enter password for PKCS12 file:                  <- 인증서 개인키 비밀번호
pk12util: PKCS12 IMPORT SUCCESSFUL
; nine4uCodeSign 은 위의 C 단계에서 지정한 인증서 이름입니다.


; 다음 명령으로 인증서가 추가된 것을 확인 하실 수 있습니다.
C:\Projects\CodeSigning> certutil -L -d .
nine4uCodeSign                                               u,u,u
Thawte Code Signing CA - Thawte Consulting cc                c,,c



9. 싸인을 위한 XPI 파일을 준비 합니다.

 새로운 폴더를 하나 생성하고 XPI 파일을 생성된 폴더에 카피 후 경로를 포함하여 압축을 풉니다.
 XPI 파일은 삭제하고 NSS DB 폴더로 돌아갑니다.

(주의) xpi zip 파일내의 파일 순서를 지켜줘야 합니다.
       첫번째 파일은 META-INF/zigbert.rsa 파일이 되어야 합니다.
       순서정렬이 가능한 zip 유틸을 사용하셔야 합니다.

Code:
C:\Projects\CodeSigning\> md signed

C:\Projects\CodeSigning\> copy C:\Projects\fsb\fsb.xpi signed
        1 file(s) copied.

C:\Projects\CodeSigning\> cd signed

C:\Projects\CodeSigning\signed> unzip fsb.xpi
Archive:  fsb.xpi
   creating: chrome/
  inflating: chrome.manifest
  inflating: chrome/fsb.jar
  inflating: install.rdf

C:\Projects\CodeSigning\signed> del fsb.xpi

C:\Projects\CodeSigning\signed> cd ..


10. 싸인 합니다.

Code:
C:\Projects\CodeSigning\> signtool -d . -k nine4uCodeSign -p "NSS패스워드" signed/
using certificate directory: .
Generating signed//META-INF/manifest.mf file..
--> chrome/fsb.jar
--> chrome.manifest
--> install.rdf
Generating zigbert.sf file..
tree "signed/" signed successfully

11. XPI 로 다시 패키징 합니다.

signed 폴더로 가서 META-INF/zigbert.rsa 파일을 처음에 오도록 zip 합니다.

Code:
C:\Projects\Certs\> cd signed

C:\Projects\CodeSigning\signed\> zip fsb.xpi META-INF/zigbert.rsa
  adding: META-INF/zigbert.rsa (deflated 35%)

C:\Projects\CodeSigning\signed> zip -r -D fsb.xpi * -x META-INF/zigbert.rsa
  adding: META-INF/manifest.mf (deflated 37%)
  adding: META-INF/zigbert.sf (deflated 40%)
  adding: chrome/fsb.jar (deflated 74%)
  adding: chrome.manifest (deflated 69%)
  adding: install.rdf (deflated 62%)

12. 완료.


인증서 신청  :  THAWTE : www.certkorea.co.kr,  VERISIGN : www.ssl.co.kr

+ Recent posts