• 締切済み

エクセルVBA ユーザーフォーム 検索

現在VBAにてユーザーフォームにて入力したデータをシート1に転記するものを作成しました。 この転記したデータを生かして作業したいと考えております。 データは商品データで A    B C E F 商品コード 商品名  区分  単価  備考 となっており ユーザーフォームも TEXTBOX1=A TEXTBOX2=B と言う様になってます。 現在考えているのがこのデータの一部を変更したい場合、コマンドボタンを押すと商品コード入力用boxがでてきて、商品コードを入力するとA列から検索し該当する商品データをユーザーフォーム上に表示するようにしたいのです。 そのデータがA75行にあったとします。 そのユーザーフォーム上で単価を変更した場合検索した行(A75行)にそのまま上書きする様にしたいです。 説明がうまくできてないかも知れませんが、どなたかご教授願います。

みんなの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

返事が遅くなりましたね。申し訳ないです。 全体では、こんな感じですね。 CommandButton1 で検索用 InputBox 呼び出し CommandButton2 で更新ボタン としています。 Dim FoundCell As Range '商品コード検索ボタンクリック Private Sub CommandButton1_Click()      Dim SerchKey As String   Dim SerchArea As Range      '検索語入力   SearchKey = Application.InputBox( _   Prompt:="商品コードを入力", Type:=2)   If SearchKey = "" Or SearchKey = "False" Then     Exit Sub   End If        '検索範囲(シート名も指定した方が良いでしょう)   Set SearchArea = Sheets("Sheet1").Range(Range("A1"), Range("A1").End(xlDown))      '検索処理(引数:LookAt に xlWhole で完全一致   Set FoundCell = SearchArea.Find( _     What:=SearchKey, _     SearchOrder:=xlByRows, _     LookAt:=xlWhole, _     MatchCase:=False)   '商品コードが無い場合の処理   If FoundCell Is Nothing Then     MsgBox "見つかりません", vbCritical     GoTo ExitHandler   End If   '見つかった場合の処理   With FoundCell     Me.TextBox1.Value = .Value     Me.TextBox2.Value = .Offset(0, 1).Value     Me.TextBox3.Value = .Offset(0, 2).Value     Me.TextBox4.Value = .Offset(0, 3).Value     Me.TextBox5.Value = .Offset(0, 4).Value   End With    ExitHandler:   Set SearchArea = Nothing   Exit Sub End Sub    '更新ボタンクリック Private Sub CommandButton2_Click()   With FoundCell     .Value = Me.TextBox1.Value     .Offset(0, 1).Value = Me.TextBox2.Value     .Offset(0, 2).Value = Me.TextBox3.Value     .Offset(0, 3).Value = Me.TextBox4.Value     .Offset(0, 4).Value = Me.TextBox5.Value   End With   MsgBox "更新しました", vbInformation End Sub 'フォームを閉じるときにオブジェクト変数を解放 Private Sub UserForm_Terminate()   Set FoundCell = Nothing End Sub

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

>TEXTBOX1=A TEXTBOX2=B これは、A列、B列という意味でしょうか? 意味不明です。 >そのユーザーフォーム上で単価を変更した場合検索した行(A75行)にそのまま上書きする様にしたいです 単価の表示用のTextBox は、どこにしたらよいのでしょうか? 例えば、CommandButton1 ,CommandButton2 を、 こんな風にしたらどうでしょうか? Dim rng As Range Private Sub CommandButton1_Click() '検索用ボタン Dim ans As Variant  ans = InputBox("商品コードを入力してください", "商品コード入力")  If VarType(ans) = vbBoolean Then Exit Sub  Set rng = Columns(1).Find(ans, LookIn:=xlValue)  If Not rng Is Nothing Then   TextBox1.Value = rng.Value 'コード表示   TextBox2.Value = rng.Offset(, 3).Value '単価表示  Else  MsgBox "目的のコードが見つかりません", 16  End If End Sub Private Sub CommandButton2_Click() '変更決定ボタン   rng.Value = TextBox1.Value 'コード表示   rng.Offset(, 3).Value = TextBox2.Value '単価表示   Set rng = Nothing End Sub 回答側からすると、今ひとつ分からない部分があるので、後は、ご自身で工夫してください。 もう少し、コードの情報とかが書かれていれば、違ったコードになると思います。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

>商品コード入力用boxがでてきて、商品コードを入力するとA列から検索し >該当する商品データをユーザーフォーム上に表示するようにしたいのです。 商品コード検索の結果、該当するセルのアドレスさえわかれば、あとは大丈夫ですよね。下記VBAでオブジェクト変数 FoundCell は「発見したセル」そのものが返されています。つまり、 商品コード は FoundCell.Value 商品名 は FoundCell.Offset(0,1).Value 区分 は FoundCell.Offset(0,2).Value ・・・ こんな感じで取得できます。これを TextBox コントロールに書込めば良いでしょう。 ちなみに、以下はサンプルですから、Msgboxで表示するだけです。 Sub Sample()   Dim SerchKey As String   Dim SerchArea As Range   Dim FoundCell As Range   '検索語入力   SearchKey = Application.InputBox( _     Prompt:="商品コードを入力", Type:=2)   If SearchKey = "" Or SearchKey = "False" Then     Exit Sub   End If   '検索処理   '検索範囲   Set SearchArea = Range(Range("A1"), Range("A1").End(xlDown))   Set FoundCell = SearchArea.Find( _     What:=SearchKey, _     SearchOrder:=xlByRows, _     MatchCase:=False)   '商品コードが無い場合の処理   If FoundCell Is Nothing Then     MsgBox "見つかりません", vbCritical     GoTo ExitHandler   End If   '見つかった場合の処理   MsgBox FoundCell.Address ExitHandler:   Set SearchArea = Nothing   Set FoundCell = Nothing   Exit Sub    End Sub >そのデータがA75行にあったとします。 >そのユーザーフォーム上で単価を変更した場合検索した行(A75行)にそのまま上>書きする様にしたいです。 「変更があったとき」と考えると、とたんに難しくなりますね。 「変更があってもなくても上書きする」と考えれば良いと思います。

a32
質問者

補足

すみません 下記の様に付け加えてみましたが、その後の上書きはどのようにすればいいのでしょうか? あまり詳しくないので お手数かけてすみません。 また商品コードの検索を完全一致型にできますか? 1111の商品コードがあった場合 1だけでも検索出来てしまうので 完全一致型にしたいです よろしくお願いいたします。 Private Sub CommandButton1_Click() Dim SerchKey As String Dim SerchArea As Range Dim FoundCell As Range '検索語入力 SearchKey = Application.InputBox( _ Prompt:="商品コードを入力", Type:=2) If SearchKey = "" Or SearchKey = "False" Then Exit Sub End If '検索処理 '検索範囲 Set SearchArea = Range(Range("A1"), Range("A1").End(xlDown)) Set FoundCell = SearchArea.Find( _ What:=SearchKey, _ SearchOrder:=xlByRows, _ MatchCase:=False) '商品コードが無い場合の処理 If FoundCell Is Nothing Then MsgBox "見つかりません", vbCritical GoTo ExitHandler End If '見つかった場合の処理 MsgBox FoundCell.Address UserForm1.TextBox1.Value = FoundCell.Value UserForm1.TextBox2.Value = FoundCell.Offset(0, 1).Value UserForm1.TextBox3.Value = FoundCell.Offset(0, 2).Value UserForm1.TextBox4.Value = FoundCell.Offset(0, 3).Value ExitHandler: Set SearchArea = Nothing Set FoundCell = Nothing Exit Sub End Sub

関連するQ&A