2016-09-16 9 views
0

メッセージボックス 'ok'ボタンと同じ方法でユーザーフォーム関数を作成する方法を知っている人はいますか?私は説明します。Excel VBAユーザーフォーム 'OK'

スプレッドシートの列のエラーを検出しています。エラーが発見された場合は、次のように、メッセージボックスがポップアップ表示されます:私は「OK」、それは列の次のエラーに行く選択すると

MsgBoxには

「有効なデータを入力してください」。もちろん、メッセージボックスはモーダルであり、アプリケーションをフリーズします。ユーザーがデータを編集し、次のエラーに移動できるようにします。だから、私は非モーダルにすることができるユーザーフォームを設計しました。マクロを次のエラーに進めることを除いて、素晴らしいです。ユーザーがエラーを訂正した場合は、それが実行されます。もしそうでなければ、そのエラーセルに留まります。

私はこれがなぜ起こるのか知っています。私のユーザーフォーム '次へ'ボタンは、最初のエラーを見つけるマクロを呼び出します。しかし、私が知りたいことは、これを回避する方法があるかどうかです。

エラーチェックは、ユーザー入力データが開始される場所であるため、19行目から開始されます。

ここにはスプレッドシートへのリンクが含まれています。モジュール1 'NextValidationError'はうまく動作し、次のエラーに進みます。モジュール14は、解決されるまでエラーでハングします。私はそれをスキップできるようにしたいと思います。

https://www.dropbox.com/s/yqko5kj19pnauc9/Transparency%20Data%20Input%20Sheet%20for%20Indirect%20Spend%20V7%2009212016%20v2%200.xlsm?dl=0

誰も私にモジュール14は、モジュール1のように進行させる方法についてのアドバイスを与えることができますか?このような

+2

ストアの行番号 'r'だけで "次へ" のための "次へ" および "閉じる"

コード - UserForm1の2つのボタンがありますグローバル変数内の最後のエラーの「次へ」をクリックすると、次の行のチェックを開始します。 –

+0

こんにちはティム、助けてくれてありがとう。あなたはおそらくデモンストレーションしたり精緻化できますか? –

答えて

0

何か:

Dim r_start As Long 

Sub CheckNames() 
    Dim r As Long 
    'Dim emptyRow As Boolean 

    If r_start = 0 Then r_start = 19 

    With ActiveSheet 
     For r = r_start To 5000 
      'Checks entire row for data. User may skip rows when entering data. 
      If WorksheetFunction.CountA(.Range(.Cells(r, 1), .Cells(r, 33))) > 0 Then 
       If ((.Cells(r, 2) = "") <> (.Cells(r, 3) = "")) Or _ 
        ((.Cells(r, 2) = "") = (.Cells(r, 4) = "")) Then 

        MsgBox "Please fill in First and Last Name or HCO in Row " & r & "." 

       End If 
      End If 
     Next 
    End With 

End Sub 

私はあなたのコードを-MIS読んでいない限り、あなたはOrとあなたの2つのチェックを組み合わせることができます。

r_startをリセットするには、ユーザーがチェックを済ませたときにフォームを開いたままにしておく必要があります。

編集:ここは非常に基本的な例です。通常のモジュールで

Private Sub CommandButton1_Click() 
    ShowErrors 
End Sub 

Dim r_start As Long 

'this kicks off the checking process 
Sub StartChecking() 
    r_start = 0 
    UserForm1.Show vbModeless 
    ShowErrors 
End Sub 

'a simple example validation... 
Sub ShowErrors() 

    Dim c As Range, r As Long 

    If r_start = 0 Then r_start = 9 

    For r = r_start To 200 
     With ActiveSheet.Rows(r) 
      If Not IsNumeric(.Cells(1).Value) Then 
       UserForm1.lblMsg.Caption = "Cell " & .Cells(1).Address() & " is not numeric!" 
       r_start = r + 1 
       Exit Sub 
      End If 
     End With 
    Next r 

    r_start = 0 

    UserForm1.lblMsg.Caption = "No more errors" 

End Sub 
+0

Tim、MsgBoxをUserForm2.showに置き換えると、それは前進しません。実際には、それは私の元のコードではなかった:(私のUserForm2の2つのボタンは、フォームをアンロードするClose、CheckNamesを呼び出すNextです。この関数の中で何度も呼び出されても問題ありませんか?ここでは密集していて申し訳ありませんが、これはあなたにはっきりと分かります。 –

+0

あなたのユーザーフォームがどのように構造化されているか分からず、あなたがしていることを正確に把握するのが難しい...プロセスの開始を誘発するもの –

+0

もちろん、プロセスはユーザーによってトリガーされます。データが入力されると、ユーザはボタンを選択してデータをチェックする。これは多くの小切手のうちの一つに過ぎませんが、私が働くことができない唯一のものです。 userform2のコードは次のとおりです。ここで、CommandButton1のタイトルは「閉じる」で、プロセスを終了し、CommandButton2は「次へ」というタイトルでCheckNamesを呼び出します。それはまったく意味がありますか? ます。Option Explicit ます。Private Sub CommandButton1_Click() ActiveSheet.Range( "A18")。 –

関連する問題