programing

컴파일로 인해 "사용자 정의 유형이 정의되지 않음" 오류가 발생하지만 문제가 되는 코드 행으로 이동하지는 않습니다.

telebox 2023. 4. 17. 21:40
반응형

컴파일로 인해 "사용자 정의 유형이 정의되지 않음" 오류가 발생하지만 문제가 되는 코드 행으로 이동하지는 않습니다.

증상

이는 Excel VBA 프로젝트를 컴파일할 때 나타나는 증상입니다.다음 오류가 발생합니다.

User-defined type not defined

다만, 이 에러의 원인이 되는 코드가 컴파일러에 의해서 강조 표시되어 있지 않기 때문에, 문제를 특정할 수 없습니다.

내가 이미 알고 시도해 본 것

「정의되어 있지 않다」라고 하는 에러입니다.를 들어, 「사용자 정의 타입이 정의되어 있지 않다」라고 는, 에 본 .이 에러는, 무엇인가의 이름을 붙이는 것과 같은 간단한 문제로 이전에 본 적이 있습니다.As StrigAs String이 는 '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', 'Debug > Compile VBAProject메뉴 옵션 및 오류 메시지 상자가 뜨면 오류가 발생한 코드 행이 강조 표시되지 않습니다.

많은 조사 결과, 이 버그가 참조 누락과 관련이 있을 수 있다는 것을 알게 되었습니다.필요한 참조와 Toolbox 오브젝트를 모두 포함했기 때문에 이 버그는 제외되었습니다.

한 하기 위해DimOption Explicit모든 코드 페이지(양식 포함)로 이동하여 누락된 것이 없는지 확인합니다.컴파일을 실행하면 아직 에러가 나타난다.

또한문제는 바이너리 호환성을 사용하는 VB6 프로젝트로 인해 발생했다고 알려진 버그도 있습니다.

이진 호환성을 해제하고 프로젝트를 컴파일합니다.Visual Basic은 정의되지 않은 사용자 정의 유형을 포함하는 코드 행을 강조 표시합니다.문제가 해결되면 바이너리 호환성을 다시 켤 수 있습니다.

Q&A에서 이 기사를 찾았는데, 표준 Excel VBA 에디터에서는 이 옵션을 찾을 수 없습니다.

나와 다른 사람들의 제정신을 구할 수 있도록 도와주세요!

구글 검색 및 기타 질문을 통해 이 문제가 발생한 것은 저뿐만이 아니라는 것을 알고 있습니다.

코드를 수동으로 검토해보았지만 실현가능하기엔 행이 너무 많습니다.

Excel VBA 프로젝트에서 바이너리 호환성을 해제할 수 있는 방법이 있습니까?변경해야 할 내용을 디버깅할 수 없는 경우, 이 문제의 코드 행을 어떻게 찾을 수 있을까요?어떤 도움이라도 주시면 감사하겠습니다!

잘 부탁드립니다.

편집: 문제가 되는 코드 행을 발견했기 때문에 특정 문제가 해결되었습니다.이 특정 행을 삭제해도 문제는 해결되지 않습니다.코드에 참조되고 있는 폼의 오자 컨트롤 이름입니다.이 경우에도 이 문제의 원인이 되는 코드를 찾는 방법에 대한 구체적인 문제는 해결되지 않습니다.이 버그가 발생했을 때 다른 사람이 이 문제를 피할 수 있도록 문제를 일으키는 코드를 찾을 수 있는 좋은 방법을 찾을 수 있을까요?

내 해결책은 좋은 소식은 아니지만 적어도 효과가 있을 것이다.

예를 들어 동료가 보낸 .xlsm을 가지고 있습니다.1) 열고 버튼을 클릭하면 정상적으로 동작합니다.2) 파일을 저장하고 Excel을 닫은 후 다시 파일을 엽니다.이제 작동하지 않습니다.결론: 코드는 정상이지만 Excel이 참조를 올바르게 관리할 수 없습니다.(참조 재추가 시도했지만 실패)

그 은 모든 참조 을 '알아서'라고 입니다.Variant를 사용합니다.CreateObject("Foo.Bar")New Foo.Bar.

예를 들어 다음과 같습니다.

Dim objXML As MSXML2.DOMDocument
Set objXML = New MSXML2.DOMDocument

대체 절차:

Dim objXML As Variant
Set objXML = CreateObject("MSXML2.DOMDocument")

