2012-07-05 1 views
1

저는이 문제를 얼마 동안 가지고 놀았으며이를 수행하는 방법을 알아 냈습니다. 나는 (... 그 시트는이 이름 = "하나", 코드 명 = "SheetOne"와 같은 이름이 지정됩니다) 모든 워크 시트에서 같은 기능을 가지고 :워크 시트의 VBA 사용자 지정 프로 시저/함수가 모듈 외부에서 호출되었습니다.

이제
const someVar as Boolean = True 

Public Function myFunction() as Boolean 
myFunction = someVar 
End Function 

나는 그것에서 호출 할 외부에서이 같은 -에서 ThisWorkbook 절차 "하는 DoThis()"과 기능이 "TestThis() :

Sub doThis() 
Dim i as Integer 
For i = 1 to ThisWorkbook.Sheets.Count 
    If testThis(ThisWorkbook.Worksheets(i)) = True then 
     Debug.print "Success!" 
    End If 
Next i 

Function testThis(x As Worksheet) 
If x.myFunction = True Then 
    testThis = True 
Else 
    testThis = False 
End If 

지금 내가 알고있는이 라인에서"x.myFunction이이 True "이 오류가 발생합니다"= 경우 방법 또는 데이터 멤버를 찾을 수 없습니다 ", 왜냐하면이 함수는이 참조를 호출 할 수 없기 때문에 tri

Sub doThis() 
Dim i as Integer 
For i = 1 to ThisWorkbook.Sheets.Count 
    If testThis(ThisWorkbook.VBProject.VBComponents(Worksheets(i).CodeName)) _ 
    = True then 
     Debug.print "Success!" 
    End If 
Next i 

Function testThis(x As VBComponent) 
If x.myFunction = True Then 
    testThis = True 
Else 
    testThis = False 
End If 

다시 말해서 "개체가이 속성 또는 메서드를 지원하지 않습니다."라는 오류가 발생합니다. 어떤 아이디어, 그 워크 시트에 어떤 종류의 참조를 저장 한 변수에서 그 함수를 어떻게 호출 할 수 있습니까? 어떤 도움을 주시면 감사하겠습니다.

답변

1

코드를 컴파일 할 때 Excel은 "WorkSheet"개체 유형이 myFunction 메서드인지 확인합니다. 일반 내장 워크 시트 개체를보고 있으며 "추가 기능"(및 "VBComponent"유형도 마찬가지입니다.) 따라서 오류가 발생합니다.

당신이 다음은 컴파일 (더 일반적인 유형) Object로 당신의 매개 변수 유형을 변경하는 경우

...

Function testThis(x As Object) 
    testThis = x.myFunction() 
End Function 
+0

감사를 포함한다. "x"를 Object 유형으로 변경했지만 정상적으로 컴파일되지만 "x.myFunction"을 호출하면 다시 충돌합니다 (런타임 오류 438 - 객체가이 속성 또는 메서드를 지원하지 않습니다). 변이조차도 이것을 해결하지 못하는 것 같습니다. – Pykas0

+0

모든 시트에'myFunction'이 정의되어 있습니까? 어쩌면 정확한 현재 코드로 질문을 업데이트 할 수 있습니다. –

+0

해당 통합 문서의 모든 워크 시트는 똑같은 기능을합니다. 불행히도 인터페이스를 사용할 수 없다는 것을 지적해야합니다. 필요한 경우, 왜 (메인 퀘스트 편집) 이유를 설명 할 수 있습니다. – Pykas0

0

나는이 오래된 스레드 알고 있지만 나는뿐만 아니라 나의 발견을 공유 할 수 있습니다 생각했다. 또한 모든 시트에서 똑같은 기능을 평가할 수있는 더 나은 방법이있을 것이라고 생각합니다. 그러나 검색하는 모든 사용자는 게시물 제목에서 묻는 것과 정확히 일치하는 해결책을 제시합니다. 당신의 ThisWorkbook에서

는 답변

Const myFunction = "myFunctuion" 
Public ws as Worksheet 

For each ws in Me.Sheets 
    If testThis(ws) then Debug.print "Success!" 
next ws 

Function testThis(x as Worksheet) 
    testThis = callByName x, x.CodeName & "." & myFunction 
End Function