문제

나는 여기서 무언가로 어려움을 겪고 있습니다. 클래스 모듈이 있습니다. 프로젝트에있는 많은 수의 사용자 형식과 관련된 많은 방법이있는 Formman이라고 부릅니다. 한 가지 특정 방법은 여러 곳에서 호출되는 것이며 매우 간단합니다. 단순히 사용자 정의 컨트롤 수를 양식에 추가하고 이러한 새로운 컨트롤을 수용하기 위해 양식 높이를 확장합니다.

사용자는 컨트롤 수와 userform을 전달합니다.

oF.AddControlsToForm iNumberOfControls,frmTest

Formman 클래스 모듈에서 :

Public Sub Addcontrols(iNum as integer, oForm as userform)

//stuff happens here, oForm is used extensively

oForm.Height = i  //object does not support this property or method
frmTest.Height = i //works

oForm.Show //object does not...
frmTest.show  //works

end sub

현지인 창에서 Oform은 높이 속성이 없으므로 충분히 공정합니다. 그러나 Oform은 FRMTEST로 정의되었습니다. 나는 말할 수있다 oForm.BackColor = vbred, 그리고 나는 설정할 수 있습니다 ctl = oform.TextBox1 예를 들어

이것은 어떤 형태에도 많은 컨트롤을 추가 할 수있는 일반적인 절차입니다. Oform에 할당하기 전에 양식을로드하고 표시하려고 시도했습니다.

높이와 표시 속성과 사용자 형식의 속성과 메소드가 사용자 형식으로 선언되지 않은 이유는 무엇입니까? 내가 뭘 잘못하고 있죠?

도움이 정말 감사합니다.

도움이 되었습니까?

해결책

여기서 문제는 userform 및 frmtest 객체가 같은 유형이 아니라는 것입니다. 실제로 FRMTEST는 다른 멤버 중에서도 높이 속성을 추가하여이를 확장하는 사용자 형식의 하위 유형입니다.

함수 매개 변수를 개체로 선언하기 위해 의지해야 할 것입니다.

Public Sub Addcontrols(iNum as integer, oForm as Object)

불행히도 타입 안전을 희생 할 것이지만, 이것은 원하는대로 작동해야합니다. 대부분의 OO 개념은 VBA의 맥락에서 분리되는 경향이 있습니다.

다른 팁

VBA에 대해 가장 먼저 기억해야 할 것은 Full-OO가 아닌 준 OO라는 것입니다. 나는이 문제에 대해 많은 엉뚱한 문제를 해결하기 때문에 이제 VBA의 일관성에 전적으로 의존하는 것을 피하는 경향이 있습니다.

즉, 이것을 시도해보십시오.

Dim fname = oForm.Name (or whatever the property is for this subobject)
With VBA.UserForms.Add(fname)
   .Height = x
   .Show
End With

너무 기괴하지 않습니까?!?! 코드 예제가 준비되어 있고 대기 중이 아니므로 성공을 보장 할 수는 없지만 올바른 접근 방식처럼 느껴집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top