같은 문제가 있었습니다(인터페이스를 유저 폼에 실장하려고 하면, 항상 발생하는 것 같습니다).여기서 Code Cleaner를 다운로드하여 설치합니다.프리웨어 유틸리티로 여러 번 도움이 되었습니다.VBA 프로젝트를 연 상태에서"Clean Code..."실행 " 내보내기하십시오.Clean을 실행하기 전에 "백업 프로젝트" 및/또는 "모든 코드 모듈 내보내기"를 안전한 위치로 확인하십시오.이 유틸리티는 모든 모듈 및 클래스를 내보낸 후 다시 불러오기 때문에 코드에 침입한 컴파일러 오류가 발생하지 않습니다.아아아!행운을 빌어요.

여러 가지 기존 솔루션을 사용해 본 것 같기 때문에, 이 작업은 장기간에 걸쳐 실시해야 할 것입니다.

새 빈 워크북을 만듭니다.그런 다음 오래된 워크북을 하나씩 복사하십시오.레퍼런스를 추가하고 테스트하기 위해 약간의 코드를 작성합니다.컴파일하고 실행하는지 확인합니다.서브 또는 함수를 추가하고 다시 작은 테스트 서브를 작성하여 실행하고 컴파일을 수행합니다.이 과정을 천천히 반복하여 모든 항목을 추가하고 테스트합니다.

먼저 큰 청크를 시험한 후 문제의 원인이 되는 청크를 발견하면 이를 제거하고 테스트를 위해 작은 피스로 분할하여 속도를 높일 수 있습니다.

범인을 찾거나 마법처럼 문제가 없는 새 워크북을 받게 될 것입니다.후자는 워크북 파일(아마 바이너리 vbproject 부분)에 숨겨진 손상이 있기 때문일 수 있습니다.

디버거나 다른 편리한 툴이 없는 디버깅의 세계에 오신 것을 환영합니다.

나도 이런 문제가 있었단 걸 알려드리기 위해서요코드보다는 버튼이 어떤 매크로를 호출했는지가 문제였습니다.(그것은 'creatoroutes.creatoroutes' 매크로라고 불렀는데 'creatoroutes' 모듈의 이름을 'routes'로 변경했습니다.)따라서 버튼을 올바른 위치로 향하면 문제가 해결되었습니다.

비슷한 경험을 했지만, 수업 중 한 과목에서 열거형 이름을 바꾸었기 때문입니다.이전 열거형을 참조한 클래스를 내보내고 다시 가져오면 오류 메시지가 사라집니다.이는 VBA 환경의 캐싱 문제임을 나타냅니다.

에러를 수정했습니다.

  1. 액세스를 완전히 닫는 중
  2. 데이터베이스 파일 이름 변경
  3. 액세스에서 이름이 변경된 데이터베이스 파일을 엽니다.
  4. 다양한 보안 경고 및 프롬프트를 받아들였습니다.
    • 매크로 사용을 선택한 것뿐만 아니라 이름이 변경된 데이터베이스를 신뢰할 수 있는 문서로 만드는 것도 수락했습니다.
    • 이전 파일도 신뢰할 수 있는 문서로 표시되었습니다.
  5. 코드를 변경하지 않고 오류 없이 VBA 프로젝트를 성공적으로 컴파일합니다.
  6. 컴파일이 정상적으로 종료된 후 다시 Access를 닫고 원래 파일명으로 이름을 변경할 수 있었습니다.동일한 보안 프롬프트에 회신해야 했지만 VBA 프로젝트를 열어보니 오류 없이 컴파일되었습니다.

이 사례와 관찰의 간단한 이력:

  • 제가 관찰한 증상이 남들과 조금 다르거나 제 해결책이 독특해 보여서 이 답변을 올렸습니다.
  • 적어도 오류가 발생한 시간 동안 VBA 창에는 두 개의 "미스터리한" 프로젝트가 추가로 표시되었습니다.유감스럽게도 오류를 해결하기 전에 이름을 기록하지 않았습니다.하나는 ACXTOOLS 같은 거였어요.내부 모듈을 열 수 없습니다.
  • 모듈 코드를 업데이트하기 전에 폼에 큰 변경을 가했기 때문에, 원래의 문제는 코드 불량이라고 생각합니다.하지만 코드를 수정한 후에도 오류가 지속되었습니다.양식이 로드되고 오류가 없기 때문에 코드가 작동한다는 것을 알았습니다.원래 게시글에서 설명한 것처럼 "User-defined type not defined(사용자 정의 유형이 정의되지 않음)" 오류가 나타나지만 문제가 되는 코드 행에는 표시되지 않습니다.
  • 이 오류를 발견하기 전에 필요한 모든 참조가 추가되었는지 확인했습니다.데이터베이스를 여러 번 압축하고 복구했습니다.여러 수정 시도 사이에 Access를 종료하고 파일을 여러 번 다시 열었습니다.문제가 있는 폼은 삭제했지만, 에러가 발생했습니다.여기와 다른 포럼에서 제안된 다른 여러 단계를 시도했지만 문제가 해결되지 않았습니다.
  • 한 번에 하나의 폼/모듈을 삭제하는 등 과감한 조치를 시도하기 위해 백업 복사본을 만들 때 우연히 이 수정 사항을 발견했습니다.그러나 백업 복사본을 열었을 때 문제가 다시 발생하지 않았습니다.

