
インターネットから参照したコードを使用して検索フォームを作成しました。
動くは動くのですが、以下のような不具合が発生してにっちもさっちもいきません。
使用している検索フォームに関連するコードですが、どこがおかしいのでしょうか?
VBA初心者のため、どなたか教えてください。
不具合:テキストボックスで品目の一部分を入力し、データを絞り込むと2列目のデータとタイトルがリストに表示されません
■コード
'フォームを開いた時の処理
Private Sub UserForm_Initialize()
Dim wLastGyou As Long
'最終行番号を取得
wLastGyou = Worksheets("Sheet1").UsedRange.Rows.Count
'リストボックスに「品目」のリストをセット
With ListBox1
.ColumnCount = 2
.ColumnWidths = "100;20"
.ColumnHeads = True
'リストボックスの値にセルA2からA最終行までセット
.RowSource = "Sheet1!A2:B" & wLastGyou
End With
End Sub
'検索用のテキストボックス更新後の処理
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim Obj As Object
Dim wAddST As Variant
Dim wAddress As Variant
Dim wKamoku As Variant
With Worksheets("Sheet1")
'テキストボックスの値が含まれるセルを検索
Set Obj = .Cells.Find(what:=TextBox1.Value, _
LookIn:=xlValues, _
lookat:=xlPart, _
matchbyte:=False)
'検索対象がない場合はメッセージを表示
If Obj Is Nothing Then
MsgBox "対象科目は存在しません。", _
vbOKOnly + vbInformation, "検索"
Else
'リストボックスをクリア
ListBox1.RowSource = ""
'検索にヒットした先頭のセルのアドレスをセット
wAddST = Obj.Address
'検索の繰り返し処理
Do
'検索にヒットしたセルのアドレスをセット
wAddress = Obj.Address
'検索にヒットしたセルの値を取得
wKamoku = .Range(wAddress).Value
'リストボックスに追加
ListBox1.AddItem wKamoku
'次の検索を行う
Set Obj = .Cells.FindNext(Obj)
'最初にヒットしたアドレスと同じ場合は処理を終了
If Obj.Address = wAddST Then Exit Do
Loop
End If
End With
End Sub
'検索リストボックス内のデータをダブルクリックするとシートのデータを選択します。
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim V As String
Dim rngFind As Range
V = Me.ListBox1.Value
With Worksheets("Sheet1").Range("A:A")
Set rngFind = .Find(what:=V, LookIn:=xlValues, _
lookat:=xlWhole, MatchCase:=False, matchbyte:=False)
If Not rngFind Is Nothing Then
.Worksheet.Parent.Activate
.Worksheet.Activate
rngFind.Select
End If
End With
End Sub

