2013-08-30 4 views
1

사용자 폼을 이미 모듈이 들어있는 프로젝트에 삽입했습니다. 사용자 폼의 코드를 사용하여 콤보 상자에서 값을 반환 할 수 있는지 확인했습니다.사용자 양식이 모듈에 값을 전달할 수 없습니다.

사용자 양식 코드 :

Public SelectedPacking As Integer 

Private Sub CancelButton_Click() 
    UserForm1.Hide   
End Sub 

Private Sub OKButton_Click() 
    SelectedPacking = ComboBox1.ListIndex  
    Call DemoDialogOk 

    'Return list index value to cell C50 
    Worksheets("Inputs & Results").Range("C50") = SelectedPacking  
    Unload UserForm1  
End Sub 

내 문제는 내가 모듈에 기록 된 매크로의에에이 값을 전달할 수 없다는 것입니다.

모듈 코드 :

Public Sub ShowComboBox() 
    UserForm1.Show  
End Sub 

Public Sub DemoDialogOk()  
    ival = SelectedPacking 

    'Return value of ival (list index value from combo box) to cell C17 
    Worksheets("Packed bed (Random)").Range("C17") = ival 
End Sub 

은 분명히 모듈은보다 유용한 코드가 포함되어 있습니다, 그러나 나는 시도하고 내가 잘못거야 어디 알아 내기 위해 모든 것을 주석 처리했습니다. 주변을 둘러 보니 몇 가지 변화가 있었지만 C17 셀에는 아무 것도 표시 할 수 없기 때문에 뭔가 근본적인 것이 빠져 있다고 생각합니다.

+0

'DemoDialogOK'에'SelectedPacking'을 매개 변수로 전달해야합니다. 양식을 언로드하면 변수가 보유한 모든 변수가 지워집니다. –

+0

예! 그렇게 간단하지만 완전하게 맞습니다. 감사! – Natalie

+0

폼을 언로드하지 않고 숨기면 폼을 DemoDialogOK에 전달할 필요가 없다는 뜻입니까? – Natalie

답변

1

나는 두 가지 생각 :

Public Sub DemoDialogOk(SelPack as integer)  
    ' ival = SelectedPacking 

    Worksheets("Packed bed (Random)").Range("C17") = SelPack 
End Sub 

Private Sub OKButton_Click() 
    SelectedPacking = ComboBox1.ListIndex 
    Call DemoDialogOk(SelectedPacking) 

    ... 
End Sub 

또는 옵션 두 가지 : 1) 변수를 받아 DemoDialogueOK을 변경 완전히 useform 예에서 변수를 자격 :

Public Sub DemoDialogOk() 
    ival = ufYourForm.SelectedPacking 

    ... 
End Sub 

공공 변수를 정의 폼에 모듈 수준으로 "공개"로 보이지 않습니다 ...

+0

위에서 올린 좋은 점은 언로드가 폼을 완전히 죽일 것이므로 완전히 변수를 참조 할 수 없다고 생각합니다. 그냥 .unload 대신 .hide를 사용합니다. – Simon

+0

방금 ​​SelectedPacking을 DemoDialogOK에 전달했습니다 (처음 옵션을 설명했듯이) 완벽하게 작동했습니다. 나는 그것이 언로드되기 전에 그것을 전달하기 때문에 당신이 그것을 참조 할 수 있다고 생각합니다. – Natalie

+0

이 개념은 더 읽을 추구하는 [전문 엑셀 개발] (http://books.google.com/books?id=VnegO0pMYlIC&pg=PA379&lpg=PA379&dq=professional+excel+development+userform+instance&source=bl&ots=DvFIRlVgPD&sig=__QJWWOpZevmZH13oXAbin8Nmvk&hl=en&sa = X & ei = 5v8fUs74O5DhiwLfvoDABA & ved = 0CC4Q6AEwAA # v = onepage & q = 전문가 % 20excel % 20development % 20userform % 20instance & f = false). 중간에 시작하십시오. 379 페이지. –

0

Simon의 답변 상단에 팁을 달아주세요. 원한다면 전체 userform. 이렇게하면 모든 항목에 액세스 할 수있게되며, 다른 확인란을 선택했는지 여부를 확인해야하는 경우 특히 유용합니다.

Sub inOurUserForm() 
    Call inADifferentModule(Me) 'Passes this userform 
End Sub 

Sub inADifferentModule(ourForm As UserForm1) 
    'Passed the form, and using it like a class (As whatever the form is called) 
    If ourForm.chkYes = True Then 
     'Do something 
    Else 
     'Do something else, like 
     ourForm.chkYes = False 'Because we are passing the object itself _ 
           rather than a copy, at least in my understanding 
    End If 

End Sub 

그리고 userform을 전달할 필요가 없습니다.

UserForm1.chkYes 
0

이하는 아주 쉬운 해결책은

Public Pass as string 

이 패스는 암호를 저장하는 문자열을 포함하는 것 (이 예에서는 UserForm1을) 사용자 정의 폼 내에서 변수를 선언하는 것입니다. 당신이 암호를 저장하면, 당신은 당신이 모달로 양식을 열 수, 형태 모듈 내에서

Me.Hide 

을 숨길 수 있습니다

UserForm1.Show vbModal 

정의 폼 내부의 모든 코드가 실행 된 후 지금 암호 수 모듈 내에서 검색 할 것은 -

UserForm1.Pass 

그런 다음 숨겨진 양식

,563을 언로드 할 수 있습니다
관련 문제