일반 VB6 프로그램에서 이 문제가 발생했습니다.알고 보니 사용자 정의 유형이 아닌 클래스 정의를 생략했습니다.VB는 "Thing.name"과 같은 것을 보고 Thing이 UDT라고 가정했습니다. 네, 심각한 VB6 버그이지만 마이크로소프트가 16년 전에 판매한 제품을 지원할 것이라고는 기대하기 어려웠습니다.관련된 다양한 제품 중 어떤 버전을 사용하고 있습니까?이는 MS가 지원하는 제품에서만 가능합니다.

오래된 건 알지만 비슷한 문제가 있어서 해결 방법을 찾았어요.

Excel에서 Access로 포팅한 모듈에서도 같은 문제가 있었습니다.관련되지 않은 UDF에서 'As Range'를 어둡게 하고 있었는데 Access에 범위가 없습니다.적절한 참조 라이브러리를 설정하지 않고 변수 유형을 사용할 수 있습니다.

표준이 아닌 DIM이 있는 경우 Google에서 도구 아래에 있는 라이브러리에 대한 참조가 누락되지 않았는지 확인합니다.

-E

향후 참조를 위해 -

Microsoft Access의 이 코드 조각에서 다음과 같은 코멘트가 있는 행을 강조 표시하는 디버거에 문제가 발생했습니다.

Option Compare Database
Option Explicit

Dim strSQL As String
Dim rstrSQL As String
Dim strTempPass As String


Private Sub btnForgotPassword_Click()
On Error GoTo ErrorHandler

Dim oApp As Outlook.Application '<---------------------------------Offending line
Dim oMail As MailItem
Set oApp = CreateObject("Outlook.application") 'this is the "instance" of Outlook
Set oMail = oApp.CreateItem(olMailItem) 'this is the actual "email"

이전에 선택 해제된 참조를 선택해야 했습니다.그들은...

15 라이브러리 Microsoft Outlook 15.0 입니다.
View Control Microsoft Outlook 뷰뷰뷰 。

스크립팅의 경우.딕셔너리 타입에서는 다음 중 하나와 함께 레이트바인딩을 사용할 수 있습니다(이미 지적된 바와 같이).

Dim Dict as Object
Set Dict = CreateObject("Scripting.Dictionary")

작동은 하지만 코드 자동 완성은 되지 않습니다.또는 초기 바인딩을 사용하지만 VBA가 스크립팅을 찾을 수 있는지 확인해야 합니다.VBA를 통해 Microsoft 스크립트 라이브러리에 참조를 추가하는 사전 유형 --> 도구 --> 참조 --> "Microsoft 스크립트 런타임"다음으로 다음을 사용할 수 있습니다.

Dim Dict as Scripting.Dictionary
Set Dict = New Scripting.Dictionary

...자동 완성이 작동하게 됩니다.

가능한 해결책으로는 Excel VBA를 통해 Powerpoint를 사용하려고 하는데 Powerpoint Object Library를 먼저 활성화하지 않았습니다.

이를 수행하려면 VBA 에디터 상단 메뉴에서 도구, 참조를 선택한 다음 아래로 스크롤하여 Microsoft Powerpoint xx.x 객체 라이브러리라는 라이브러리를 클릭합니다.Office 2007은 라이브러리 12이며 Office 버전마다 다른 라이브러리가 있습니다.참고로 2007년 라이브러리를 활성화 했을 때 이상한 오류와 파일 파손이 발생했는데 누군가가 Excel 2003을 사용하여 매크로를 열고 실행하려고 합니다.이전 버전의 Excel은 새로운 라이브러리를 인식하지 못해 문제가 발생하는 것 같습니다.

MS Access 데이터베이스에서 이 오류가 발생했을 때 Compact/Repair 옵션과 함께 /decompile 명령줄 스위치를 사용했습니다.나한테는 통했어코드가 더 이상 사용되지 않는다고 확신하는 참조를 삭제하여 이 오류가 발생하기 시작했습니다.

레이트 바인딩

