2017-09-26 1 views
3

개체가 VBA에서 오류 처리기없이 특정 메서드를 지원하는지 여부를 확인할 수 있습니까?오브젝트가 vba에서 메소드를 지원하는지 확인하는 방법은 무엇입니까?

예를 들어 JavaScriptSymphony2과 같은 질문을 여러 번 받았지만 아직 VBA에서는 찾을 수 없습니다.

ie.document 클래스 항목에 .sendkeys "{ENTER}" 명령을 사용하고 개체가 메서드를 지원하는지 확인하는 방법을 배우면 장기적으로보다 명확한 코드를 작성할 수 있습니다.

예제 코드 : 당신은, 당신은 할 수 없습니다 사용하고있는 API에 대한 문서를 보는

Set elements(17) = ie.document.getElementsByClassName("ng-binding ng-scope") 
for each item in elements(17) 
    item.sendkeys "{ENTER}" 
next item 

답변

3

짧은.

적어도 늦은 접속 코드는 아닙니다.

Option Explicit 

Public Sub Test(ByVal o As Object) 
    Debug.Print o.FooBarBazz 
End Sub 

또는이 코드는 컴파일 그 이유는 - 정의에 의하면, 런타임에 바인딩 코드는 회원이 해당 객체의 인터페이스를 사용할 수 있는지 확인하는 어떠한 컴파일 타임 방법이 없습니다 즉, 런타임에 해결 이것은 하나 좀 더 현실적인 : 물론

Dim ws As Worksheet 
Set ws = ThisWorkbook.Worksheets("Test") 
Debug.Print ws.Naame ' typo won't compile! 

그것의 :

Debug.Print ThisWorkbook.Worksheets("Test").Naame 'Worksheets.Item returns an Object 

회원이 지원되는지 여부를 런타임 전에 알 수있는 유일한 방법, 초기 바인딩 호출을 사용하는 것입니다 이 아니라이 간단합니다. 초기 바인딩 된 인터페이스조차도 "확장 가능"하다는 COM 플래그를 가질 수 있기 때문입니다.

Debug.Print Excel.Application.FooBarBazz ' compiles! 

하지만 표류하고 있습니다 : Excel.Application는 하나 개의 인터페이스입니다.

"오류 처리 안 함"이라고 말하면 ...?

On Error Resume Next 
item.sendkeys "{ENTER}" 
'If Err.Number = 438 Then Debug.Print "Not supported!" 
On Error GoTo 0 
+0

@ Mat 's 머그잔을 작성해 주셔서 감사합니다. 오버 완성 및 직접 답변입니다. 나는 약간의 설명을 이해했으며, 일단이 개념/용어에 대한 더 넓은 기초와 이해력이 있으면 논증을 따를 수 있는지이 질문으로 돌아갈 것이다. 내가 알고있는 한, "오류 처리가 없다"는 계산에 포함되지 않지만, 기여에 대해 감사하고 싶습니다. 마지막으로 다음을 추가하지 않았습니다.이 질문을 제기하게 된 문제가있었습니다. 첫 번째 경우. –

+1

@ a.t. "초기 바인딩"은 프로젝트에서 참조하는 라이브러리를 참조하는 것으로 생각할 수 있습니다 (도구> 참조 참조). 컴파일시 해결됩니다. "late-bound"는'Object' 또는'Variant/Object'에 대한 모든 호출입니다. VBA는 런타임에 멤버를 분석합니다 (찾지 못하면 오류 438을 발생시킵니다). –

+1

소개해 주셔서 감사합니다. 런타임 및 컴파일 타임 코드에 대한보다 정교한 설명이되었습니다. [here.] (https://stackoverflow.com/questions/846103/runtime-vs-compile-time#846421) –

관련 문제