No.4ベストアンサー
- 回答日時:
ちょっとだけまずいところが有りましたので、修正します。
'検索用のテキストボックス更新後の処理
Private Sub TextBox1_AfterUpdate()
Dim Obj As Object
Dim wAddST As Variant
Dim wAddress As Variant
Dim wKamoku As Variant
With Worksheets("Sheet1")
'テキストボックスの値が含まれるセルを検索
Set Obj = .Range("A:A").Find(what:=TextBox1.Value, _
LookIn:=xlValues, _
lookat:=xlPart, _
matchbyte:=False)
'検索対象がない場合はメッセージを表示
If Obj Is Nothing Then
MsgBox "対象科目は存在しません。", _
vbOKOnly + vbInformation, "検索"
Else
'検索にヒットした先頭のセルのアドレスをセット
wAddST = Obj.Address
'リストボックスのList列数をセット
'ReDim ListBox1.List(0 To 0, 0 To 2)の替り
ListBox1.List = Range("A1:C1").Value
'リストボックスをクリア
ListBox1.Clear
'検索の繰り返し処理
Do
'検索にヒットしたセルの値を取得
'リストボックスに追加
ListBox1.AddItem Obj.Value
ListBox1.List(UBound(ListBox1.List), 1) = Obj.Offset(, 1).Value
ListBox1.List(UBound(ListBox1.List), 2) = Obj.Row
'次の検索を行う
Set Obj = .Range("A:A").FindNext(Obj)
'最初にヒットしたアドレスと同じ場合は処理を終了
If Obj.Address = wAddST Then Exit Do
Loop
End If
End With
End Sub
'検索リストボックス内のデータをダブルクリックするとシートのデータを選択します。
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Long
i = Me.ListBox1.ListIndex
Worksheets("Sheet1").Activate
On Error Resume Next
Cells(Me.ListBox1.List(i, 2), "A").Select
On Error GoTo 0
End Sub
回答ありがとうございます。
あらためてこうしてコードを修正してもらうと、聞いてよかったと思いました。動作まったく問題ありませんでした。勉強します!
ありがとうございました。
No.3
- 回答日時:
これでどうかな
RowSourceを使用しないで、List を使う。
Private Sub UserForm_Initialize()
Dim wLastGyou As Long
'最終行番号を取得
wLastGyou = Worksheets("Sheet1").UsedRange.Rows.Count
'リストボックスに「品目」のリストをセット
With ListBox1
.ColumnCount = 2
.ColumnWidths = "100;30"
'.ColumnHeads = True 'Listでは使用できない
'リストボックスの値にセルA2からA最終行までセット
.List = Sheets("Sheet1").Range("A2:B" & wLastGyou).Value
'.RowSource = "Sheet1!A2:B" & wLastGyou '使用しない
End With
End Sub
'検索用のテキストボックス更新後の処理
Private Sub TextBox1_AfterUpdate()
Dim Obj As Object
Dim wAddST As Variant
Dim wAddress As Variant
Dim wKamoku As Variant
With Worksheets("Sheet1")
'テキストボックスの値が含まれるセルを検索
Set Obj = .Cells.Find(what:=TextBox1.Value, _
LookIn:=xlValues, _
lookat:=xlPart, _
matchbyte:=False)
'検索対象がない場合はメッセージを表示
If Obj Is Nothing Then
MsgBox "対象科目は存在しません。", _
vbOKOnly + vbInformation, "検索"
Else
'検索にヒットした先頭のセルのアドレスをセット
wAddST = Obj.Address
'リストボックスのList列数をセット
'ReDim ListBox1.List(0 To 0, 0 To 2)の替り
ListBox1.List = Range("A1:C1").Value
'リストボックスをクリア
ListBox1.Clear
'検索の繰り返し処理
Do
'検索にヒットしたセルの値を取得
'リストボックスに追加
ListBox1.AddItem Obj.Value
ListBox1.List(UBound(ListBox1.List), 1) = Obj.Offset(, 1).Value
ListBox1.List(UBound(ListBox1.List), 2) = Obj.Row
'次の検索を行う
Set Obj = .Cells.FindNext(Obj)
'最初にヒットしたアドレスと同じ場合は処理を終了
If Obj.Address = wAddST Then Exit Do
Loop
End If
End With
End Sub
'検索リストボックス内のデータをダブルクリックするとシートのデータを選択します。
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Long
i = Me.ListBox1.ListIndex
If TextBox1.Text = "" Then Exit Sub
Worksheets("Sheet1").Activate
Cells(Me.ListBox1.List(i, 2), "A").Select
End Sub
No.2
- 回答日時:
ListBox1.AddItem wKamoku
これだと、1列目しか設定してないので表示されません。
他にも気になるところはありますが、質問の回答としては、ここを修正する必要がある、となります。
「コンボボックス、複数列、追加」で検索すれば、出てくると思いますよ。
回答ありがとうございます。
検索していろいろ試行錯誤していましたが、自分のレベルでは理解不能でした…ただ、わかる人が見ればこれだけ指摘される修正箇所があるのにはビックリしました。
懲りずに勉強していきます。
ありがとうございました。
No.1
- 回答日時:
まず、気になったとこWorksheets("Sheet1").UsedRange.Rows.Count
これだと行の数になるんで、ここは、
Worksheets("Sheet1").UsedRange.Row
でいいと思います。
BeforeUpdateは更新前処理です。AfterUpdateってイベントが更新後処理になります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) ユーザーフォームの表示を追加したい 2 2023/03/26 23:18
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
【VBA】写真の貼り付けコードが...
-
特定の色のついたセルを削除
-
Excel UserForm の表示位置
-
エクセルVBAで、セル内のテキス...
-
EXCEL VBA 文中の書式ごと複写...
-
エクセルVBA 配列からセルに「...
-
【Excel VBA】一番右端セルまで...
-
VBA:日付を配列に入れ別セルに...
-
Excelで空白セル直前のセルデー...
-
データグリッドビューの結合セ...
-
マウスオーバーでセル内の背景...
-
【VBA】【ユーザーフォーム_Lis...
-
C# DataGridViewで複数選択した...
-
複数指定セルの可視セルのみを...
-
DataGridViewのフォーカス遷移...
-
EXCEL VBA Rangeについて
-
EXCELのフォーム上でリアルタイ...
-
VBA 並べ替え方
-
Rangeの範囲指定限界
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
Excel UserForm の表示位置
-
特定の色のついたセルを削除
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
【VBA】【ユーザーフォーム_Lis...
-
VBA:日付を配列に入れ別セルに...
-
複数指定セルの可視セルのみを...
-
C# DataGridViewで複数選択した...
-
【Excel VBA】マクロで書き込ん...
-
データグリッドビューの結合セ...
-
DataGridViewのフォーカス遷移...
-
Excel 範囲指定スクショについ...
-
【Excel VBA】一番右端セルまで...
-
EXCEL VBA 文中の書式ごと複写...
-
【VBA】写真の貼り付けコードが...
-
QRコード作成マクロについて
-
入力規則のリスト選択
-
CellEnterイベント仕様について
-
エクセル、マクロで番号を読込...
おすすめ情報