이 오류는 참조 누락으로 인해 발생할 수 있습니다.예를 들어, 초기 바인딩에서 후기 바인딩으로 변경할 때 참조를 제거함으로써 삭제된 참조에 고유한 데이터 유형을 참조하는 일부 코드가 남아 있을 수 있습니다.

문제가 해소되지 않았는지 참조를 포함시켜 보겠습니다.

에러가 컴파일러 에러가 아니라 링커 에러일 가능성이 있기 때문에, 구체적인 회선을 알 수 없습니다.마이크로소프트가 부끄럽다!

몇 년 후, Excel의 「사용자 정의 타입이 정의되어 있지 않다」에러의 Microsoft 버그에 대한 해답을 발견했습니다.Windows용 Excel 2010을 실행하고 있습니다.

들어 ''라는 의 UDF가 xyz()그 후 존재하지 않는 엔티티를 그 이름으로 시작하고 마침표 뒤에 다른 문자를 호출하면(예를 들어 존재하지 않는 범위 이름을 xyz.abc호출하려고 하면) 멍청한 앱은 잘못된 메시지를 던지고 시트로 돌아갑니다.

UDF 로만 되어 있기 때문에 특히를 들어, UDF는 1글자로 .x(),y(), 등, 마침표를 포함한 범위명도 있습니다.x.ac.d예를 들어 'x.h'와 같은 범위 이름의 철자를 틀릴 때마다 단순히 'UDF'라는 이름의 UDF 때문에 'User-defined...' 오류가 발생하였습니다.x()'이렇게 하다'는 것을 말합니다.

진단하는 데 몇 시간이 걸렸다.프로젝트에서 코드를 점진적으로 삭제하거나 반대로 모든 코드를 삭제하고 점진적으로 다시 추가하자는 위의 제안은 올바른 방향으로 진행되었지만 제대로 진행되지 않았습니다. 그가 없습니다.proc의 첫줄, 즉 '코드의 첫 줄'과 이 있을 입니다.Sub MyProc ★★★★★★★★★★★★★★★★★」Function MyProc에 proc.sec의 이름을 붙입니다.프로젝트와 전혀 관련이 없는 부분에서 1글자로 명명된 UDF 중 하나를 코멘트했을 때 버그 오류 메시지가 사라졌고, 그로부터 약 1시간 후 규칙을 일반화할 수 있었습니다.

