2013-08-08 4 views
2

우리는 우리가 사용하는 스프레드 시트를 사용하며 대부분의 컴퓨터에서 작동하지만 다른 사람들은 '숨겨진 모듈에서 컴파일 오류 - 일반'으로 폭탄을 터뜨 렸습니다. 이유는 누락 된 참조로 인한 것 같습니다.Excel VBA 컴파일 오류

매크로가 활성화되어 있지만 여전히 도움이되지 않는지 확인합니다.

우리는이 엑셀 스프레드 시트를 암호로 보호하므로, 우리는 사용자들에게이 암호를 제공하여 참조를 확인하기를 원하지 않으며, VBA 코드를 추가하여 어떻게 확인할 수 있는지 궁금해합니다. 엑셀 스프레드 시트에 필요한 참조가 있고 거기에 없다면 사용자에게 조언을 제공하는 메시지 상자를 불러 오십시오. 다음과 같이 우리가 사용하는

참조는 다음과 같습니다

  • 비주얼 베이직을 응용
  • 를 들어
  • 의 Microsoft Excel 11.0 개체 라이브러리
  • Microsoft는
  • Microsoft Windows 공용는 5.0 (SP2)
  • 을 제어 2.0 개체 라이브러리 양식

다른 방법으로이 문제를 해결하는 방법에 대한 다른 제안이있는 경우 , 그것은 좋을 것이다.

+0

참조 확인을위한 vba가 있는지 나는 잘 모르겠지만 설치 한 버전에 따라 엑셀 개체 라이브러리가 다른 경우가 많습니다. 내 제안은 명령이 같으면 늦은 바인딩을 사용하는 것이지만 ... 아마도 더 좋은 방법이있을 것입니다. – RowanC

+0

안녕하세요, 저는 아직도 VBA 프로그래밍에 익숙하지 않습니다. 그렇기 때문에 후기 바인딩을 사용한다는 것은 무엇을 의미합니까? – SamoanProgrammer

+0

http://support.microsoft.com/kb/245115 – RowanC

답변

2

아마도 누락되었을 수있는 유일한 참조는 일반적인 컨트롤입니다. 나머지는 모든 Excel 버전에서 기본값입니다. 양식은 사용자 양식이 있거나 명시 적으로 설정 한 경우에만 해당하지만 문제는 아닙니다. 공용 컨트롤이 문제입니다. 더 이상 Office와 함께 제공되지 않습니다. Visual Studio 또는 VB6있는 경우 아마 있습니다. 또는 XP Developer Edition과 같은 이전 버전의 Office.

어쨌든 시스템 폴더에 OCX 파일이 있는지 확인할 수 있습니다. 나는 그 폴더에 있어야 할 필요는 없다고 생각하지만 다른 곳에서는 본 적이 없다.

5.0에 대한 참조를 본 지 꽤 오래되었으므로 아래 코드에서 6.0을 찾는 방법을 설명했습니다. 사용중인 버전을 확인하십시오. 표준 모듈에서

:

Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long 

Public Function HasCommonControl() As Boolean 

    Dim sFolder As String 
    Dim lReturn As Long 

    Const lSIZE As Long = 255 
    Const sDLLNAME As String = "COMCTL32.OCX" 'For windows common control 5.0 
    'Const sDLLNAME As String = "MSCOMCTL.OCX" 'For windows common control 6.0 

    sFolder = Space(lSIZE) 
    lReturn = GetSystemDirectory(sFolder, lSIZE) 

    sFolder = Left$(sFolder, lReturn) 

    HasCommonControl = Len(Dir(sFolder & Application.PathSeparator & sDLLNAME)) > 0 

End Function 

모든 것을 말해 두 겠는데, 당신은 왜 일반 컨트롤을 사용하고 있습니까? 이 정의 폼에 트 리뷰에 대한 있다면 jkp 내가 공용 컨트롤을 사용하지 않은 것을 쓴 이후,이 모든 VBA를 트 리뷰

http://www.jkp-ads.com/articles/treeview.asp

을 확인하십시오. 그래서 평범한 사람이 거의없는 PC를 설치 한 것은 고통스런 일입니다.

+0

나는 Excel 2010에서 실행할 때 비어있는 treeview를 가지고 있기 때문에 jkp 예제를 온라인에서 찾았습니다. 기본적으로, 우리는 몇 년 전에 만들어진 Excel 템플릿으로 작업하고 있으며 나중에 출시 될 때까지 모두 잘 동작했습니다 Excel의. 내가 가지고있는 문제는 또한 64 비트 컴퓨터 때문이었습니다. 그래서 VBA = 7인지 확인하기 위해 몇 가지 코드를 추가했습니다. 그렇다면 64 비트 코드를 실행하고 그렇지 않으면 32 비트에서 작동하는 코드를 사용하십시오. – SamoanProgrammer

0

레퍼런스 설정이 필요하지 않은 후기 바인딩을 시도하려면 (성능 적중률이있을 수 있지만 코드에서 자동 완성이 작동하지 않음을 의미 함) 다음 방법으로 Excel을 호출하는 대신

Dim oExcel As Excel.Application 
    Set oExcel = CreateObject("Excel.Application") 

이 방법으로 호출하고 엑셀 개체 모델에 대한 참조를 삭제하십시오.

Dim oExcel As Object 
    Set oExcel = CreateObject("Excel.Application") 
+0

감사합니다. 문제가 해결되었습니다. – SamoanProgrammer

1

특정 Excel 또는 다른 구성 요소 버전에 대한 참조에 따라 가능한 한 가지 문제가 있습니다. 후기 바인딩으로 전환하면 한 버전에서 지원되는 명령/객체/메소드/등록 정보를 사용하지 않도록주의하는 한 해당 문제가 해결됩니다. RowanC의 링크 (좋은 선택)에까지 이어

, 당신은 예를 들어, 엑셀에 대한 참조를 추가 할 수 있으며 같은 코드를 작성 :

Dim xlWks as Excel.Worksheet 
'Dim xlWks as Object 

을 모두의 디버깅되면, 엑셀 참조를 제거하고 선언을 변경 to :

'Dim xlWks as Excel.Worksheet 
Dim xlWks as Object 

이렇게하면 코딩/디버깅 중에 intellisense의 이점을 얻을 수 있지만 나중에 특정 버전의 Excel에 대한 종속성을 제거합니다.

실수로 표시 될 수 있지만 IIRC 공용 컨트롤 구성 요소는 Office가 아닌 Visual Basic의 일부이므로 응용 프로그램과 함께 배포하고 등록하지 않으면 일부 시스템에 없을 수 있습니다.

+0

감사합니다. 문제가 해결되었습니다. – SamoanProgrammer