質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

2回答

892閲覧

(VBA)検索リストを表示しながら検索をするユーザーフォームの作成

liliy89

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2021/06/25 01:41

●やりたいこと
顧客管理データベースがあり、その更新用に
以下のようなユーザーフォームを作成しました。
右側黄色枠内にデータベースにある顧客情報が一覧で記載され、
その中の情報を選択すると左側の情報が入り、変更できるといったフォームにしたいです。
イメージ説明

●データベース
以下のような項目で、37列目まで続いています。
検索するのは、10列目の団体名で、「株式会社テラテイル」のように
漢字、カタカナ、ひらがな、英語が混在しています。
イメージ説明

●困っていること
黄色枠内に顧客情報を表示させることはできましたが、
「検索画面」の下の白枠内に顧客名を入れてもエラーが出てしまいます。
例えば、データベースに「株式会社テラテイル」という情報があったとして、
検索画面に「てら」といれて検索ボタンを押すと「株式会社テラテイル」という情報が
黄色枠内に表示されるようにしたいです。

●エラーの内容と作成中のコード
データベースのシートの内容を別シート(作業)にコピーし、
条件にあった情報のみを残していくイメージです。
ただ、やりたいことが実現できれば全く違うコードでも問題ありません。
エラーとなる部分を太字に、⇒でエラー内容を記載しています。

Dim data, str As String, strz As String, i As Long, tori As String, furi As String
str = txt検索.Text

str = StrConv(str, vbKatakana) 'カタカナ
str = StrConv(str, vbUpperCase) '大文字
str = StrConv(str, vbWide) '全角

With Sheets("データベース")
If .autfiltermode Then
.Range("A1").autfilter
End If

data = Range("A1").CurrentRegion
End With

Application.ScreenUpdating = False

With Sheets("作業用")
.Cells.Clear
.Range("A1", .Cells(UBound(data), UBound(data, 2))) = data

With .Range("A1").CurrentRegion.Sort_
key1:=.Offset(,10),order1:=xlascending, header:=xlyes,_
key2:=.offset(,11),order3:=xlascending

⇒「構文エラー」と出てしまいます。11列目には先方の担当者名が記載されています。

End With

'余分な行の削除
For i = UBound(data) To 2 Step -1

tori = StrConv(.Cells(i, 10), vbKatakana)
tori = StrConv(tori, vbUpperCase)
tori = StrConv(tori, vbWide)
⇒エラー:参照が不正または不完全です。

furi = StrConv(.Cells(i, 11), vbKatakana)
furi = StrConv(tori, vbUpperCase)
furi = StrConv(tori, vbWide)

If (InStr(tori, str) > 0 Or InStr(furi, str) > 0) = False Then
.Cells(i, 1).EntireRow.Delete
End If

Next i

Erase data
data = .Range("A1").CurrentRegion

End With

With ListBox1
.ColumnCount = -1
.ColumnWidths = "0;0;40;30;60;60;0;0;0;200;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0"
.List = data
End With

Application.ScreenUpdating = True

End Sub

以上となります。
まだマクロを勉強し始めたばかりで基本的なところができていないかもしれません。。
お知恵を貸していただけませんでしょうか・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

構文エラーの方は既に回答が出ているのでもう一つの方を
と言ってもjinojiさんがコメントで答えを出していますが。

VBA

1'StrConvのconversionはbit処理してるからOrで繋げれば同時処理できるんです 2tori = StrConv(Sheets("データベース").Cells(i, 10).Value, vbKatakana Or vbUpperCase Or vbWide)

投稿2021/07/01 16:58

neconekocat

総合スコア443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

とりあえず以下のようにするとエラーは消える。

VBA

1With .Range("A1").CurrentRegion 2 .Sort key1:=.Offset(, 10), order1:=xlAscending, Header:=xlYes, key2:=.Offset(, 11), order3:=xlAscending 3End With

投稿2021/06/25 04:06

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

liliy89

2021/06/28 01:08

回答ありがとうございます。構文エラーは表示されなくなりました。もう1つのエラーの方はいかがでしょうか。「参照が不正または不完全です。」と出てしまい、検索ができません。
jinoji

2021/06/28 04:14

おそらくWith と End With の対応がずれているのだと思います。 .Cells(i, 10)は どのWith句の中にあるつもりで書いていますか?
liliy89

2021/07/16 01:34

返信が遅くなりすみません。実は.cells(i,10)のエラーが表示されなくなった代わりに、.Range("A1", .Cells(UBound(data), UBound(data, 2))) = dataで「型が一致しません」と出てしまいます。。variant型に変更しても同じエラーになります。質問しすぎるのも良くないと思って自力で試行錯誤したのですが、うまくいきませんでした。。
jinoji

2021/07/16 03:36

数行上の data = Range("A1").CurrentRegion を data = .Range("A1").CurrentRegion としたらどうでしょう。
liliy89

2021/07/16 04:23

返信ありがとうございます(;;)エラーは出なくなりましたが、実行するとしばらく固まった後、検索画面には何も表示されません。。参考にしたコードはデータベースにカタカナ表記があるのに対して、私の方はカタカナ、漢字、英字が混ざっているので、並び替えでうまく検索できないのかな・・と思っています。そこで、並び替える方法ではなく、検索する方法を試してみました。(以下のコードです)が、こちらも検索結果が真っ白です。。 前回からデータベースの列番が変わっていて、5列目に担当者名、8列目に組織名があり、例えば検索窓に「田」と打つと、田中さんや田中株式会社など「田」が含まれている行が表示されるイメージです。できれば全部のデータが検索結果(listbox1)が表示されるようにしたいのですが、参考にしたコードのcn+1のところが分からなかったので、一部だけでも表示させたいと手を付けれずにいます。質問ばかりですみません。。 Private Sub CommandButton1_Click() '検索機能 Dim data, str As String Dim lastRow As Long Dim myData, myData2(), myno Dim i As Long, j As Long, cn As Long str = txt検索.Text If str = "" Then MsgBox "検索ワードを入力して下さい。" Exit Sub End If str = StrConv(str, vbKatakana) 'カタカナ str = StrConv(str, vbUpperCase) '大文字 str = StrConv(str, vbWide) '全角 '検索するデータを配列 myData に格納 With Worksheets("データベース") lastRow = .Cells(Rows.Count, 1).End(xlUp).row myData = .Range(.Cells(1, 1), .Cells(lastRow, 8)).Value End With '配列 myData の中で検索で一致したデータをリストボックスに配置 ReDim myData2(1 To lastRow, 1 To 3) For i = LBound(myData) To UBound(myData) If myData(i, 5) Like "*" & txt検索.Value & "*" And myData(i, 8) Like "*" & txt検索.Value & "*" Then cn = cn + 1 myData2(cn, 1) = myData(i, 3) myData2(cn, 2) = myData(i, 5) myData2(cn, 3) = myData(i, 8) End If Next i With ListBox1 .ColumnCount = -1 .ColumnWidths = "30;70;70" .List = myData2 End With End Sub
liliy89

2021/07/16 05:25

検索はなんとか引っかかるようになりました。壁はあと2つです。。 ①検索をクリックしてlistboxに表示された結果をクリックしても左側(組織名や担当者名)に表示されない。(エラー:listプロパティの値を取得できません。引数が無効です) ②検索結果をlistboxに表示させるときはデータベース全てのデータを表示させたい
liliy89

2021/07/16 12:57 編集

上記2点、自己解決しました。 お助け頂きありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問