2017-09-03 22 views
0

親愛なるStackoverflowユーザーの皆様、Excel VBA - ユーザーフォームの別のモジュールからループを終了する

小規模なプロジェクトでは、いくつかのモジュールとユーザーフォームがあります。 モジュールでは、ユーザーフォームを呼び出すループ文があります。 ユーザーフォームは、ユーザーに4つの選択肢を提供します。

オプションを選択すると、パブリック変数(文字列)が定義されます。 ループは列内の文字列を埋めるでしょう。 しかし、すべての応答が出る前にループが停止することはありません。

終了ボタンを作成したいと思います。なぜなら、リストが大きければ、これはかなり面倒ですからです。

私はループをキャンセルするために(ユーザーフォームで)クリックできるコマンドボタン "exit"を作成することを考えました。

しかし、このボタンはユーザーフォームになっているので、ループを止めることはなく、ただちに現在のユーザーをシャットダウンしますが、その次は表示されます。

ユーザフォームからループを止める最善の方法をご存知ですか?

私はGotoのようなテクニックを知っていますが、エラー処理にのみ使用し、Gotoをユーザーフォームのサブフォームに配置する必要があり、別のモジュールのトータルループをキャンセルしたいので機能しません。

私はこれにかなり拘束されています。皆さんが私を助けてくれることを願っています。 私はそれが何か簡単だろうと思う。

よろしく、 Dubblej

+0

終了ボタンが別のグローバル変数を設定してみましょう...その後、単にをチェックしますそれはループ内に... –

答えて

0

私はグローバル変数だけでなく、go toステートメントを使用しないようお勧めします。あなたのフォームでは、フォームを表示する機能を追加し、続行したいかどうかをユーザーの選択に戻します。このような何か:

Option Explicit 

Private continue As Boolean 

Public Function ShowDialog() As Boolean 
    Me.Show 1 
    ShowDialog = continue 
End Function 

Private Sub btnCancel_Click() 
    continue = False 
    Me.Hide 
End Sub 

Private Sub btnOK_Click() 
    continue = True 
    Me.Hide 
End Sub 

そして、あなたのモジュールコールShowDialog機能で、その戻り値は、ループを終了falseの場合:

Option Explicit 

Public Sub Sub1() 
    Dim form As New UserForm1 

    Do 
     If Not form.ShowDialog Then 
      Exit Do 
     End If 
    Loop 
End Sub 
+0

@Mehdi Javanありがとう、私はまだ私はVBAを学んでいる、今のところ動作します。ループ内に埋め込まれた別のグローバル変数(ブール値)を探し出しました。 thisoneがfalseの場合、ループは終了します。なぜグローバル変数の使用を避けるべきですか?彼らは今、便利なことができます:) – Dubblej

+0

グローバル変数は、特にコードが大きくなったときに、エラーを起こしやすいです。なぜなら、どこにでもアクセスしたり変更したりすることができ、追跡が困難になるからです。私たちが最初に定義したとき、私たちの意図ははっきりしていますが、最終的には他の目的にも使用される可能性があり、違う使用法が矛盾し、見つけにくいエラーを引き起こす可能性があります。あなたはここで完全な説明を見つけることができます:https://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil –

関連する問題