2010-12-09 2 views
1

저는 현재 Excel 2003에서 일련의 데이터 입력 폼을 표시하는 도구를 구축했습니다. 고객은 양식에 "이전 양식"및 "다음 양식"단추가 있어야한다고 요청했습니다.사용자 폼에서 사용자 폼을 반복해서 열면 개체 문제가 발생합니다.

Sub NextForm(strFormName As String) 
    Dim intCurPos As Integer 
    Dim strNewForm As String 

    'Find out which form we are currently on from a list in a range 
    intCurPos = WorksheetFunction.Match(strFormName, Range("SYS.formlist"), 0) 
    If intCurPos = WorksheetFunction.CountA(Range("SYS.formlist")) Then 
     'We want to use the first one 
     intCurPos = 0 
    End If 

    'Get the name of the form to open 
    strNewForm = WorksheetFunction.Index(Range("SYS.formlist"), intCurPos + 1) 
    'Load the form into the Userforms Collection 
    Set newForm = VBA.UserForms.Add(strNewForm) 
    'Show the form 
    newForm.Show 
End Sub 

난 당신이 25 시간을 수행 한 후 (그래 내가 아는)이다 시스템 충돌이 문제를 다음과 같이

형태 사이를 이동하는 데 사용되는 코드입니다. 나는 이것이 당신이 newForm에 도착할 때마다 발생한다는 것을 깨닫는다. 코드 위의 줄은 완료되지 않고 메모리에있다.

모덜리스 양식은이 문제를 중지하지만 사용자는 다른 양식을로드하고 중요한 문제를 일으킬 수있는 다른 작업을 수행 할 수 있습니다.

누구에게 도움이되는 제안이 있습니까? 어떻게 든 코드 실행을 강요하지만 폼의 모달 능력을 멈추게하지는 않습니까?

롱샷이지만 어떤 도움을 주셔서 감사합니다.

+0

25 개의 양식을 모두 열어야합니까? 양식을 내린 다음 다음 양식을 열어 보았습니까? – CaBieberach

+0

사용자 폼에서 MultiPage 컨트롤을 사용하는 것을 고려 했습니까? 하나의 userform을로드하고 Next 및 Back을 사용하여 MultiPage의 탭을 순환하십시오. –

+0

@CaBieberach : 다음 폼이 열리기 전에 각 폼이 언로드됩니다. 그러나 양식 1에 대해 처리가 중단 된 코드 포인트는 메모리에 남아 있으며 나머지 24 개에도 계속 남아 있습니다. Excel이 코드를 실행하기 위해 되돌아가는 최종 양식이 닫힐 때만입니다 (이 경우에는 그냥 Exit Sub 임) . –

답변

1

아마도 접근 방식을 변경해야합니다. 주기에 루프 형태 및 루프마다 사용자를 누르십시오 "다음 양식"버튼을 열고 주요 모듈 사용에

:

나는 다음을 제안합니다. 모든 형태에서

'This sub in your main Module 
sub ShowAndCyleForms 
    Dim FormName As String 
    Dim MyForm as Object 
    Dim CloseForm as Boolean 

    FormName = "frmMyForm"   

    do while CloseForm=False 
     set MyForm = VBA.UserForms.Add(FormName)   
     MyForm.Show 
     CloseForm=MyForm.CloseStatus 
     FormName=MyForm.strNewForm 
     Unload MyForm 
     Set MyForm = Nothing 
    loop 

end sub 

는 선언 : 다음을 delievers 기능으로 당신의 서브를 수정

Private Sub btnNextForm_Click() 
    CloseStatus=False 
    strNewForm= NextForm(Me.Name) 
    Me.Hide 
End Sub 

: 모든 "다음 양식"버튼에서

Public CloseStatus as Boolean 
Public strNewForm as String 

이 같은 것을 넣어 양식 이름

Sub NextForm(strFormName As String) 
    Dim intCurPos As Integer 

    'Find out which form we are currently on from a list in a range 
    intCurPos = WorksheetFunction.Match(strFormName, Range("SYS.formlist"), 0) 
    If intCurPos = WorksheetFunction.CountA(Range("SYS.formlist")) Then 
     'We want to use the first one 
     intCurPos = 0 
    End If 

    'Get the name of the form to open 
    NewForm = WorksheetFunction.Index(Range("SYS.formlist"), intCurPos + 1) 
    ' 
End Sub 

당신은 또한 O.K를 수정해야합니다. 폼을 언로드하는 대신 폼을 숨기고 CloseStatus를 true로 설정하십시오.

아이디어는 외부에서 모든 양식로드/언로드를 단일 절차로 제어하는 ​​것입니다.

희망 사항은 충분합니다.

+0

이것은 훌륭한 솔루션처럼 보입니다. 메모리가 유지되는지, 충돌하기 전에 루핑 프로세스에 상한이 있는지를 테스트 한 적이 있습니까? – SpyJournal

+0

감사합니다. 이것은 훌륭한 출발처럼 보입니다. 나는 그것이 어떻게 진행되는지보기 위해 테스트 케이스를 할 것이지만 초기 모습에서 문제를 볼 수는 없다. –

+1

첫째, 다시 한번 감사드립니다. 나는 이것을 테스트 케이스에 넣었고, 테스트 케이스와 똑같이 작동한다. 훌륭한. 나중에 온 사람들을위한 메모 - btnNextForm_Click에서 CloseStatus = True는 CloseStatus = False 여야합니다. 더 이상 양식을 표시하지 않으려는 경우에만 CloseStatus = True로 설정하려고합니다. 건배 :) –

관련 문제