마침표(') 이외의 구두점 문자에서도 버그가 발생할 수 있습니다..이름에는 수 있는 는 많지 은 긋기('), 긋기(')'입니다._허용되지만 은 허용되지만 설명된 방법으로 사용해도 버그가 발생하지 않는 것 같습니다.

짐 루에케

어제도 같은 에러가 발생했습니다.프로젝트에서 cProgress와 cProgressEx라는2개의 클래스가 있었는데, 그 중 하나는 사용되지 않게 되었습니다.cProgress 클래스를 삭제하면 동일한 컴파일 오류가 발생합니다.

다음과 같이 오류를 수정했습니다.

  • 모든 모듈, 폼 및 클래스를 하드 드라이브에 내보냈다.
  • 프로젝트에서 모든 것을 제거했습니다.
  • 프로젝트를 저장했습니다.
  • 모든 모듈, 폼 및 클래스를 다시 Import하여 cProgress 클래스를 삭제하고 컴파일했습니다.
  • 오류가 사라졌습니다.

같은 현상의 다른 문제:정의되지 않은 클래스를 구현했습니다.컴파일러가 볼 수 없도록 해야 한다고 생각했지만, 이 파일은 #if로 둘러싸여 있었습니다.Implements 스테이트먼트에서 코멘트를 삭제하면 모든 것이 정상입니다.정의를 가져오는 것도 가능할 것 같은데...

같은 문제가 있었습니다.Microsoft Scripting Runtime을 활성화하면 문제가 없습니다.[ Tools ] > [ References ]그래서 [Microsoft Scripting Runtime]체크박스를 켜겠습니다이것으로 문제가 해결됩니다.

조금 늦었지만 완전한 해결책은 아닙니다만, 명백한 이유 없이 이 에러가 발생한 모든 사람에게 적합합니다(모든 레퍼런스가 정의되어 있는 등).하지만 이 실마리는 나를 올바른 길로 인도했다.이 문제는 MS Office VBA Editor의 캐시 관련 버그에서 발생한 것으로 보입니다.

MS Access 2016에서 코드 모듈 포함 약 40개의 양식과 40개의 클래스 및 일부 글로벌 모듈을 포함한 프로젝트를 일부 변경한 후 컴파일 작업이 실패했습니다.

코드를 코멘트 아웃하는 것은 분명히 선택사항이 아니었습니다.또한 80개 이상의 파일을 내보내고 다시 Import하는 것도 타당하지 않은 것 같습니다.최근에 변경된 것에 집중하면서, 나의 의혹은 클래스 모듈 하나를 제거하는 데 집중되었다.

더 나은 아이디어가 없어서 이전에 제거했던 것과 같은 이름의 빈 클래스 모듈을 다시 처리했습니다.그리고 volia 오류는 사라졌어!이전에 삭제된 클래스와 관련된 WithEvents 선언이 포함된 폼모듈에 변경이 저장될 때까지 오류가 다시 나타나지 않고 사용되지 않은 클래스 모듈을 다시 제거할 수도 있습니다.

선언이 삭제된 후에도 WithEvents 선언이 정말로 오류를 트리거하는 원인인지 완전히 확신할 수 없습니다.(개발 이력에 대한 정보가 없으면) 어떤 Form이 범인인지 실제로 알아낼 수 있는 단서는 없습니다.

하지만 결국 이 문제를 해결한 것은 다음과 같습니다.

  1. VBE - 폼 코드 모듈에서 모든 코드를 복사합니다.
  2. 접근의 설계 보기에서 양식을 열고 모듈 있음 특성을 아니요로 설정합니다.
  3. 프로젝트 저장(양식과 관련된 모든 코드 제거)
  4. (Access를 닫았다가 다시 열어야 할지는 모르겠지만 실행했습니다.)
  5. 설계 보기에서 양식을 열고 Has Module 속성을 Yes로 다시 설정합니다.
  6. VBE에서 복사된 모듈 코드를 다시 붙여넣습니다.
  7. 절약하다

다른 분석가의 워크북을 물려받았을 때도 같은 문제가 있었습니다.그는 워크시트의 각 버튼에 매크로를 할당했다.모듈 이름(프로시저 이름이 아님)을 변경하면 이 오류가 발생합니다.수정은 쉬웠다._OnClick()합니다.Call MyProcedureName().

이 에러는, 코드가 회선상에서 정지했을 때에도 발생하고 있습니다.

MSXML2로서 myNode를 감광합니다.IXMLDOM 모드

[툴(Tools)]> [설정(Preferences)]에서 "Microsoft XML, v6.0"을 추가해야 한다는 것을 알게 되었습니다.

그리고 나는 효과가 있었다.

실제로 무엇이 문제인지, 직접 고쳐야 할지에 대한 답은 없습니다.

코드와 폼을 모두 내보낸 후 새로운 워크북으로 Import하여 수정했다고 보고할 수 있습니다.모든 작업이 복구되었고, 업무에 복귀하기 위해 더 이상 할 필요가 없었다.그것이 동작하고 있기 때문에, Excel의 버그가 틀림없을 것 같습니다.그렇지 않으면 새로운 버전에서는 아직 발견되지 않습니다.

이 Excel(2007)의 버그가 어떻게 동작하는지에 대한 힌트를 얻을 수 있습니다.클래스 모듈의 분리(또는 2개)와 관련되어 있는 것 같습니다.(다만, 모든 클래스모듈은 어떤 이유로든 항상 그렇지는 않습니다.분리한 모듈의 어떤 부분도 사용하고 있지 않습니다(또는 Import된 새로운 버전도 동작하지 않습니다).1개의 모듈은 코멘트(나중에 누락될 가능성이 있는 것을 삭제하기 위해서)로 삭감되어 프로젝트의 다른 부분과 접속하는 코드가 눈에 띄지 않게 되었습니다.하지만 코드 모듈을 완전히 분리한 직후에 오류가 발생했습니다.분리한(단, 만약을 위해 내보낸) 모듈이 반환되었을 때도 오류가 중지되었습니다.따라서 이 프로젝트에서는 이 오류를 피하기 위해 사용하지 않는 코드 모듈을 2개 포장하고 있었습니다.

이 경우 프로젝트 내 어느 곳에서나 이들(이 경우 2개) 클래스 모듈에서 사용되고 있지 않은 경우에도 일부 분리된 모듈의 요소는 VBA 환경에 남아 있는 것으로 보입니다.그 결과 디버깅/컴파일은 그 요소를 찾지만, 그 요소가 존재하기 때문에 무언가가 누락된 것은 놀랄 일이 아닙니다.누락된 것은 프로젝트 어디에도 없기 때문에 강조할 것이 없기 때문에 메시지만 있을 뿐 아무 일도 일어나지 않습니다.그럼 관찰된 행동이 설명이 되겠네요

언급URL : https://stackoverflow.com/questions/19680402/compile-throws-a-user-defined-type-not-defined-error-but-does-not-go-to-the-of

반응형