2017-12-15 12 views
-5

私は過去2日間の回答を探していましたが、これをコード化する方法はまだ分かりません。私はプロジェクトに行くように私はVBAを学んでいますが、私はvb.netコーディングにもっと精通しています。このプロジェクトでは、データを追加/更新/削除する必要があります。更新と削除ボタンのクリックでは、検索された情報がコンボボックスから選択された列の下にあり、テキストボックスにキー入力されているデータがあるという条件を使用してデータを検索する必要があります。VBAのユーザーフォームでコンボボックスとテキストボックスを使用して、アクティブなExcelスプレッドシートのデータを検索して検索するにはどうすればよいですか?

両方の条件を一緒にコーディングする方法がわかりません。私が研究に基づいて得た最も遠いものは、テキストボックスにキーインされたものだけでアクティブシートセルを検索して選択するFindメソッドをコーディングすることです。スプレッドシートを正常に検索するために、テキストボックスにリンクされている条件の1つとしてコンボボックスをコーディングするにはどうすればよいですか?

これは私のコードは、これまでのところです:

Private Sub cmdSearch_Click() 
    Dim strFindWhat As String 
    strFindWhat = TextBox1.Text 

    On Error GoTo ErrorMessage 

    Cells.Find(What:=strFindWhat, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _False).Select 
    Exit Sub 
    ErrorMessage: 
     MsgBox ("The data you are searching for does not exist") 

End Sub 

Private Sub UserForm_Initialize() 
    ComboBox1.List = Application.Transpose(Sheet1.Range("A1:D1").Value) 
End Sub 

スプレッドシート:

SpreadSheet

削除]ボタンをクリックします。検索に使用

Delete Button Click

テキストボックス:

Textbox used for Search

のみ指定された列内のテキストを検索するコンボボックスの状態を実装する必要があります。

Need to implement the combobox condition to search text only within the column specified

+4

*これはこれまでのコードです*遠く... – JohnyL

+1

コードはどこですか? –

+0

申し訳ありません私のコードを置く前に偶然私の投稿を作成しました。私はちょうどそれを追加した。 – Destiny

答えて

0

だから、彼女が新しいソリューションです。 UserForm1モジュールで3つのPublic変数を宣言する必要があります。したがって、USerFormが開いている間に値を指定し、検索ボタンで複数のTimesをクリックするとNaxt値を検索できます。

'Public Variables 
    Public bolFirstSearch As Boolean 
    Public rng As Excel.Range 
    Public cellFound As Excel.Range 

Private Sub ComboBox1_Change() 
    bolFirstSearch = False 
End Sub 

Private Sub CommandButton1_Click() 
Dim strFindWhat As String 
Dim intRowCB As Integer 

On Error GoTo ErrorMessage 
If UserForm1.bolFirstSearch = False Then 

    strFindWhat = TextBox1.Text 
    intRowCB = Cells.Find(What:=ComboBox1.value, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Column 
    Set rng = Columns(intRowCB) 
    rng.Select 
     Set cellFound = rng.Find(What:=strFindWhat, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 
     cellFound.Select 
Else 

    Set cellFound = rng.FindNext(cellFound) 
    cellFound.Select 
End If 
UserForm1.bolFirstSearch = True 
Exit Sub 
ErrorMessage: 

MsgBox ("The data you are searching for does not exist") 
End Sub 

Private Sub UserForm_Initialize() 
    ComboBox1.List = Application.Transpose(Sheet1.Range("A1:D1").Value) 
    bolFirstSearch = False 
End Sub 

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 
    bolFirstSearch = False 
End Sub 
+0

このコードはほとんど機能しましたが、検索を続行しようとしたときにクリックしても動きませんでした。これは、キー付きテキストで列の最初の値を見つけるためにコード化されただけで、列を検索し続けることはありません。だから私は検索のクリックをクリックし続けると、それを連続検索にする方法がわかりません。 – Destiny

+0

@Destiny ok。私は自分の答えを更新しました。これがうまくいくことを願って – Moosli

+0

これはもう一度やり直しましたが、何らかの理由で列内に見つかったデータを入力して見つけた場合は、その列内にないデータを入力すると、エラーメッセージ以前に見つかった結果が強調表示されます。エラーメッセージをどこに配置するかを修正する必要があるかどうかはわかりません。 – Destiny

0
Public Sub FindValueInColumn(bolDelete As Boolean, strColumnText As String, _ 
           strSearchValue As String, strSheetName) 

    Dim intColumnIndex As Integer 
    Dim rngSearchRange As Range 

    On Error Goto ErrHandler 

    'Find Column Index 
    With ThisWorkbook.Worksheets(strSheetName) 
     Set rngSearchRange = .Range("A1", .Cells(1, Columns.Count).End(xlToLeft)).Find(What:=strColumnText, lookat:=xlWhole) 
    End With 

    If Not rngSearchRange Is Nothing Then 
     intColumnIndex = rngSearchRange.Column 
    End If 

    If intColumnIndex > 0 then 
     'Find value in specified column 
     With ThisWorkbook.Worksheets(strSheetName) 
      Set rngSearchRange = .Range(.Cells(1, intColumnIndex),.Cells(Rows.Count, intColumnIndex).End(xlUp)).Find(What:=strSearchValue, lookat:=xlPart) 
     End With 

     If rngSearchRange Is Nothing Then 
      MsgBox "Value not found." 
     Else 
     If bolDelete Then 
      rngSearchRange.ClearContents 
     Else 
      rngSearchRange.Select 
     End 
    Else 
     MsgBox "Column not Found" 
    End If 
Exit sub 

ErrHandler: 
    MsgBox "Something went wrong there." 
    On Error Goto 0 
End Sub 

これは基本的に2つのジョブアクションです:その列の中に検索値を見つけ、その後、あなたのターゲット列を検索します。ボタンからサブを呼び出すだけです。削除ボタンからbolDeletetrueとし、検索ボタンからfalseとします。

一般的なヒント:エラーハンドラは良い習慣ですが、機能を達成するためにエラーを発生させることは(少なくとも適切なテストでは避けることができる)ものではありません。また、VBAでは選択は不要であり、不要なオーバーヘッドを作成します。

これは、コードの残りの部分がわからないため、すべてを説明するものではありません。私はこれを参照として使用し、それをコピーして実装するのではなく、実装することをお勧めします。

関連する問題