2017-10-07 3 views
0

複数の値を検索するために検索ボックスを設定しようとしました。複数のワークシートの値を検索し、次のエラーなしエラーの場合

値が見つかると、ワークシートの列が表示されます。 OKをクリックして次のワークシートで検索を続行するか、Cancelをクリックして検索を終了します。私はこの部分が働いていると信じています。

ただし、値が見つからない場合は、すべてのワークシートを検索し、検索の最後にメッセージボックス "Not found"を返すことを願っています。私はそれを行う正しい方法を働かせることはできませんし、 "次のないために"としてエラーメッセージを表示します。

可能であれば、「見つからない」部分(それ以外の部分の後ろ)を修正してください。

Private Sub CommandButton1_Click() 
    Dim ws As Worksheet 
    Dim Search As String 
    Search = TextBox1.Text 

    For Each ws In ThisWorkbook.Worksheets 

     Dim r As Range 
     Dim f1 As Range 

     If ws.Name = "SELECTOR" Then GoTo nws 

     Set r = ws.Cells.Find(What:=Search, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 'finds first match 


     If Not r Is Nothing Then 

      Application.Goto (Sheets(ws.Name).Range(r.Address)) 
     If MsgBox("found on " & ws.Name, vbOKCancel) = vbCancel Then 
      Exit Sub 
     End If 
      Set f1 = r 

      Do While Not r Is Nothing 
       Set r = ws.Cells.FindNext(r) 

       If f1.Address = r.Address Then GoTo nws 
       Application.Goto (Sheets(ws.Name).Range(r.Address)) 
       If MsgBox("found on " & ws.Name, vbOKCancel) = vbCancel Then 
      Exit Sub 
      End If 
      Loop 

     Else 
      If MsgBox("not found on " & ws.Name, vbOKCancel) = vbCancel Then 
      Exit Sub 
     End If 
     nws: 
     Set r1 = Nothing 
     Next ws 
End Sub 

答えて

0

あなたのコードの一貫性のインデントを使用している場合は、不足しているEnd Ifがあることがわかります。それに合わせて、適切なインデントレベルにありませんForNext ws渡って来るのでそれは、コンパイラを混乱:

Private Sub CommandButton1_Click() 
    Dim ws As Worksheet 
    Dim Search As String 
    Search = TextBox1.Text 

    For Each ws In ThisWorkbook.Worksheets 

     Dim r As Range 
     Dim f1 As Range 

     If ws.Name = "SELECTOR" Then GoTo nws 

     Set r = ws.Cells.Find(What:=Search, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 'finds first match 


     If Not r Is Nothing Then 

      Application.Goto (Sheets(ws.Name).Range(r.Address)) 
      If MsgBox("found on " & ws.Name, vbOKCancel) = vbCancel Then 
       Exit Sub 
      End If 
      Set f1 = r 

      Do While Not r Is Nothing 
       Set r = ws.Cells.FindNext(r) 

       If f1.Address = r.Address Then GoTo nws 
       Application.Goto (Sheets(ws.Name).Range(r.Address)) 
       If MsgBox("found on " & ws.Name, vbOKCancel) = vbCancel Then 
        Exit Sub 
       End If 
      Loop 

     Else 
      If MsgBox("not found on " & ws.Name, vbOKCancel) = vbCancel Then 
       Exit Sub 
      End If 
nws: 
      Set r1 = Nothing 
     Next ws '<-- This has no matching For, but really you are missing an End If 
       ' (Probably meant to be an End If just before your nws label 
       '  in order to close your If Not r Is Nothing Then statement) 
End Sub 

あなたはEnd Ifは(その事実に基づくたい場所にとしての私の「最良の推測」あなたは)そのEnd Ifが欠落しているIf前にGoTo nwsを持っているので、あなたのコードの最後の部分を作り、ちょうどnws:ラベルの前にある:

 Else 
      If MsgBox("not found on " & ws.Name, vbOKCancel) = vbCancel Then 
       Exit Sub 
      End If 
     End If 
nws: 
     Set r1 = Nothing 
    Next ws 
End Sub 

注:

  • あなたはSet r1 = Nothing声明を持っていますが、あなたが宣言されていないか、どこか他の変数r1を使用したことがありません。

  • という文を2度使用すると、Application.Goto Sheets(ws.Name).Range(r.Address).Valueに相当します。 Application.Goto Sheets(ws.Name).Range(r.Address)(かっこなし)を使用したいと考えています。Application.GoTo rに簡略化することができます。

+0

こんにちはYowE3k、私はnwsラベルの前にEnd Ifを持っています。別のEnd Ifを追加する必要があるのですか?多くのおかげです。 –

+0

@JDing現在の 'End If'は' If wsName、vbOKCancelで見つからない場合は 'MsgBoxを閉じます= vbCancel Then'ステートメントです。 'If​​ Not r Is Nothing Then'ステートメントを閉じるには余分なものが必要です。私がインデントしたときにコードを見ると、 'Not Not r Is Nothing Then'と' Else'の両方が同じインデントで始まり、 'End If'は同じインデントレベルで開始しません。 – YowE3K

+1

@JDingまた、[Rubberduck](http://rubberduckvba.com)(他の高VBA回答者の1人であるオープンソースのVBIDEアドインプロジェクト)(https:///stackoverflow.com/users/1188513/mats-mug)管理)。それを使用すると、コードのインデントに役立ち、この種の問題を防ぐのに役立ちます。 – YowE3K

関連する問題