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.Show 行に到達するたびに完了せず、メモリに残っているためだと思います。

モードレス フォームはこの問題を回避しますが、ユーザーは他のフォームを読み込んで、重大な問題を引き起こす他のことを行う可能性があります。

これに役立つ提案はありますか?コードの実行を強制するが、フォームのモーダル機能を停止しない方法はありますか?

ロングショットですが、助けていただければ幸いです。

4

1 に答える 1

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

すべてのフォームで、次のように宣言します。

Public CloseStatus as Boolean
Public strNewForm as String

すべての「次のフォーム」ボタンに、次のようなものを入れます。

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

次のフォーム名を提供する関数になるようにサブを変更します

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

また、フォームをアンロードして CloseStatus を true に設定する代わりに、フォームを非表示にするように OK を変更する必要があります。

アイデアは、フォームの外部からのロード/アンロードを単一の手順ですべて制御することです。

それが十分に明確であることを願っています。

于 2010-12-13T14:40:32.153 に答える