[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フィルターのVBAについて』(ちゃお)
すいません、VBA初心者です。
ユーザーフォームを作り、一覧表にフィルターがかかるVBAを作ろうとしているのですが、
実行しようとするとエラー(オブジェクトが必要です)が発生してしまいます。
ユーザーフォームはテキストボックスとコマンドボタンがあり、コマンドボタンを押すと、テキストボックス内の言葉でフィルターをかけてくれるものを目指してます。
エラーの理由と解決方法をどなたか教えて頂けないでしょうか?
(VBA)
Sub 検索()
If UserForm1.Box1.Text <> "" Then Range("A1").AutoFilter 1, "*" & UserForm.Box1.Text & "*" ⬅️ここで実行時エラー424 Else Range("A1").AutoFilter 1 End If
End Sub
< 使用 Excel:Excel2019、使用 OS:Windows10 >
私のコメントはスルーして下さい。
すみませんでした。
m(__)m
(隠居Z) 2022/04/29(金) 08:13
Private Sub TextBox1_Change()
'テキストボックスの内容が変化したときに実行するコード
Dim lstDat As Variant
Dim buf As String, bufLen As Integer
Dim rowEnd As Long
Dim i As Long
'D列の最終行を調べ、変数lstDatにD列の値を格納
With ThisWorkbook.Worksheets("表示マスタ")
rowEnd = .Cells(Rows.Count, 1).End(xlUp).Row
lstDat = Worksheets("表示マスタ").Range(.Cells(1, 1), .Cells(rowEnd, 1)).Value
End With
'テキストボックスの内容と文字数を変数buf,bufLenに格納
buf = Me.TextBox1
bufLen = Len(buf)
'リストボックスの内容を初期化
Me.ListBox1.Clear
'テキストボックスの文字数が0の場合終了
If bufLen = 0 Then Exit Sub
'テキストボックスの内容とlstDatの内容を比較する
For i = 1 To rowEnd
'一致した場合にリストボックスに値を追加する
If buf = Left(lstDat(i, 1), bufLen) Then
Me.ListBox1.AddItem lstDat(i, 1)
End If
Next i
End Sub
ここでの表示マスタはテキストボックスに入力された文字を検索する候補を保管しておくシートです。
こんな感じでできますでしょうか?
(ぶんぶん) 2022/04/29(金) 08:29
UserForm.Box1? ↑ ・・・・.Box1 というのは存在しません。 プロパティウィンドウでオブジェクト名はどうなっていますか。 デフォルトでは TextBox1 です。
こちらでは コンパイルエラー: メソッドまたはデータメンバがみつかりません。 と表示されます。
(nm) 2022/04/29(金) 09:20
>エラーの理由と解決方法をどなたか教えて頂けないでしょうか? >Range("A1").AutoFilter 1, "*" & UserForm.Box1.Text & "*" ⬅️ここで実行時エラー424
エラーの箇所をよく眺める事です。(隠居Z)さんが言ってる…まずは ココ UserForm ← "1" が無い
Sub 検索_Click() If UserForm1.Box1.Text <> "" Then Range("A1").AutoFilter 1, "*" & UserForm1.Box1.Text & "*" Else Range("A1").AutoFilter 1 End If End Sub
(あみな) 2022/04/29(金) 10:49
あみなさん 実行してみましたか。 「.Box1」の所でエラーが出ませんか。 UserForm1.Box1.Text は構文が間違っているんですよ。 デフォルトだと TextBox1.Text ですよね。 なぜ「.」が2個あるんですか。 「UserForm1.Box1.Text 」を「TextBox1.Text」に変更して実行してみれば分かりますよ。
(nm) 2022/04/29(金) 11:41
(nm)さん
(ちゃお)さんが、デフォルトでは TextBox1を、オブジェクト名を Box1 に 変更した事を想定しています。
実際には、本当に間違いなのか? は、わかりません^^; デフォルトだと TextBox1.Text です
表を適当に作ってテストしましたが、(あみな) 2022/04/29(金) 10:49 のコードで エラーは、でませんでした。
田んぼの”田”でも検索してみたw
|[A] |[B] |[C] |[D] [1]|社員名 |性別|年齢|部署 [2]|堀 晃司 |男 | 45|営業部 [3]|米田 沙耶|男 | 55|総務部 [4]|斎藤 由樹|女 | 28|経理部 [5]|仲田 俊二|男 | 48|営業部 [6]|永野 陽子|女 | 38|総務部
(あみな) 2022/04/29(金) 11:55
>(あみな) 2022/04/29(金) 10:49 のコードで >エラーは、でませんでした。 こちらではエラーが出ます。 TextBox のオブジェクト名を UserForm1 として UserForm1.Box1.Text を UserForm1.Text とするとエラーは出ません。
質問者の返信を待つことにします。
(nm) 2022/04/29(金) 15:46
条件1.
(ちゃお)さんが、デフォルトでは TextBox1を、オブジェクト名を Box1 に 変更した事を想定しています。
条件2.( 質問者さんが言うには )
>ユーザーフォームはテキストボックスとコマンドボタンがあり、コマンドボタンを押すと >テキストボックス内の言葉でフィルターをかけてくれるものを目指してます。
ユーザーフォームに、コマンドボタンを設置して 標準モジュールにマクロを記載するとは考えにくい。 標準モジュールのコードなら、(ax)さんのおっしゃるとおりですね。
ユーザーフォームモジュールにマクロはあるのが一般的だと思うのですが つまり、CommandButton1_Click オブジェクト名を "検索"にしている
ただ、質問者さんの最初のコードで、Sub 検索() だと ユーザーフォームを立ち上げる時点でエラーがでます。 なので、私は、Sub 検索_Click() としました。
Range("A1").AutoFilter 1, "*" & UserForm.Box1.Text & "*" は、 ユーザーフォームモジュールなら
TextBox1 がデフォルトなら、下記のように書くのが普通ですが .AutoFilter Field:=1, Criteria1:="*" & Me.TextBox1.Text & "*" Meが、UserForm1でも、エラーはでないのはご存知のとおりです。
(nm)さんの 2022/04/29(金) 15:46 での返信ですが (あみな) 2022/04/29(金) 10:49 のコードで
>こちらではエラーが出ます。
エラーがでますか?ちょいと検証をいろいとしてみます。
(あみな) 2022/04/29(金) 17:39
エラーにならんと思うがな、(nm)氏がなるってか?
>素直に TextBox1.Text でいいんじゃん。
(テキスト) 2022/04/29(金) 21:03
Me.とするとだ、インテリセンス(自動メンバー表示)が使用出来る
入力支援ってやつだな〜使うかどうかは自由だが
入力間違いが減るし、楽になるのはいいぜ(習慣化をするメリット)
《 インテリセンスについて 》
https://excel-ubara.com/excelvba3/EXCELFORM007.html
https://vbae.odyssey-com.co.jp/column3/s33003.html
https://atmarkit.itmedia.co.jp/ait/articles/1712/01/news149_2.html
それよりなんだい
>質問者の返信を待つことにします。
(nm) 2022/04/29(金) 15:46
>TextBox のオブジェクト名を UserForm1 として
>UserForm1.Box1.Text を UserForm1.Text とするとエラーは出ません。
エラーが出る、出ないの問題よりも
俺は、天地がひっくり返っても
TextBox のオブジェクト名を UserForm1 とする事はしない
エラーになるなら、その場所と説明をしたらどうだ
質問者には、そうやって言うだろ
>私のはちょい意図が違いましたかね。
>失礼しました。
(ぶんぶん) 2022/04/30(土) 10:10
ご参考なんだから、気にする事はないと思うぜ
だが、どうせ載せるならインデントくらいは入れてくれ(読みにくい)
とだ、質問者のマクロに近い形で書いてやると、良いかもだ
少し丁寧に書くとか、似せて書くとかだ
Option Explicit Dim wb As Workbook Dim ws As Worksheet Dim LastRow As Long Private Sub CommandButton1_Click()
Set wb = Workbooks("一覧表.xlsm") Set ws = wb.Sheets(1) LastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
With ws.Range(ws.Cells(1, "A"), ws.Cells(LastRow, "M")) If Me.TextBox1.Text <> "" Then .AutoFilter Field:=1, Criteria1:="*" & Me.TextBox1.Text & "*" Else .AutoFilter Field:=1 End If End With
End Sub
動けばなんでもいいんだがな(結論)
>私のコメントはスルーして下さい。
>すみませんでした。
m(__)m
(隠居Z) 2022/04/29(金) 08:13
なんで撤回しとんのじゃろ
的確に言うとんねん
質問者の言うエラーは、合っているかわからへんて
(大阪の、たこ焼き) 2022/04/30(土) 13:08
ただ単に「UserForm」の後ろに「1」が抜けておりました。
そこを修正すれば、正常に機能しました。ありがとうございます。
ユーザーフォームのテキストボックスはBox1としておりました。
他の回答者の方々も、こちらの説明不足にも関わらず、色々と予測した上でご回答頂き、
ありがとうございます。
非常に勉強になりました。
皆々様、ありがとうございました。
(ちゃお) 2022/04/30(土) 23:01
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.