- 締切済み
エクセルVBA ユーザーフォーム 検索
現在VBAにてユーザーフォームにて入力したデータをシート1に転記するものを作成しました。 この転記したデータを生かして作業したいと考えております。 データは商品データで A B C E F 商品コード 商品名 区分 単価 備考 となっており ユーザーフォームも TEXTBOX1=A TEXTBOX2=B と言う様になってます。 現在考えているのがこのデータの一部を変更したい場合、コマンドボタンを押すと商品コード入力用boxがでてきて、商品コードを入力するとA列から検索し該当する商品データをユーザーフォーム上に表示するようにしたいのです。 そのデータがA75行にあったとします。 そのユーザーフォーム上で単価を変更した場合検索した行(A75行)にそのまま上書きする様にしたいです。 説明がうまくできてないかも知れませんが、どなたかご教授願います。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- KenKen_SP
- ベストアンサー率62% (785/1258)
返事が遅くなりましたね。申し訳ないです。 全体では、こんな感じですね。 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)
>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)
>商品コード入力用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行)にそのまま上>書きする様にしたいです。 「変更があったとき」と考えると、とたんに難しくなりますね。 「変更があってもなくても上書きする」と考えれば良いと思います。
補足
すみません 下記の様に付け加えてみましたが、その後の上書きはどのようにすればいいのでしょうか? あまり詳しくないので お手数かけてすみません。 また商品コードの検索を完全一致型にできますか? 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