2009-08-13 8 views
1

Access 데이터베이스의 모듈 내부에서 생성 된 Excel 인스턴스를 사용하여 일련의 Excel 스프레드 시트를 열려고합니다. 파일을 제대로 열 수 있습니다. 그러나 Excel 시작을위한 실제 호출은 꽤 오래 걸리고 파일을 여는 데 훨씬 오래 걸립니다. 파일의 위치는 중요하지 않습니다 (네트워크 드라이브로 로컬 HDD에서 열 때와 동일).VBA 파일 열기가 느립니다.

너무 오래 걸리는 부분을 찾기 위해 로깅 모듈에 타이머를 추가했습니다. 파일을 여는 데는 약 2 분의 30 분이 걸리는 반면 호스트 응용 프로그램 (액세스)은 사용자 입력에 전혀 반응하지 않습니다. 나머지 스크립트는 10 초 이내에 실행됩니다. 이 라인 주위에 Debug.Print 방법을 사용

Set OpenSpreadsheet = Excel.Workbooks.Open(Name, 2, False) 

을 다음과 같이 내가 표준 Excel.Workbooks.Open 전화를 사용하고

는 실행이 하나 개의 라인이 1/2 분까지 걸릴 수 있습니다 말한다.

Excel 파일을 더 빨리 열 수 있도록 할 수있는 방법이 있습니까?

편집 : UpdateLinksFalse이고 ReadOnlyTrue입니다. 다른 모든 옵션은 기본값으로 유지됩니다.

+1

문서를 여는 방법을 보여주는 코드를 추가하고 + 설정 한 참조를 사용하면 회신하기가 더 쉽습니다. 그러나 확실히, 10 초 이상. 길어. –

+0

동의 함, +1 ... 방법을 확인해야합니다. – Smandoli

+0

나는 한 줄짜리 시간이 걸리는 전화를 추가했다. –

답변

3

첫 번째 아이디어 : Excel 개체로 열지 않고 Excel에 ODBC 연결을 사용하는 제트 드라이버를 사용할 수 있습니까? 훨씬 빠를 수도 있습니다.

두 번째 아이디어 : 루틴을 시작할 때 Excel 응용 프로그램 개체를 한 번만 만들고 인스턴스화 한 다음 각 스프레드 시트에 대해 Excel.Workbooks.Open() 및 Excel.ActiveWorkbook.Close()를 사용하십시오. 그렇게하면 매번 MS Excel 응용 프로그램을 "다시 시작하지"않습니다.

+0

이 작업 - 작업 관리자를 주시하면서 모듈을 실행하고 코드에서 하나만 만들었지 만 세 개의 Excel 인스턴스가 만들어졌습니다. –

0

@ BradC의 권장 권고 사항 중 두 번째를 추출하려면 Excel을 둘 이상의 절차에서 사용해야하는 경우 자체 초기화 전역 함수를 만드십시오. 나는 항상 Office 앱을 자동화하기 위해 후기 바인딩을 사용합니다.

Public Function Excel(Optional bolCleanup As Boolean = False) As Object 
    Static objExcel As Object 

    If bolCleanup Then 
     If Not objExcel Is Nothing Then 
      Set objExcel = Nothing 
      Exit Function 
     End If 
    End If 
    If objExcel Is Nothing Then 
     Set objExcel = CreateObject("Excel.Application") 
    End If 
    Set Excel = objExcel 
    End Function 

그럼 당신은 초기화 할 필요없이 코드에서 사용할 수 있으며, 단일 인스턴스는 Excel을 사용할 필요가 코드에 사용할 수있는 상태로 유지됩니다.

그리고 앱을 종료하면 Excel (True)을 호출하여 정리합니다.

Outlook과 Word에서 항상이 작업을 수행합니다. 그러나 PDF 처리기와 같이 제대로 작동하지 않는 COM 응용 프로그램이 있습니다.이 종류의 처리에는 아무런 문제가 없습니다 (끝없는 반복으로 끝나고 종료하면 다시 종료됩니다. 이 방법으로 인스턴스를 파괴하십시오.)

관련 문제